exiftool_vendored 12.41.0 → 12.50.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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +209 -6
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +115 -96
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +71 -33
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/DJI.pm +60 -1
  19. data/bin/lib/Image/ExifTool/DNG.pm +8 -2
  20. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  21. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  22. data/bin/lib/Image/ExifTool/Exif.pm +26 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  25. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  26. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  27. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  28. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +11 -11
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  34. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  35. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  36. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  37. data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
  38. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  39. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  40. data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
  41. data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  42. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  43. data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
  44. data/bin/lib/Image/ExifTool/PDF.pm +2 -1
  45. data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
  46. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  47. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  48. data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
  49. data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
  50. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  51. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  52. data/bin/lib/Image/ExifTool/README +13 -3
  53. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  54. data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
  55. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  56. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  57. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  58. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  59. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  60. data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
  61. data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
  62. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  63. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  64. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  65. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  68. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  69. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  70. data/bin/lib/Image/ExifTool/Writer.pl +14 -6
  71. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  72. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  73. data/bin/lib/Image/ExifTool.pm +120 -33
  74. data/bin/lib/Image/ExifTool.pod +83 -69
  75. data/bin/perl-Image-ExifTool.spec +43 -43
  76. data/lib/exiftool_vendored/version.rb +1 -1
  77. metadata +9 -4
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::Sigma;
18
18
 
19
- $VERSION = '1.27';
19
+ $VERSION = '1.29';
20
20
 
21
21
  sub ProcessX3FHeader($$$);
22
22
  sub ProcessX3FDirectory($$$);
@@ -385,14 +385,14 @@ sub WriteX3F($$)
385
385
  my ($et, $dirInfo) = @_;
386
386
  my $raf = $$dirInfo{RAF};
387
387
  my $outfile = $$dirInfo{OutFile};
388
- my ($outDir, $buff, $ver, $entries, $dir, $outPos, $index, $didContain);
388
+ my ($hdr, $buff, $ver, $entries, $dir, $outPos, $index, $didContain, %order, @order);
389
389
 
390
390
  $raf->Seek($$dirInfo{DirStart}, 0) or return 'Error seeking to directory start';
391
391
 
392
392
  # read the X3F directory header (will be copied directly to output)
393
- $raf->Read($outDir, 12) == 12 or return 'Truncated X3F image';
394
- $outDir =~ /^SECd/ or return 'Bad section header';
395
- ($ver, $entries) = unpack('x4V2', $outDir);
393
+ $raf->Read($hdr, 12) == 12 or return 'Truncated X3F image';
394
+ $hdr =~ /^SECd/ or return 'Bad section header';
395
+ ($ver, $entries) = unpack('x4V2', $hdr);
396
396
 
397
397
  # do sanity check on number of entries in directory
398
398
  return 'Invalid X3F directory count' unless $entries > 2 and $entries < 20;
@@ -400,12 +400,16 @@ sub WriteX3F($$)
400
400
  unless ($raf->Read($dir, $entries * 12) == $entries * 12) {
401
401
  return 'Truncated X3F directory';
402
402
  }
403
- # do a quick scan to determine the offset of the first data subsection
403
+ # do a quick scan to determine the offset of the first data subsection,
404
+ # and the order in which the actual data is stored in the file
404
405
  for ($index=0; $index<$entries; ++$index) {
405
406
  my $pos = $index * 12;
406
407
  my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
407
408
  # remember position of first data subsection
408
409
  $outPos = $offset if not defined $outPos or $outPos > $offset;
410
+ # save the order of the data
411
+ $order{BAD} = 1 if defined $order{$offset};
412
+ $order{$offset} = $index;
409
413
  }
410
414
  # copy the file header up to the start of the first data subsection
411
415
  unless ($raf->Seek(0,0) and $raf->Read($buff, $outPos) == $outPos) {
@@ -413,8 +417,25 @@ sub WriteX3F($$)
413
417
  }
414
418
  Write($outfile, $buff) or return -1;
415
419
 
