exiftool-vendored.pl 12.49.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.
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.79';
50
+ $VERSION = '2.80';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -522,6 +522,12 @@ my %eeBox2 = (
522
522
  return substr($val, 12, $len);
523
523
  },
524
524
  },
525
+ {
526
+ Name => 'SkipInfo', # (found in 70mai Pro Plus+ MP4 videos)
527
+ # (look for something that looks like a QuickTime atom header)
528
+ Condition => '$$valPt =~ /^\0[\0-\x04]..[a-zA-Z ]{4}/s',
529
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SkipInfo' },
530
+ },
525
531
  { Name => 'Skip', Unknown => 1, Binary => 1 },
526
532
  ],
527
533
  wide => { Unknown => 1, Binary => 1 },
@@ -759,6 +765,19 @@ my %eeBox2 = (
759
765
  # 'samn'? - seen in Vantrue N2S sample video
760
766
  );
761
767
 
768
+ # stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
769
+ %Image::ExifTool::QuickTime::SkipInfo = (
770
+ PROCESS_PROC => \&ProcessMOV,
771
+ GROUPS => { 2 => 'Video' },
772
+ 'ver ' => 'Version',
773
+ # tima - int32u: seen 0x3c
774
+ thma => {
775
+ Name => 'ThumbnailImage',
776
+ Groups => { 2 => 'Preview' },
777
+ Binary => 1,
778
+ },
779
+ );
780
+
762
781
  # MPEG-4 'ftyp' atom
763
782
  # (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
764
783
  %Image::ExifTool::QuickTime::FileType = (
@@ -8691,7 +8710,7 @@ sub HandleItemInfo($)
8691
8710
  $et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes)\n");
8692
8711
  }
8693
8712
  # get ExifTool name for this item
8694
- my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type} || '';
8713
+ my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP', jpeg => 'PreviewImage' }->{$type} || '';
8695
8714
  my ($warn, $extent);
8696
8715
  $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
8697
8716
  $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
@@ -8768,6 +8787,21 @@ sub HandleItemInfo($)
8768
8787
  }
8769
8788
  $subTable = GetTagTable('Image::ExifTool::Exif::Main');
8770
8789
  $proc = \&Image::ExifTool::ProcessTIFF;
8790
+ } elsif ($name eq 'PreviewImage') {
8791
+ # take a quick stab at determining the size of the image
8792
+ # (based on JPEG previews found in Fuji X-H2S HIF images)
8793
+ my $type = 'PreviewImage';
8794
+ if ($buff =~ /^.{556}\xff\xc0\0\x11.(.{4})/s) {
8795
+ my ($h, $w) = unpack('n2', $1);
8796
+ # (not sure if $h is ever the long dimension, but test it just in case)
8797
+ if ($w == 160 or $h == 160) {
8798
+ $type = 'ThumbnailImage';
8799
+ } elsif ($w == 1920 or $h == 1920) {
8800
+ $type = 'OtherImage'; # (large preview)
8801
+ } # (PreviewImage is 640x480)
8802
+ }
8803
+ $et->FoundTag($type => $buff);
8804
+ next;
8771
8805
  } else {
8772
8806
  $start = 0;
8773
8807
  $subTable = GetTagTable('Image::ExifTool::XMP::Main');
@@ -9208,12 +9242,13 @@ sub ProcessMOV($$;$)
9208
9242
  # temporarily set ExtractEmbedded option for CRX files
9209
9243
  $saveOptions{ExtractEmbedded} = $et->Options(ExtractEmbedded => 1) if $fileType eq 'CRX';
9210
9244
  } else {
9211
- $et->SetFileType(); # MOV
9245
+ $et->SetFileType(); # MOV
9212
9246
  }
9213
9247
  SetByteOrder('MM');
9214
9248
  $$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
9215
9249
  }
9216
- $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
9250
+ my $fast = $$et{OPTIONS}{FastScan} || 0;
9251
+ $$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
9217
9252
 
9218
9253
  my $ee = $$et{OPTIONS}{ExtractEmbedded};
9219
9254
  if ($ee) {
@@ -9241,8 +9276,10 @@ sub ProcessMOV($$;$)
9241
9276
  $et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file");
9242
9277
  if ($$tagTablePtr{"$tag-size"}) {
9243
9278
  my $pos = $raf->Tell();
9244
- $raf->Seek(0, 2);
9245
- $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
9279
+ unless ($fast) {
9280
+ $raf->Seek(0, 2);
9281
+ $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
9282
+ }
9246
9283
  $et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"};
9247
9284
  }
9248
9285
  }
