exiftool_vendored 12.41.0 → 12.50.0

Sign up to get free protection for your applications and to get access to all the features.
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}) {