416
- # loop through directory, rewriting each section
417
- for ($index=0; $index<$entries; ++$index) {
420
+ # this is a bit tricky/unfortunate: the current version of Sigma Photo Pro
421
+ # (2022-10-18) is sensitive to the order of the data sections, and these may
422
+ # differ from the order of their respective entries in the footer. To patch
423
+ # this, instead of looping through the footer sections in order, we process
424
+ # them in the order of the offsets they contain, writing their referenced data
425
+ # sequentially as we go. This preserves both the order of the data sections
426
+ # and the order of the footer entries. (Note that the upcoming release of
427
+ # Sigma Photo Pro will fix this issue at their end, but this patch will remain
428
+ # to maintain backward compatibilty with older SPP versions.)
429
+ if ($order{BAD}) {
430
+ # (this could perhaps happen if any of the sections is ever zero-length)
431
+ $et->Error('Double-referenced data in footer directory!', 1);
432
+ @order = ( 0 .. $entries-1 );
433
+ } else {
434
+ @order = map $order{$_}, sort { $a <=> $b } keys %order;
435
+ }
436
+
437
+ # loop through footer directory, rewriting each section
438
+ foreach $index (@order) {
418
439
 
419
440
  my $pos = $index * 12;
420
441
  my ($offset, $len, $tag) = unpack("x${pos}V2a4", $dir);
@@ -450,6 +471,8 @@ sub WriteX3F($$)
450
471
  return -1 if $success < 0;
451
472
  # (this shouldn't happen unless someone tries to delete the EXIF...)
452
473
  return 'EXIF segment must come first in X3F JpgFromRaw' unless $newData =~ /^\xff\xd8\xff\xe1/;
474
+ # trim off any extra null bytes (since section length includes padding -- silly Sigma)
475
+ $newData =~ s/\0+$//;
453
476
  # write new data if anything changed, otherwise copy old image
454
477
  my $outPt = $$et{CHANGED} ? \$newData : \$buff;
455
478
  Write($outfile, $$outPt) or return -1;
@@ -468,20 +491,21 @@ sub WriteX3F($$)
468
491
  # copy data for this subsection
469
492
  Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F directory';
470
493
  }
471
- # add directory entry and update output file position
472
- $outDir .= pack('V2a4', $outPos, $len, $tag);
473
- $outPos += $len;
474
494
  # pad data to an even 4-byte boundary
495
+ # (stored length includes padding! ref Sigma engineer Yuki Miyahara)
475
496
  if ($len & 0x03) {
476
497
  my $pad = 4 - ($len & 0x03);
477
498
  Write($outfile, "\0" x $pad) or return -1;
478
- $outPos += $pad;
499
+ $len += $pad;
479
500
  }
501
+ # update footer entry with new offset/size
502
+ substr($dir, $pos, 8) = pack('V2', $outPos, $len);
503
+ $outPos += $len;
480
504
  }
481
505
  # warn if we couldn't add metadata to this image (should only be SD9 or SD10)
482
506
  $didContain or $et->Warn("Can't yet write SD9 or SD10 X3F images");
483
507
  # write out the directory and the directory pointer, and we are done
484
- Write($outfile, $outDir, pack('V', $outPos)) or return -1;
508
+ Write($outfile, $hdr, $dir, pack('V', $outPos)) or return -1;
485
509
  return undef;
486
510
  }
487
511
 
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.50';
37
+ $VERSION = '3.55';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -154,7 +154,12 @@ sub PrintInvLensSpec($;$$);
154
154
  32866 => 'Sony FE 24mm F2.8 G', #IB
155
155
  32867 => 'Sony FE 40mm F2.5 G', #IB
156
156
  32868 => 'Sony FE 50mm F2.5 G', #IB
157
+ 32871 => 'Sony FE PZ 16-35mm F4 G', #JR
158
+ 32873 => 'Sony E PZ 10-20mm F4 G', #JR
157
159
  32874 => 'Sony FE 70-200mm F2.8 GM OSS II', #IB
160
+ 32875 => 'Sony FE 24-70mm F2.8 GM II', #JR
161
+ 32876 => 'Sony E 11mm F1.8', #JR
162
+ 32877 => 'Sony E 15mm F1.4 G', #JR
158
163
 
159
164
  # (comment this out so LensID will report the LensModel, which is more useful)
160
165
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -200,12 +205,15 @@ sub PrintInvLensSpec($;$$);
200
205
  49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061)