@@ -9345,6 +9382,8 @@ sub ProcessMOV($$;$)
9345
9382
  $et->HandleTag($tagTablePtr, "$tag-size", $size);
9346
9383
  $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
9347
9384
  }
9385
+ # stop processing at mdat/idat if -fast2 is used
9386
+ last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
9348
9387
  # load values only if associated with a tag (or verbose) and not too big
9349
9388
  if ($size > 0x2000000) { # start to get worried above 32 MB
9350
9389
  # check for RIFF trailer (written by Auto-Vox dashcam)
@@ -27,6 +27,8 @@ sub ProcessFreeGPS2($$$);
27
27
  sub Process360Fly($$$);
28
28
  sub ProcessFMAS($$$);
29
29
 
30
+ my $debug; # set to 1 for extra debugging messages
31
+
30
32
  # QuickTime data types that have ExifTool equivalents
31
33
  # (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35)
32
34
  my %qtFmt = (
@@ -99,7 +101,7 @@ my %insvLimit = (
99
101
  The tags below are extracted from timed metadata in QuickTime and other
100
102
  formats of video files when the ExtractEmbedded option is used. Although
101
103
  most of these tags are combined into the single table below, ExifTool
102
- currently reads 61 different formats of timed GPS metadata from video files.
104
+ currently reads 62 different formats of timed GPS metadata from video files.
103
105
  },
104
106
  VARS => { NO_ID => 1 },
105
107
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -1422,6 +1424,7 @@ sub ProcessFreeGPS($$$)
1422
1424
  } elsif ($buf2 =~ /^.{173}([-+]\d{3})([-+]\d{3})([-+]\d{3})/s) { # (Azdome)
1423
1425
  @acc = ($1/100, $2/100, $3/100);
1424
1426
  }
1427
+ $debug and $et->FoundTag(GPSType => '1A');
1425
1428
 
1426
1429
  } elsif ($$dataPt =~ /^.{52}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/s) {
1427
1430
 
@@ -1450,6 +1453,7 @@ sub ProcessFreeGPS($$$)
1450
1453
  # change to signed integer and divide by 256
1451
1454
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1452
1455
  }
1456
+ $debug and $et->FoundTag(GPSType => '1B');
1453
1457
 
1454
1458
  } elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) {
1455
1459
 
@@ -1460,13 +1464,27 @@ sub ProcessFreeGPS($$$)
1460
1464
  # 0030: f1 47 40 46 66 66 d2 41 85 eb 83 41 00 00 00 00 [.G@Fff.A...A....]
1461
1465
  ($latRef, $lonRef) = ($1, $2);
1462
1466
  ($hr,$min,$sec,$yr,$mon,$day) = unpack('x16V6', $$dataPt);
1463
- $yr += 2000;
1467
+ if ($yr < 2000) {
1468
+ $yr += 2000;
1469
+ } else {
1470
+ # Kenwood dashcam sometimes stores absolute year and local time
1471
+ # (but sometimes year since 2000 and UTC time in same video!)
1472
+ require Time::Local;
1473
+ my $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$yr-1900);
1474
+ ($sec,$min,$hr,$day,$mon,$yr) = gmtime($time);
1475
+ $yr += 1900;
1476
+ ++$mon;
1477
+ $et->WarnOnce('Converting GPSDateTime to UTC based on local time zone',1);
1478
+ }
1464
1479
  SetByteOrder('II');
1465
1480
  $lat = GetFloat($dataPt, 0x2c);
1466
1481
  $lon = GetFloat($dataPt, 0x30);
1467
1482
  $spd = GetFloat($dataPt, 0x34) * $knotsToKph; # (convert knots to km/h)
1468
1483
  $trk = GetFloat($dataPt, 0x38);
1484
+ @acc = unpack('x60V3', $$dataPt); # (may be all zeros if not valid)
1485
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1469
1486
  SetByteOrder('MM');
1487
+ $debug and $et->FoundTag(GPSType => '1C');
1470
1488
 
1471
1489
  } elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
1472
1490
 
@@ -1495,6 +1513,7 @@ sub ProcessFreeGPS($$$)
1495
1513
  $acc[1] = GetFloat($dataPt, 0x30);
