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.
- package/bin/Changes +38 -3
- package/bin/MANIFEST +3 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +2 -2
- package/bin/exiftool +29 -23
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
- package/bin/lib/Image/ExifTool/Canon.pm +13 -8
- package/bin/lib/Image/ExifTool/Exif.pm +6 -5
- package/bin/lib/Image/ExifTool/Geotag.pm +1 -1
- package/bin/lib/Image/ExifTool/ICO.pm +2 -0
- package/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +44 -1
- package/bin/lib/Image/ExifTool/MISB.pm +1 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +193 -85
- package/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +7 -2
- package/bin/lib/Image/ExifTool/QuickTime.pm +45 -6
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +35 -2
- package/bin/lib/Image/ExifTool/README +4 -0
- package/bin/lib/Image/ExifTool/Sony.pm +29 -14
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +4562 -4552
- package/bin/lib/Image/ExifTool/TagNames.pod +46 -9
- package/bin/lib/Image/ExifTool/XMP.pm +3 -2
- package/bin/lib/Image/ExifTool/XMP2.pl +9 -1
- package/bin/lib/Image/ExifTool.pm +8 -5
- package/bin/lib/Image/ExifTool.pod +9 -8
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/pp_build_exe.args +4 -4
- package/package.json +1 -1
|
@@ -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.
|
|
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();
|
|
9245
|
+
$et->SetFileType(); # MOV
|
|
9212
9246
|
}
|
|
9213
9247
|
SetByteOrder('MM');
|
|
9214
9248
|
$$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
|
|
9215
9249
|
}
|
|
9216
|
-
|
|
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
|
-
$
|
|
9245
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
#
|
|
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}
|
|
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}
|
|
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.
|
|
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}) {
|