201
206
  49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
202
207
  49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
208
+ 49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
209
+ 49472 => 'Tamron 20-40mm F2.8 Di III VXD', #JR (Model A062)
203
210
 
204
211
  49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
205
212
  49473.1 => 'Viltrox 23mm F1.4 E', #JR
206
213
  49473.2 => 'Viltrox 56mm F1.4 E', #JR
207
214
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
208
215
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
216
+ 49714 => 'Tokina atx-m 11-18mm F2.8 E', #JR
209
217
 
210
218
  50480 => 'Sigma 30mm F1.4 DC DN | C', #IB/JR (016)
211
219
  50481 => 'Sigma 50mm F1.4 DG HSM | A', #JR (014 + MC-11 or 018)
@@ -245,6 +253,9 @@ sub PrintInvLensSpec($;$$);
245
253
  50530 => 'Sigma 24mm F2 DG DN | C', #JR (021)
246
254
  50531 => 'Sigma 18-50mm F2.8 DC DN | C', #IB/JR (021)
247
255
  50532 => 'Sigma 20mm F2 DG DN | C', #JR (022)
256
+ 50533 => 'Sigma 16-28mm F2.8 DG DN | C', #JR (022)
257
+ 50534 => 'Sigma 20mm F1.4 DG DN | A', #JR (022)
258
+ 50535 => 'Sigma 24mm F1.4 DG DN | A', #JR (022)
248
259
 
249
260
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
250
261
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -1042,7 +1053,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1042
1053
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
1043
1054
  },{
1044
1055
  Name => 'Tag2010i', # ?
1045
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1|E10))\b/',
1056
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1F?|E10))\b/',
1046
1057
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
1047
1058
  },{
1048
1059
  Name => 'Tag_0x2010',
@@ -1618,7 +1629,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1618
1629
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1619
1630
  {
1620
1631
  Name => 'Tag9050a',
1621
- Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(1|6100|6300|6400|6500|6600|7C|7M3|7M4|7RM2|7RM3A?|7RM4A?|7SM2|7SM3|9|9M2)|ILCA-99M2|ILME-FX3|ZV-)/',
1632
+ Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(1|6100|6300|6400|6500|6600|7C|7M3|7M4|7RM2|7RM3A?|7RM4A?|7RM5|7SM2|7SM3|9|9M2)|ILCA-99M2|ILME-FX3|ZV-)/',
1622
1633
  SubDirectory => {
1623
1634
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1624
1635
  ByteOrder => 'LittleEndian',
@@ -1632,7 +1643,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1632
1643
  },
1633
1644
  },{
1634
1645
  Name => 'Tag9050c',
1635
- Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)/',
1646
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)/',
1636
1647
  SubDirectory => {
1637
1648
  TagTable => 'Image::ExifTool::Sony::Tag9050c',
1638
1649
  ByteOrder => 'LittleEndian',
@@ -1652,8 +1663,9 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1652
1663
  # 0x24 (e) for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1, DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500
1653
1664
  # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
1654
1665
  # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/E10
1655
- # 0x31 (e) for ILCE-1/7SM3, ILME-FX3
1656
- # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106 respectively
1666
+ # 0x31 (e) for ILCE-1/7M4/7SM3, ILME-FX3
1667
+ # 0x32 (e) for ILCE-7RM5, ILME-FX30
1668
+ # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106, 89 respectively
1657
1669
  {
1658
1670
  Name => 'Tag9400a',
1659
1671
  Condition => q{
@@ -1667,7 +1679,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1667
1679
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' },
1668
1680
  },{
1669
1681
  Name => 'Tag9400c',
1670
- Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/',
1682
+ Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31\x32]/',
1671
1683
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' },
1672
1684
  },{
1673
1685
  Name => 'Sony_0x9400',
@@ -2043,6 +2055,9 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2043
2055
  386 => 'ILCE-7RM3A', #JR
2044
2056
  387 => 'ILCE-7RM4A', #forum12542
2045
2057
  388 => 'ILCE-7M4', #IB/JR
2058
+ 389 => 'ZV-1F', #IB
2059
+ 390 => 'ILCE-7RM5', #IB
2060
+ 391 => 'ILME-FX30', #JR
2046
2061
  },
2047
2062
  },