1496
1514
  $acc[2] = GetFloat($dataPt, 0x34);
1497
1515
  SetByteOrder('MM');
1516
+ $debug and $et->FoundTag(GPSType => '1D');
1498
1517
 
1499
1518
  } elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) {
1500
1519
 
@@ -1515,6 +1534,7 @@ sub ProcessFreeGPS($$$)
1515
1534
  $trk = GetFloat($dataPt, 0x54) + 180; # (why is this off by 180?)
1516
1535
  $trk -= 360 if $trk >= 360;
1517
1536
  SetByteOrder('MM');
1537
+ $debug and $et->FoundTag(GPSType => '1E');
1518
1538
 
1519
1539
  } elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
1520
1540
 
@@ -1532,6 +1552,7 @@ sub ProcessFreeGPS($$$)
1532
1552
  $yr += ($yr >= 70 ? 1900 : 2000);
1533
1553
  $spd = $9 * $knotsToKph if length $9;
1534
1554
  $trk = $10 if length $10;
1555
+ $debug and $et->FoundTag(GPSType => '1F');
1535
1556
 
1536
1557
  } elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
1537
1558
 
@@ -1575,6 +1596,7 @@ sub ProcessFreeGPS($$$)
1575
1596
 
1576
1597
  SetByteOrder('MM');
1577
1598
  #my $serialNum = substr($$dataPt, 0x68, 20);
1599
+ $debug and $et->FoundTag(GPSType => '1G');
1578
1600
 
1579
1601
  } elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) {
1580
1602
 
@@ -1597,6 +1619,7 @@ sub ProcessFreeGPS($$$)
1597
1619
  # bytes 7-12 are the timestamp in ASCII HHMMSS after xor-ing with 0x70
1598
1620
  substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
1599
1621
  # (other values are currently unknown)
1622
+ $debug and $et->FoundTag(GPSType => '1H');
1600
1623
 
1601
1624
  } elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
1602
1625
 
@@ -1622,6 +1645,7 @@ sub ProcessFreeGPS($$$)
1622
1645
  $trk = GetFloat($dataPt, 0x68);
1623
1646
  $alt = GetFloat($dataPt, 0x6c);
1624
1647
  SetByteOrder('MM');
1648
+ $debug and $et->FoundTag(GPSType => '1I');
1625
1649
 
1626
1650
  } else {
1627
1651
 
@@ -1658,6 +1682,7 @@ sub ProcessFreeGPS($$$)
1658
1682
  $yr += 2000 if $yr < 2000;
1659
1683
  $spd *= $knotsToKph; # convert speed to km/h
1660
1684
  # ($trk is not confirmed; may be GPSImageDirection, ref PH)
1685
+ $debug and $et->FoundTag(GPSType => '1J');
1661
1686
  }
1662
1687
  #
1663
1688
  # save tag values extracted by above code
@@ -1811,6 +1836,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1811
1836
  }
1812
1837
  # save position of most recent record (needed when parsing the next freeGPS block)
1813
1838
  $$et{FreeGPS2}{RecentRecPos} = $lastRecPos;
1839
+ $debug and $et->FoundTag(GPSType => '2A');
1814
1840
  return 1;
1815
1841
 
1816
1842
  } elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s) {
@@ -1842,6 +1868,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1842
1868
  $lon = GetDouble($dataPt, 0x50);
1843
1869
  $spd = GetDouble($dataPt, 0x60) * $knotsToKph;
1844
1870
  $trk = GetDouble($dataPt, 0x68);
1871
+ $debug and $et->FoundTag(GPSType => '2B');
1845
1872
 
1846
1873
  } elsif ($$dataPt =~ /^.{72}A([NS])([EW])/s) {
1847
1874
 
@@ -1878,6 +1905,8 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1878
1905
  $lon = abs Get32s($dataPt, 0x50) / 1e7;
1879
1906
  $spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
1880
1907
  $alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
1908
+ $debug and $et->FoundTag(GPSType => '2C');
1909
+
1881
1910
  } else {
1882
1911
  # Type 3 (ref 2)
1883
1912
  # (no sample with this format)
@@ -1885,6 +1914,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1885
1914
  $lon = GetFloat($dataPt, 0x50);
1886
1915
  $spd = GetFloat($dataPt, 0x54) * $knotsToKph;
1887
1916
  $trk = GetFloat($dataPt, 0x58);
1917
+ $debug and $et->FoundTag(GPSType => '2D');
1888
1918
  }