2048
2063
  0xb020 => { #2
@@ -7965,7 +7980,7 @@ my %isoSetting2010 = (
7965
7980
  },
7966
7981
  0x0088 => {
7967
7982
  Name => 'InternalSerialNumber', #(NC)
7968
- Condition => '$$self{Model} =~ /^(ILCE-(7M4|7SM3)|ILME-FX3)/',
7983
+ Condition => '$$self{Model} =~ /^(ILCE-(7M4|7RM5|7SM3)|ILME-FX3)/',
7969
7984
  Format => 'int8u[6]',
7970
7985
  PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7971
7986
  },
@@ -8203,7 +8218,7 @@ my %isoSetting2010 = (
8203
8218
  },
8204
8219
  0x002a => [{
8205
8220
  Name => 'Quality2',
8206
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8221
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8207
8222
  PrintConv => {
8208
8223
  0 => 'JPEG',
8209
8224
  1 => 'RAW',
@@ -8212,7 +8227,7 @@ my %isoSetting2010 = (
8212
8227
  },
8213
8228
  },{
8214
8229
  Name => 'Quality2',
8215
- Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8230
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8216
8231
  PrintConv => {
8217
8232
  1 => 'JPEG',
8218
8233
  2 => 'RAW',
@@ -8223,13 +8238,13 @@ my %isoSetting2010 = (
8223
8238
  }],
8224
8239
  0x0047 => {
8225
8240
  Name => 'SonyImageHeight',
8226
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8241
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8227
8242
  Format => 'int16u',
8228
8243
  PrintConv => '$val > 0 ? 8*$val : "n.a."',
8229
8244
  },
8230
8245
  0x0053 => {
8231
8246
  Name => 'ModelReleaseYear',
8232
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8247
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8233
8248
  Format => 'int8u',
8234
8249
  PrintConv => 'sprintf("20%.2d", $val)',
8235
8250
  },
@@ -8244,9 +8259,10 @@ my %isoSetting2010 = (
8244
8259
  FIRST_ENTRY => 0,
8245
8260
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8246
8261
  DATAMEMBER => [ 0 ],
8247
- IS_SUBDIR => [ 0x0498, 0x049d, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8262
+ IS_SUBDIR => [ 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8248
8263
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8249
8264
 
8265
+ 0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8250
8266
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8251
8267
  0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8252
8268
  0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -9517,7 +9533,7 @@ my %isoSetting2010 = (
9517
9533
  WRITE_PROC => \&WriteEnciphered,
9518
9534
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9519
9535
  FORMAT => 'int8u',
9520
- NOTES => 'Valid for the ILCE-1/7M4/7SM3, ILME-FX3.',
9536
+ NOTES => 'Valid for the ILCE-1/7M4/7RM5/7SM3, ILME-FX3.',
9521
9537
  FIRST_ENTRY => 0,
9522
9538
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9523
9539
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -9644,7 +9660,7 @@ my %isoSetting2010 = (
9644
9660
  },
9645
9661
  0x088f => {
9646
9662
  Name => 'VignettingCorrParams',
9647
- Condition => '$$self{Model} !~ /^(ILCE-7M4)/',
9663
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
9648
9664
  Format => 'int16s[16]',
9649
9665
  },
9650
9666
  0x0891 => {
@@ -9652,9 +9668,14 @@ my %isoSetting2010 = (
9652
9668
  Condition => '$$self{Model} =~ /^(ILCE-7M4)/',
9653
9669
  Format => 'int16s[16]',
9654
9670
  },
9671
+ 0x089b => {
9672
+ Name => 'VignettingCorrParams',
9673
+ Condition => '$$self{Model} =~ /^(ILCE-7RM5|ILME-FX30)\b/',
9674
+ Format => 'int16s[16]',
9675
+ },
9655
9676
  0x0914 => {
9656
9677
  Name => 'ChromaticAberrationCorrParams',
9657
- Condition => '$$self{Model} !~ /^(ILCE-7M4)/',
9678
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
9658
9679
  Format => 'int16s[32]',
9659
9680
  },
9660
9681
  0x0916 => {
@@ -9662,6 +9683,11 @@ my %isoSetting2010 = (
9662
9683
  Condition => '$$self{Model} =~ /^(ILCE-7M4)/',
9663
9684
  Format => 'int16s[32]',
9664
9685
  },
9686
+ 0x0945 => {
9687
+ Name => 'ChromaticAberrationCorrParams',
9688
+ Condition => '$$self{Model} =~ /^(ILCE-7RM5|ILME-FX30)\b/',
9689
+ Format => 'int16s[32]',
9690
+ },
9665
9691
  );
9666
9692
 
9667
9693
  %Image::ExifTool::Sony::FaceInfo1 = (
@@ -9937,20 +9963,22 @@ my %isoSetting2010 = (
9937
9963
  WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
9938
9964
  CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
9939
9965
  GROUPS => { 0 => 'MakerNotes', 1 => 'SR2SubIFD', 2 => 'Camera' },
9966
+ WRITE_GROUP => 'SR2SubIFD',
9967
+ PERMANENT => 1,
9940
9968
  SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
9941
9969
  NOTES => 'Tags in the encrypted SR2SubIFD',
9942
- 0x7300 => 'BlackLevel', #IB (R1)
9943
- 0x7302 => 'WB_GRBGLevelsAuto', #IB (R1)
9944
- 0x7303 => 'WB_GRBGLevels', #1 (R1 "as shot", ref IB)
9945
- 0x7310 => 'BlackLevel', #IB (divide by 4)
9946
- 0x7312 => 'WB_RGGBLevelsAuto', #IB
9947
- 0x7313 => 'WB_RGGBLevels', #6
9948
- 0x7480 => 'WB_RGBLevelsDaylight', #IB (R1)
9949
- 0x7481 => 'WB_RGBLevelsCloudy', #IB (R1)
9950
- 0x7482 => 'WB_RGBLevelsTungsten', #IB (R1)
9951
- 0x7483 => 'WB_RGBLevelsFlash', #IB (R1)
9952
- 0x7484 => 'WB_RGBLevels4500K', #IB (R1)
9953
- 0x7486 => 'WB_RGBLevelsFluorescent', #IB (R1)
9970
+ 0x7300 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4, Protected => 1 },
9971
+ 0x7302 => { Name => 'WB_GRBGLevelsAuto', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9972
+ 0x7303 => { Name => 'WB_GRBGLevels', Writable => 'int16s', Count => 4, Protected => 1 }, #1 (R1 "as shot", ref IB)
9973
+ 0x7310 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4, Protected => 1 }, #IB (divide by 4)
9974
+ 0x7312 => { Name => 'WB_RGGBLevelsAuto', Writable => 'int16s', Count => 4, Protected => 1 }, #IB
9975
+ 0x7313 => { Name => 'WB_RGGBLevels', Writable => 'int16s', Count => 4, Protected => 1 }, #6
9976
+ 0x7480 => { Name => 'WB_RGBLevelsDaylight', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9977
+ 0x7481 => { Name => 'WB_RGBLevelsCloudy', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9978
+ 0x7482 => { Name => 'WB_RGBLevelsTungsten', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9979
+ 0x7483 => { Name => 'WB_RGBLevelsFlash', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9980
+ 0x7484 => { Name => 'WB_RGBLevels4500K', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9981
+ 0x7486 => { Name => 'WB_RGBLevelsFluorescent', Writable => 'int16s', Count => 4, Protected => 1 }, #IB (R1)
9954
9982
  0x74a0 => 'MaxApertureAtMaxFocal', #PH
9955
9983
  0x74a1 => 'MaxApertureAtMinFocal', #PH
9956
9984
  0x74a2 => { #IB (R1)
@@ -9972,21 +10000,21 @@ my %isoSetting2010 = (
9972
10000
  },
9973
10001
  },
9974
10002
  0x7800 => 'ColorMatrix', #IB (divide by 1024)
9975
- 0x7820 => 'WB_RGBLevelsDaylight', #6 (or 5300K, ref IB)
9976
- 0x7821 => 'WB_RGBLevelsCloudy', #6 (or 6100K, ref IB)
9977
- 0x7822 => 'WB_RGBLevelsTungsten', #6
9978
- 0x7823 => 'WB_RGBLevelsFlash', #IB
9979
- 0x7824 => 'WB_RGBLevels4500K', #IB
9980
- 0x7825 => 'WB_RGBLevelsShade', #6 (or 7500K, ref IB)
9981
- 0x7826 => 'WB_RGBLevelsFluorescent', #6 (~4000K)
9982
- 0x7827 => 'WB_RGBLevelsFluorescentP1', #IB (~5000K)
9983
- 0x7828 => 'WB_RGBLevelsFluorescentP2', #IB (~6500K) (was Flash, ref 6)
9984
- 0x7829 => 'WB_RGBLevelsFluorescentM1', #IB (~3500K)
9985
- 0x782a => 'WB_RGBLevels8500K', #IB
9986
- 0x782b => 'WB_RGBLevels6000K', #IB
9987
- 0x782c => 'WB_RGBLevels3200K', #IB
9988
- 0x782d => 'WB_RGBLevels2500K', #IB
9989
- 0x787f => 'WhiteLevel', #IB (divide by 4)
10003
+ 0x7820 => { Name => 'WB_RGBLevelsDaylight', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 5300K, ref IB)
10004
+ 0x7821 => { Name => 'WB_RGBLevelsCloudy', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 6100K, ref IB)
10005
+ 0x7822 => { Name => 'WB_RGBLevelsTungsten', Writable => 'int16s', Count => 3, Protected => 1 }, #6
10006
+ 0x7823 => { Name => 'WB_RGBLevelsFlash', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10007
+ 0x7824 => { Name => 'WB_RGBLevels4500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10008
+ 0x7825 => { Name => 'WB_RGBLevelsShade', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (or 7500K, ref IB)
10009
+ 0x7826 => { Name => 'WB_RGBLevelsFluorescent', Writable => 'int16s', Count => 3, Protected => 1 }, #6 (~4000K)
10010
+ 0x7827 => { Name => 'WB_RGBLevelsFluorescentP1', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~5000K)
10011
+ 0x7828 => { Name => 'WB_RGBLevelsFluorescentP2', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~6500K) (was Flash, ref 6)
10012
+ 0x7829 => { Name => 'WB_RGBLevelsFluorescentM1', Writable => 'int16s', Count => 3, Protected => 1 }, #IB (~3500K)
10013
+ 0x782a => { Name => 'WB_RGBLevels8500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10014
+ 0x782b => { Name => 'WB_RGBLevels6000K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10015
+ 0x782c => { Name => 'WB_RGBLevels3200K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10016
+ 0x782d => { Name => 'WB_RGBLevels2500K', Writable => 'int16s', Count => 3, Protected => 1 }, #IB
10017
+ 0x787f => { Name => 'WhiteLevel', Writable => 'int16u', Count => 3, Protected => 1 }, #IB (divide by 4)
9990
10018
  0x797d => 'VignettingCorrParams', #forum7640
9991
10019
  0x7980 => 'ChromaticAberrationCorrParams', #forum6509 (Sony A7 ARW)
9992
10020
  0x7982 => 'DistortionCorrParams', #forum6509 (Sony A7 ARW)
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA $makeMissing);
15
15
  use Image::ExifTool qw(:Utils :Vars);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.32';
18
+ $VERSION = '1.33';
19
19
  @ISA = qw(Exporter);
20
20
 
21
21
  # set this to a language code to generate Lang module with 'MISSING' entries
@@ -204,6 +204,8 @@ PTILoop: for ($index=0; $index<@infoArray; ++$index) {
204
204
  push @flags, 'Permanent' if $$tagInfo{Permanent} or
205
205
  ($groups[0] eq 'MakerNotes' and not defined $$tagInfo{Permanent});
206
206
  $grp = " flags='" . join(',', sort @flags) . "'$grp" if @flags;
207
+ # add parent structure tag ID
208
+ $grp .= " struct='$$tagInfo{ParentTagInfo}{TagID}'" if $$tagInfo{ParentTagInfo};
207
209
  }
208
210
  print $fp " <tag id='${xmlID}' name='${name}'$ind type='${format}'$count writable='${writable}'$grp";
209
211
  if ($opts{NoDesc}) {