1889
1919
 
1890
1920
  } elsif ($$dataPt =~ /^.{60}A\0.{6}([NS])\0.{6}([EW])\0/s and $dirLen >= 112) {
@@ -1905,6 +1935,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1905
1935
  $lon = GetFloat($dataPt, 0x48);
1906
1936
  $spd = GetFloat($dataPt, 0x50);
1907
1937
  $trk = GetFloat($dataPt, 0x54);
1938
+ $debug and $et->FoundTag(GPSType => '2E');
1908
1939
 
1909
1940
  } elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) {
1910
1941
 
@@ -1925,6 +1956,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1925
1956
  $et->HandleTag($tagTbl, GPSTrack => $trk);
1926
1957
  $et->HandleTag($tagTbl, Accelerometer => "@acc");
1927
1958
  }
1959
+ $debug and $et->FoundTag(GPSType => '2F');
1928
1960
  return 1;
1929
1961
 
1930
1962
  } else {
@@ -1971,6 +2003,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1971
2003
  $et->HandleTag($tagTbl, GPSTrack => $trk);
1972
2004
  last if $pos += 0x20 > length($$dataPt) - 0x1e;
1973
2005
  }
2006
+ $debug and $et->FoundTag(GPSType => '2G');
1974
2007
  return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted
1975
2008
  }
1976
2009
  #
@@ -967,6 +967,10 @@ numerical, and generated automatically otherwise.
967
967
  OtherLang : [reserved] Used internally by QuickTime module to store a list
968
968
  of tag ID's for alternate-language tags based on this one.
969
969
 
970
+ ParentTagInfo : [reserved] Used internally to store a reference to the tag
971
+ information hash of the parent structure for flattened
972
+ structure tags.
973
+
970
974
  RootTagInfo : [reserved] Used internally to store a reference to the tag
971
975
  information hash of the top-level structure for flattened
972
976
  structure tags.
@@ -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.54';
37
+ $VERSION = '3.55';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -206,6 +206,7 @@ sub PrintInvLensSpec($;$$);
206
206
  49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
207
207
  49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
208
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)
209
210
 
210
211
  49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
211
212
  49473.1 => 'Viltrox 23mm F1.4 E', #JR
@@ -253,6 +254,8 @@ sub PrintInvLensSpec($;$$);
253
254
  50531 => 'Sigma 18-50mm F2.8 DC DN | C', #IB/JR (021)
254
255
  50532 => 'Sigma 20mm F2 DG DN | C', #JR (022)
255
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)
256
259
 
257
260
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
258
261
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -1626,7 +1629,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1626
1629
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1627
1630
  {
1628
1631
  Name => 'Tag9050a',
1629
- 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-)/',
1630
1633
  SubDirectory => {
1631
1634
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1632
1635
  ByteOrder => 'LittleEndian',
@@ -1640,7 +1643,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1640
1643
  },
1641
1644
  },{
1642
1645
  Name => 'Tag9050c',
1643
- Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)/',
1646
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)/',
1644
1647
  SubDirectory => {
1645
1648
  TagTable => 'Image::ExifTool::Sony::Tag9050c',
1646
1649
  ByteOrder => 'LittleEndian',
@@ -1660,8 +1663,9 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1660
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
1661
1664
  # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
1662
1665
  # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/E10
1663
- # 0x31 (e) for ILCE-1/7SM3, ILME-FX3
1664
- # 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
1665
1669
  {
1666
1670
  Name => 'Tag9400a',
1667
1671
  Condition => q{
@@ -1675,7 +1679,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1675
1679
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' },
1676
1680
  },{
1677
1681
  Name => 'Tag9400c',
1678
- Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/',
1682
+ Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31\x32]/',
1679
1683
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' },
1680
1684
  },{
1681
1685
  Name => 'Sony_0x9400',
@@ -2052,6 +2056,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2052
2056
  387 => 'ILCE-7RM4A', #forum12542
2053
2057
  388 => 'ILCE-7M4', #IB/JR
2054
2058
  389 => 'ZV-1F', #IB
2059
+ 390 => 'ILCE-7RM5', #IB
2055
2060
  391 => 'ILME-FX30', #JR
2056
2061
  },
2057
2062
  },
@@ -7975,7 +7980,7 @@ my %isoSetting2010 = (
7975
7980
  },
7976
7981
  0x0088 => {
7977
7982
  Name => 'InternalSerialNumber', #(NC)
7978
- Condition => '$$self{Model} =~ /^(ILCE-(7M4|7SM3)|ILME-FX3)/',
7983
+ Condition => '$$self{Model} =~ /^(ILCE-(7M4|7RM5|7SM3)|ILME-FX3)/',
7979
7984
  Format => 'int8u[6]',
7980
7985
  PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7981
7986
  },
@@ -8213,7 +8218,7 @@ my %isoSetting2010 = (
8213
8218
  },
8214
8219
  0x002a => [{
8215
8220
  Name => 'Quality2',
8216
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8221
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8217
8222
  PrintConv => {
8218
8223
  0 => 'JPEG',
8219
8224
  1 => 'RAW',
@@ -8222,7 +8227,7 @@ my %isoSetting2010 = (
8222
8227
  },
8223
8228
  },{
8224
8229
  Name => 'Quality2',
8225
- Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8230
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8226
8231
  PrintConv => {
8227
8232
  1 => 'JPEG',
8228
8233
  2 => 'RAW',
@@ -8233,13 +8238,13 @@ my %isoSetting2010 = (
8233
8238
  }],
8234
8239
  0x0047 => {
8235
8240
  Name => 'SonyImageHeight',
8236
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8241
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8237
8242
  Format => 'int16u',
8238
8243
  PrintConv => '$val > 0 ? 8*$val : "n.a."',
8239
8244
  },
8240
8245
  0x0053 => {
8241
8246
  Name => 'ModelReleaseYear',
8242
- Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7SM3)|ILME-FX3)\b/',
8247
+ Condition => '$$self{Model} !~ /^(ILCE-(1|7M4|7RM5|7SM3)|ILME-FX3)\b/',
8243
8248
  Format => 'int8u',
8244
8249
  PrintConv => 'sprintf("20%.2d", $val)',
8245
8250
  },
@@ -9528,7 +9533,7 @@ my %isoSetting2010 = (
9528
9533
  WRITE_PROC => \&WriteEnciphered,
9529
9534
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9530
9535
  FORMAT => 'int8u',
9531
- NOTES => 'Valid for the ILCE-1/7M4/7SM3, ILME-FX3.',
9536
+ NOTES => 'Valid for the ILCE-1/7M4/7RM5/7SM3, ILME-FX3.',
9532
9537
  FIRST_ENTRY => 0,
9533
9538
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9534
9539
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -9655,7 +9660,7 @@ my %isoSetting2010 = (
9655
9660
  },
9656
9661
  0x088f => {
9657
9662
  Name => 'VignettingCorrParams',
9658
- Condition => '$$self{Model} !~ /^(ILCE-7M4)/',
9663
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
9659
9664
  Format => 'int16s[16]',
9660
9665
  },
9661
9666
  0x0891 => {
@@ -9663,9 +9668,14 @@ my %isoSetting2010 = (
9663
9668
  Condition => '$$self{Model} =~ /^(ILCE-7M4)/',
9664
9669
  Format => 'int16s[16]',
9665
9670
  },
9671
+ 0x089b => {
9672
+ Name => 'VignettingCorrParams',
9673
+ Condition => '$$self{Model} =~ /^(ILCE-7RM5|ILME-FX30)\b/',
9674
+ Format => 'int16s[16]',
9675
+ },
9666
9676
  0x0914 => {
9667
9677
  Name => 'ChromaticAberrationCorrParams',
9668
- Condition => '$$self{Model} !~ /^(ILCE-7M4)/',
9678
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
9669
9679
  Format => 'int16s[32]',
9670
9680
  },
9671
9681
  0x0916 => {
@@ -9673,6 +9683,11 @@ my %isoSetting2010 = (
9673
9683
  Condition => '$$self{Model} =~ /^(ILCE-7M4)/',
9674
9684
  Format => 'int16s[32]',
9675
9685
  },
9686
+ 0x0945 => {
9687
+ Name => 'ChromaticAberrationCorrParams',
9688
+ Condition => '$$self{Model} =~ /^(ILCE-7RM5|ILME-FX30)\b/',
9689
+ Format => 'int16s[32]',
9690
+ },
9676
9691
  );
9677
9692
 
9678
9693
  %Image::ExifTool::Sony::FaceInfo1 = (
@@ -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}) {