exiftool_vendored 12.25.0 → 12.32.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +114 -4
- data/bin/MANIFEST +11 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +44 -43
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/config_files/convert_regions.config +25 -14
- data/bin/config_files/example.config +1 -1
- data/bin/exiftool +72 -56
- data/bin/fmt_files/gpx.fmt +1 -1
- data/bin/fmt_files/gpx_wpt.fmt +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +10 -2
- data/bin/lib/Image/ExifTool/CBOR.pm +277 -0
- data/bin/lib/Image/ExifTool/Canon.pm +25 -18
- data/bin/lib/Image/ExifTool/DPX.pm +13 -2
- data/bin/lib/Image/ExifTool/Exif.pm +11 -6
- data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
- data/bin/lib/Image/ExifTool/ID3.pm +15 -3
- data/bin/lib/Image/ExifTool/JPEG.pm +68 -2
- data/bin/lib/Image/ExifTool/JSON.pm +4 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +58 -26
- data/bin/lib/Image/ExifTool/LIF.pm +153 -0
- data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
- data/bin/lib/Image/ExifTool/M2TS.pm +103 -7
- data/bin/lib/Image/ExifTool/MIE.pm +2 -1
- data/bin/lib/Image/ExifTool/MRC.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +15 -4
- data/bin/lib/Image/ExifTool/NikonSettings.pm +10 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +5 -2
- data/bin/lib/Image/ExifTool/Other.pm +93 -0
- data/bin/lib/Image/ExifTool/PDF.pm +9 -12
- data/bin/lib/Image/ExifTool/PNG.pm +7 -6
- data/bin/lib/Image/ExifTool/Panasonic.pm +14 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
- data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +103 -24
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
- data/bin/lib/Image/ExifTool/README +3 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
- data/bin/lib/Image/ExifTool/Samsung.pm +47 -10
- data/bin/lib/Image/ExifTool/Sony.pm +84 -33
- data/bin/lib/Image/ExifTool/TagLookup.pm +50 -3
- data/bin/lib/Image/ExifTool/TagNames.pod +135 -29
- data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
- data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +11 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +3 -0
- data/bin/lib/Image/ExifTool/XMP.pm +17 -5
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
- data/bin/lib/Image/ExifTool.pm +79 -37
- data/bin/lib/Image/ExifTool.pod +62 -60
- data/bin/perl-Image-ExifTool.spec +43 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +6 -3
@@ -0,0 +1,153 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: LIF.pm
|
3
|
+
#
|
4
|
+
# Description: Read LIF (Leica Image File) files
|
5
|
+
#
|
6
|
+
# Revisions: 2021-06-21 - P. Harvey Created
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
|
9
|
+
package Image::ExifTool::LIF;
|
10
|
+
|
11
|
+
use strict;
|
12
|
+
use vars qw($VERSION);
|
13
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
14
|
+
use Image::ExifTool::XMP;
|
15
|
+
|
16
|
+
$VERSION = '1.00';
|
17
|
+
|
18
|
+
%Image::ExifTool::LIF::Main = (
|
19
|
+
GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
|
20
|
+
PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
|
21
|
+
VARS => { NO_ID => 1 },
|
22
|
+
NOTES => q{
|
23
|
+
Tags extracted from Leica Image Format (LIF) imaging files. As well as the
|
24
|
+
tags listed below, all available information is extracted from the
|
25
|
+
XML-format metadata in the LIF header.
|
26
|
+
},
|
27
|
+
TimeStampList => {
|
28
|
+
Groups => { 2 => 'Time' },
|
29
|
+
ValueConv => q{
|
30
|
+
my $unixTimeZero = 134774 * 24 * 3600;
|
31
|
+
my @vals = split ' ', $val;
|
32
|
+
foreach (@vals) {
|
33
|
+
$_ = 1e-7 * hex($_);
|
34
|
+
# shift from Jan 1, 1601 to Jan 1, 1970
|
35
|
+
$_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
|
36
|
+
}
|
37
|
+
return \@vals;
|
38
|
+
},
|
39
|
+
},
|
40
|
+
);
|
41
|
+
|
42
|
+
#------------------------------------------------------------------------------
|
43
|
+
# Shorten obscenely long LIF tag names
|
44
|
+
# Inputs: Tag name
|
45
|
+
# Returns: Shortened tag name
|
46
|
+
sub ShortenTagNames($)
|
47
|
+
{
|
48
|
+
local $_;
|
49
|
+
$_ = shift;
|
50
|
+
s/DescriptionDimensionsDimensionDescription/Dimensions/;
|
51
|
+
s/DescriptionChannelsChannelDescription/Channel/;
|
52
|
+
s/ShutterListShutter/Shutter/;
|
53
|
+
s/SettingDefinition/Setting/;
|
54
|
+
s/AdditionalZPositionListAdditionalZPosition/AdditionalZPosition/;
|
55
|
+
s/LMSDataContainerHeader//g;
|
56
|
+
s/FilterWheelWheel/FilterWheel/;
|
57
|
+
s/FilterWheelFilter/FilterWheel/;
|
58
|
+
s/DetectorListDetector/Detector/;
|
59
|
+
s/OnlineDyeSeparationOnlineDyeSeparation/OnlineDyeSeparation/;
|
60
|
+
s/AotfListAotf/Aotf/;
|
61
|
+
s/SettingAotfLaserLineSetting/SettingAotfLaser/;
|
62
|
+
s/DataROISetROISet/DataROISet/;
|
63
|
+
s/AdditionalZPosition/AddZPos/;
|
64
|
+
s/FRAPplusBlock_FRAPBlock_FRAP_PrePost_Info/FRAP_/;
|
65
|
+
s/FRAPplusBlock_FRAPBlock_FRAP_(Master)?/FRAP_/;
|
66
|
+
s/LDM_Block_SequentialLDM_Block_Sequential_/LDM_/;
|
67
|
+
s/ATLConfocalSetting/ATLConfocal/;
|
68
|
+
s/LaserArrayLaser/Laser/;
|
69
|
+
s/LDM_Master/LDM_/;
|
70
|
+
s/(List)?ATLConfocal/ATL_/;
|
71
|
+
s/Separation/Sep/;
|
72
|
+
s/BleachPointsElement/BleachPoint/;
|
73
|
+
s/BeamPositionBeamPosition/BeamPosition/;
|
74
|
+
s/DataROISetPossible(ROI)?/DataROISet/;
|
75
|
+
s/RoiElementChildrenElementDataROISingle(Roi)?/Roi/;
|
76
|
+
s/InfoLaserLineSettingArrayLaserLineSetting/LastLineSetting/;
|
77
|
+
s/FilterWheelWheelNameFilterName/FilterWheelFilterName/;
|
78
|
+
s/LUT_ListLut/Lut/;
|
79
|
+
s/ROI_ListRoiRoidata/ROI_/;
|
80
|
+
s/LaserLineSettingArrayLaserLineSetting/LaserLineSetting/;
|
81
|
+
return $_;
|
82
|
+
}
|
83
|
+
|
84
|
+
#------------------------------------------------------------------------------
|
85
|
+
# Extract metadata from a LIF image
|
86
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
87
|
+
# Returns: 1 on success, 0 if this wasn't a valid LIF file
|
88
|
+
sub ProcessLIF($$)
|
89
|
+
{
|
90
|
+
my ($et, $dirInfo) = @_;
|
91
|
+
my $raf = $$dirInfo{RAF};
|
92
|
+
my $buff;
|
93
|
+
|
94
|
+
# verify this is a valid LIF file
|
95
|
+
return 0 unless $raf->Read($buff, 15) == 15 and $buff =~ /^\x70\0{3}.{4}\x2a.{4}<\0/s;
|
96
|
+
|
97
|
+
$et->SetFileType();
|
98
|
+
SetByteOrder('II');
|
99
|
+
|
100
|
+
my $size = Get32u(\$buff, 4); # XML chunk size
|
101
|
+
my $len = Get32u(\$buff, 9) * 2; # XML data length
|
102
|
+
|
103
|
+
$size < $len and $et->Error('Corrupted LIF XML block'), return 1;
|
104
|
+
$size > 100000000 and $et->Error('LIF XML block too large'), return 1;
|
105
|
+
|
106
|
+
$raf->Seek(-2, 1) and $raf->Read($buff, $len) == $len or $et->Error('Truncated LIF XML block'), return 1;
|
107
|
+
|
108
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::LIF::Main');
|
109
|
+
|
110
|
+
# convert from UCS2 to UTF8
|
111
|
+
my $xml = Image::ExifTool::Decode($et, $buff, 'UCS2', 'II', 'UTF8');
|
112
|
+
|
113
|
+
my %dirInfo = ( DataPt => \$xml );
|
114
|
+
|
115
|
+
$$et{XmpIgnoreProps} = [ 'LMSDataContainerHeader', 'Element', 'Children', 'Data', 'Image', 'Attachment' ];
|
116
|
+
$$et{ShortenXmpTags} = \&ShortenTagNames;
|
117
|
+
|
118
|
+
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
119
|
+
|
120
|
+
return 1;
|
121
|
+
}
|
122
|
+
|
123
|
+
1; # end
|
124
|
+
|
125
|
+
__END__
|
126
|
+
|
127
|
+
=head1 NAME
|
128
|
+
|
129
|
+
Image::ExifTool::LIF - Read LIF meta information
|
130
|
+
|
131
|
+
=head1 SYNOPSIS
|
132
|
+
|
133
|
+
This module is used by Image::ExifTool
|
134
|
+
|
135
|
+
=head1 DESCRIPTION
|
136
|
+
|
137
|
+
This module contains definitions required by Image::ExifTool to read
|
138
|
+
metadata from Leica Image File (LIF) images.
|
139
|
+
|
140
|
+
=head1 AUTHOR
|
141
|
+
|
142
|
+
Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
|
143
|
+
|
144
|
+
This library is free software; you can redistribute it and/or modify it
|
145
|
+
under the same terms as Perl itself.
|
146
|
+
|
147
|
+
=head1 SEE ALSO
|
148
|
+
|
149
|
+
L<Image::ExifTool::TagNames/LIF Tags>,
|
150
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
151
|
+
|
152
|
+
=cut
|
153
|
+
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::nl;
|
|
11
11
|
use strict;
|
12
12
|
use vars qw($VERSION);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.13';
|
15
15
|
|
16
16
|
%Image::ExifTool::Lang::nl::Translate = (
|
17
17
|
'AEBAutoCancel' => {
|
@@ -1502,97 +1502,98 @@ $VERSION = '1.12';
|
|
1502
1502
|
'GIFVersion' => 'GIF versie',
|
1503
1503
|
'GPSAltitude' => 'Hoogte',
|
1504
1504
|
'GPSAltitudeRef' => {
|
1505
|
-
Description => '
|
1505
|
+
Description => 'GPS hoogte - referentie',
|
1506
1506
|
PrintConv => {
|
1507
|
-
'Above Sea Level' => '
|
1508
|
-
'Below Sea Level' => '
|
1507
|
+
'Above Sea Level' => 'Boven zeeniveau',
|
1508
|
+
'Below Sea Level' => 'Onder zeeniveau',
|
1509
1509
|
},
|
1510
1510
|
},
|
1511
|
-
'GPSAreaInformation' => '
|
1512
|
-
'GPSDOP' => '
|
1513
|
-
'GPSDateStamp' => 'GPS datum',
|
1514
|
-
'GPSDateTime' => 'GPS tijd
|
1515
|
-
'GPSDestBearing' => '
|
1511
|
+
'GPSAreaInformation' => 'GPS naam van het gebied',
|
1512
|
+
'GPSDOP' => 'GPS meetnauwkeurigheid',
|
1513
|
+
'GPSDateStamp' => 'GPS UTC datum',
|
1514
|
+
'GPSDateTime' => 'GPS UTC datum en tijd',
|
1515
|
+
'GPSDestBearing' => 'GPS peiling van bestemming',
|
1516
1516
|
'GPSDestBearingRef' => {
|
1517
|
-
Description => '
|
1517
|
+
Description => 'GPS peiling van bestemming - referentie',
|
1518
1518
|
PrintConv => {
|
1519
|
-
'Magnetic North' => 'Magnetische
|
1520
|
-
'True North' => 'Geografische
|
1519
|
+
'Magnetic North' => 'Magnetische noorden',
|
1520
|
+
'True North' => 'Geografische noorden',
|
1521
1521
|
},
|
1522
1522
|
},
|
1523
|
-
'GPSDestDistance' => '
|
1523
|
+
'GPSDestDistance' => 'GPS afstand tot bestemming',
|
1524
1524
|
'GPSDestDistanceRef' => {
|
1525
|
-
Description => '
|
1525
|
+
Description => 'GPS afstand tot bestemming - referentie',
|
1526
1526
|
PrintConv => {
|
1527
|
-
'Miles' => '
|
1528
|
-
'Nautical Miles' => '
|
1527
|
+
'Miles' => 'Engelse mijlen',
|
1528
|
+
'Nautical Miles' => 'Zeemijlen',
|
1529
1529
|
},
|
1530
1530
|
},
|
1531
|
-
'GPSDestLatitude' => '
|
1531
|
+
'GPSDestLatitude' => 'GPS breedtegraad van bestemming',
|
1532
1532
|
'GPSDestLatitudeRef' => {
|
1533
|
-
Description => '
|
1533
|
+
Description => 'GPS breedtegraad van bestemming - referentie',
|
1534
1534
|
PrintConv => {
|
1535
|
-
'North' => '
|
1536
|
-
'South' => '
|
1535
|
+
'North' => 'Noorderbreedte',
|
1536
|
+
'South' => 'Zuiderbreedte',
|
1537
1537
|
},
|
1538
1538
|
},
|
1539
|
-
'GPSDestLongitude' => '
|
1539
|
+
'GPSDestLongitude' => 'GPS lengtegraad van bestemming',
|
1540
1540
|
'GPSDestLongitudeRef' => {
|
1541
|
-
Description => '
|
1541
|
+
Description => 'GPS lengtegraad van bestemming - referentie',
|
1542
1542
|
PrintConv => {
|
1543
|
-
'East' => '
|
1544
|
-
'West' => '
|
1543
|
+
'East' => 'Oosterlengte',
|
1544
|
+
'West' => 'Westerlengte',
|
1545
1545
|
},
|
1546
1546
|
},
|
1547
1547
|
'GPSDifferential' => {
|
1548
1548
|
Description => 'GPS differentiaal correctie',
|
1549
1549
|
PrintConv => {
|
1550
|
-
'Differential Corrected' => '
|
1551
|
-
'No Correction' => '
|
1550
|
+
'Differential Corrected' => 'Met differentiaal correctie',
|
1551
|
+
'No Correction' => 'Zonder differentiaal correctie',
|
1552
1552
|
},
|
1553
1553
|
},
|
1554
|
-
'GPSImgDirection' => '
|
1554
|
+
'GPSImgDirection' => 'GPS peiling van de afbeelding',
|
1555
1555
|
'GPSImgDirectionRef' => {
|
1556
|
-
Description => '
|
1556
|
+
Description => 'GPS peiling van de afbeelding - referentie',
|
1557
1557
|
PrintConv => {
|
1558
|
-
'Magnetic North' => 'Magnetische
|
1559
|
-
'True North' => 'Geografische
|
1558
|
+
'Magnetic North' => 'Magnetische noorden',
|
1559
|
+
'True North' => 'Geografische noorden',
|
1560
1560
|
},
|
1561
1561
|
},
|
1562
|
-
'GPSInfo' => 'GPS Info
|
1563
|
-
'GPSLatitude' => '
|
1562
|
+
'GPSInfo' => 'GPS Info',
|
1563
|
+
'GPSLatitude' => 'GPS breedtegraad',
|
1564
1564
|
'GPSLatitudeRef' => {
|
1565
|
-
Description => '
|
1565
|
+
Description => 'GPS breedtegraad - referentie',
|
1566
1566
|
PrintConv => {
|
1567
|
-
'North' => '
|
1568
|
-
'South' => '
|
1567
|
+
'North' => 'Noorderbreedte',
|
1568
|
+
'South' => 'Zuiderbreedte',
|
1569
1569
|
},
|
1570
1570
|
},
|
1571
|
-
'GPSLongitude' => '
|
1571
|
+
'GPSLongitude' => 'GPS lengtegraad',
|
1572
1572
|
'GPSLongitudeRef' => {
|
1573
|
-
Description => '
|
1573
|
+
Description => 'GPS lengtegraad - referentie',
|
1574
1574
|
PrintConv => {
|
1575
|
-
'East' => '
|
1576
|
-
'West' => '
|
1575
|
+
'East' => 'Oosterlengte',
|
1576
|
+
'West' => 'Westerlengte',
|
1577
1577
|
},
|
1578
1578
|
},
|
1579
|
-
'GPSMapDatum' => '
|
1579
|
+
'GPSMapDatum' => 'GPS geodetisch datum',
|
1580
1580
|
'GPSMeasureMode' => {
|
1581
|
-
Description => 'GPS
|
1581
|
+
Description => 'GPS meetmethode',
|
1582
1582
|
PrintConv => {
|
1583
|
-
'2-D' => '
|
1584
|
-
'2-Dimensional' => '
|
1585
|
-
'2-Dimensional Measurement' => '
|
1586
|
-
'3-D' => '
|
1587
|
-
'3-Dimensional' => '
|
1588
|
-
'3-Dimensional Measurement' => '
|
1583
|
+
'2-D' => 'Tweedimensionale meting',
|
1584
|
+
'2-Dimensional' => 'Tweedimensionale meting',
|
1585
|
+
'2-Dimensional Measurement' => 'Tweedimensionale meting',
|
1586
|
+
'3-D' => 'Driedimensionale meting',
|
1587
|
+
'3-Dimensional' => 'Driedimensionale meting',
|
1588
|
+
'3-Dimensional Measurement' => 'Driedimensionale meting',
|
1589
1589
|
},
|
1590
1590
|
},
|
1591
|
-
'
|
1592
|
-
'
|
1593
|
-
'
|
1591
|
+
'GPSPosition' => 'GPS positie',
|
1592
|
+
'GPSProcessingMethod' => 'GPS verwerkingsmethode',
|
1593
|
+
'GPSSatellites' => 'GPS satellieten gebruikt voor de meting',
|
1594
|
+
'GPSSpeed' => 'GPS ontvanger bewegingssnelheid',
|
1594
1595
|
'GPSSpeedRef' => {
|
1595
|
-
Description => '
|
1596
|
+
Description => 'GPS ontvanger bewegingssnelheid - referentie',
|
1596
1597
|
PrintConv => {
|
1597
1598
|
'km/h' => 'Kilometer per uur',
|
1598
1599
|
'knots' => 'Knopen',
|
@@ -1602,20 +1603,20 @@ $VERSION = '1.12';
|
|
1602
1603
|
'GPSStatus' => {
|
1603
1604
|
Description => 'GPS ontvanger status',
|
1604
1605
|
PrintConv => {
|
1605
|
-
'Measurement Active' => '
|
1606
|
-
'Measurement Void' => '
|
1606
|
+
'Measurement Active' => 'Actuele meting beschikbaar',
|
1607
|
+
'Measurement Void' => 'Actuele meting niet beschikbaar',
|
1607
1608
|
},
|
1608
1609
|
},
|
1609
|
-
'GPSTimeStamp' => 'GPS tijd
|
1610
|
-
'GPSTrack' => '
|
1610
|
+
'GPSTimeStamp' => 'GPS UTC tijd',
|
1611
|
+
'GPSTrack' => 'GPS ontvanger bewegingsrichting',
|
1611
1612
|
'GPSTrackRef' => {
|
1612
|
-
Description => '
|
1613
|
+
Description => 'GPS ontvanger bewegingsrichting - referentie',
|
1613
1614
|
PrintConv => {
|
1614
|
-
'Magnetic North' => 'Magnetische
|
1615
|
-
'True North' => '
|
1615
|
+
'Magnetic North' => 'Magnetische noorden',
|
1616
|
+
'True North' => 'Geografische noorden',
|
1616
1617
|
},
|
1617
1618
|
},
|
1618
|
-
'GPSVersionID' => 'GPS
|
1619
|
+
'GPSVersionID' => 'GPS versie ID',
|
1619
1620
|
'GainControl' => {
|
1620
1621
|
Description => 'Belichtingsversterking',
|
1621
1622
|
PrintConv => {
|
@@ -31,7 +31,7 @@ use strict;
|
|
31
31
|
use vars qw($VERSION);
|
32
32
|
use Image::ExifTool qw(:DataAccess :Utils);
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.21';
|
35
35
|
|
36
36
|
# program map table "stream_type" lookup (ref 6/1)
|
37
37
|
my %streamType = (
|
@@ -113,6 +113,8 @@ my %noSyntax = (
|
|
113
113
|
0xff => 1, # program_stream_directory
|
114
114
|
);
|
115
115
|
|
116
|
+
my $knotsToKph = 1.852; # knots --> km/h
|
117
|
+
|
116
118
|
# information extracted from the MPEG-2 transport stream
|
117
119
|
%Image::ExifTool::M2TS::Main = (
|
118
120
|
GROUPS => { 2 => 'Video' },
|
@@ -327,7 +329,90 @@ sub ParsePID($$$$$)
|
|
327
329
|
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
328
330
|
Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl);
|
329
331
|
$more = 1;
|
332
|
+
} elsif ($$dataPt =~ /^A([NS])([EW])\0/s) {
|
333
|
+
# INNOVV TS video (same format is INNOVV MP4)
|
334
|
+
SetByteOrder('II');
|
335
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
336
|
+
while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
|
337
|
+
my $dat = $1;
|
338
|
+
my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
|
339
|
+
my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
|
340
|
+
my $spd = GetFloat(\$dat, 12) * $knotsToKph;
|
341
|
+
my $trk = GetFloat(\$dat, 16);
|
342
|
+
my @acc = unpack('x20V3', $dat);
|
343
|
+
map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
|
344
|
+
Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
|
345
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
346
|
+
$et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
|
347
|
+
$et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
|
348
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
349
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
350
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
351
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
352
|
+
$et->HandleTag($tagTbl, Accelerometer => "@acc");
|
353
|
+
}
|
354
|
+
SetByteOrder('MM');
|
355
|
+
$more = 1;
|
356
|
+
} elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
|
357
|
+
# $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
|
358
|
+
# $GSNRINFO,0.01,0.04,0.25\0
|
359
|
+
$$dataPt =~ tr/\x0d/\x0a/;
|
360
|
+
$$dataPt =~ tr/\0//d;
|
361
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
362
|
+
my @lines = split /\x0a/, $$dataPt;
|
363
|
+
my ($line, $lastTime);
|
364
|
+
foreach $line (@lines) {
|
365
|
+
if ($line =~ /^\$GPSINFO/) {
|
366
|
+
my @a = split /,/, $lines[0];
|
367
|
+
next unless @a > 7;
|
368
|
+
# ignore duplicate fixes
|
369
|
+
next if $lastTime and $a[2] eq $lastTime;
|
370
|
+
$lastTime = $a[2];
|
371
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
372
|
+
$a[2] =~ tr/./:/;
|
373
|
+
# (untested, and probably doesn't work for S/W hemispheres)
|
374
|
+
my ($lat, $lon) = @a[3,4];
|
375
|
+
Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
|
376
|
+
# $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010'
|
377
|
+
$et->HandleTag($tagTbl, GPSDateTime => $a[2]);
|
378
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
379
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
380
|
+
$et->HandleTag($tagTbl, GPSSpeed => $a[5]);
|
381
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
382
|
+
# $a[6] - values: 48-60
|
383
|
+
$et->HandleTag($tagTbl, GPSTrack => $a[7]);
|
384
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
385
|
+
# #a[8,9] - always 0
|
386
|
+
} elsif ($line =~ /^\$GSNRINFO/) {
|
387
|
+
my @a = split /,/, $line;
|
388
|
+
shift @a;
|
389
|
+
$et->HandleTag($tagTbl, Accelerometer => "@a");
|
390
|
+
}
|
391
|
+
}
|
392
|
+
$more = 1;
|
393
|
+
} elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) {
|
394
|
+
#forum11320
|
395
|
+
SetByteOrder('II');
|
396
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
397
|
+
my $lat = abs(GetFloat($dataPt, 48)); # (abs just to be safe)
|
398
|
+
my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe)
|
399
|
+
my $spd = GetFloat($dataPt, 64);
|
400
|
+
my $trk = GetFloat($dataPt, 68);
|
401
|
+
$et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
|
402
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
403
|
+
my @date = unpack('x32V3x28V3', $$dataPt);
|
404
|
+
$date[3] += 2000;
|
405
|
+
$et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date[3..5,0..2]));
|
406
|
+
$et->HandleTag($tagTbl, GPSLatitude => abs($lat) * ($1 eq 'S' ? -1 : 1));
|
407
|
+
$et->HandleTag($tagTbl, GPSLongitude => abs($lon) * ($2 eq 'W' ? -1 : 1));
|
408
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
409
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
410
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
411
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
412
|
+
SetByteOrder('MM');
|
413
|
+
$more = 1;
|
330
414
|
}
|
415
|
+
delete $$et{DOC_NUM};
|
331
416
|
}
|
332
417
|
return $more;
|
333
418
|
}
|
@@ -379,14 +464,21 @@ sub ProcessM2TS($$)
|
|
379
464
|
);
|
380
465
|
my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
|
381
466
|
my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
|
467
|
+
# PID's that may contain GPS info
|
468
|
+
my %gpsPID = (
|
469
|
+
0x0300 => 1, # Novatek INNOVV
|
470
|
+
0x01e4 => 1, # vsys a6l dashcam
|
471
|
+
);
|
382
472
|
my $pEnd = 0;
|
383
473
|
|
384
|
-
# scan entire file for GPS
|
385
|
-
# (some dashcams write
|
474
|
+
# scan entire file for GPS programs if ExtractEmbedded option is 3 or higher
|
475
|
+
# (some dashcams write these programs but don't include it in the PMT)
|
386
476
|
if (($et->Options('ExtractEmbedded') || 0) > 2) {
|
387
|
-
|
388
|
-
|
389
|
-
|
477
|
+
foreach (keys %gpsPID) {
|
478
|
+
$needPID{$_} = 1;
|
479
|
+
$pidType{$_} = -1;
|
480
|
+
$pidName{$_} ='unregistered dashcam GPS';
|
481
|
+
}
|
390
482
|
}
|
391
483
|
|
392
484
|
# parse packets from MPEG-2 Transport Stream
|
@@ -675,7 +767,11 @@ sub ProcessM2TS($$)
|
|
675
767
|
}
|
676
768
|
$data{$pid} = substr($buff, $pos, $pEnd-$pos);
|
677
769
|
} else {
|
678
|
-
|
770
|
+
unless (defined $data{$pid}) {
|
771
|
+
# (vsys a6l dashcam GPS record doesn't have a start indicator)
|
772
|
+
next unless $gpsPID{$pid};
|
773
|
+
$data{$pid} = '';
|
774
|
+
}
|
679
775
|
# accumulate data for each elementary stream
|
680
776
|
$data{$pid} .= substr($buff, $pos, $pEnd-$pos);
|
681
777
|
}
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::Exif;
|
15
15
|
use Image::ExifTool::GPS;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.49';
|
18
18
|
|
19
19
|
sub ProcessMIE($$);
|
20
20
|
sub ProcessMIEGroup($$$);
|
@@ -1023,6 +1023,7 @@ sub WriteMIEGroup($$$)
|
|
1023
1023
|
# we are writing the new tag now
|
1024
1024
|
my ($newVal, $writable, $oldVal, $newFormat, $compress);
|
1025
1025
|
my $newTag = shift @editTags;
|
1026
|
+
length($newTag) > 255 and $et->Warn('Tag name too long'), next; # (just to be safe)
|
1026
1027
|
my $newInfo = $$editDirs{$newTag};
|
1027
1028
|
if ($newInfo) {
|
1028
1029
|
# create the new subdirectory or rewrite existing non-MIE directory
|
@@ -285,7 +285,7 @@ sub ProcessMRC($$)
|
|
285
285
|
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
286
286
|
last if ++$i >= $$et{ImageDepth};
|
287
287
|
unless ($$et{OPTIONS}{ExtractEmbedded}) {
|
288
|
-
$et->Warn('Use the ExtractEmbedded option to read metadata for all frames',
|
288
|
+
$et->Warn('Use the ExtractEmbedded option to read metadata for all frames',3);
|
289
289
|
last;
|
290
290
|
}
|
291
291
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
62
62
|
use Image::ExifTool::Exif;
|
63
63
|
use Image::ExifTool::GPS;
|
64
64
|
|
65
|
-
$VERSION = '
|
65
|
+
$VERSION = '4.00';
|
66
66
|
|
67
67
|
sub LensIDConv($$$);
|
68
68
|
sub ProcessNikonAVI($$$);
|
@@ -272,6 +272,7 @@ sub GetAFPointGrid($$;$);
|
|
272
272
|
'9F 58 44 44 14 14 A1 06' => 'AF-S DX Nikkor 35mm f/1.8G', #27
|
273
273
|
'A0 54 50 50 0C 0C A2 06' => 'AF-S Nikkor 50mm f/1.4G',
|
274
274
|
'A1 40 18 37 2C 34 A3 06' => 'AF-S DX Nikkor 10-24mm f/3.5-4.5G ED',
|
275
|
+
'A1 40 2D 53 2C 3C CB 86' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G', #30
|
275
276
|
'A2 48 5C 80 24 24 A4 0E' => 'AF-S Nikkor 70-200mm f/2.8G ED VR II',
|
276
277
|
'A3 3C 29 44 30 30 A5 0E' => 'AF-S Nikkor 16-35mm f/4G ED VR',
|
277
278
|
'A4 54 37 37 0C 0C A6 06' => 'AF-S Nikkor 24mm f/1.4G ED',
|
@@ -495,6 +496,7 @@ sub GetAFPointGrid($$;$);
|
|
495
496
|
'02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
|
496
497
|
'02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
|
497
498
|
'26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
|
499
|
+
'02 3B 5C 82 30 3C 02 00' => 'Sigma Zoom-K 70-210mm F4-5.6', #30
|
498
500
|
'26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro',
|
499
501
|
'56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II',
|
500
502
|
'E0 3C 5C 8E 30 3C 4B 06' => 'Sigma 70-300mm F4-5.6 APO DG Macro HSM', #22
|
@@ -554,6 +556,7 @@ sub GetAFPointGrid($$;$);
|
|
554
556
|
'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)',
|
555
557
|
'00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)',
|
556
558
|
'00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)',
|
559
|
+
'EC 3E 3C 8E 2C 40 DF 0E' => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD A010', #30
|
557
560
|
'00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #NJ
|
558
561
|
'FC 40 2D 80 2C 40 DF 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #PH (NC)
|
559
562
|
'E6 40 2D 80 2C 40 DF 0E' => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #Tanel (removed AF designation, ref 37)
|
@@ -595,6 +598,7 @@ sub GetAFPointGrid($$;$);
|
|
595
598
|
'00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)', #JD
|
596
599
|
'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)',
|
597
600
|
'CF 47 5C 8E 31 3D DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)', #forum9773
|
601
|
+
'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
|
598
602
|
'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
|
599
603
|
'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
|
600
604
|
'20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
|
@@ -612,6 +616,7 @@ sub GetAFPointGrid($$;$);
|
|
612
616
|
'7A 48 1C 29 24 24 7E 06' => 'Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)',
|
613
617
|
'80 48 1C 29 24 24 7A 06' => 'Tokina atx-i 11-16mm F2.8 CF', #exiv2 issue 1078
|
614
618
|
'7A 48 1C 30 24 24 7E 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)',
|
619
|
+
'8B 48 1C 30 24 24 85 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', #forum12687
|
615
620
|
'00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
|
616
621
|
'7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
|
617
622
|
'7A 3C 1F 3C 30 30 7E 06' => 'Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)',
|
@@ -718,6 +723,9 @@ sub GetAFPointGrid($$;$);
|
|
718
723
|
'00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
|
719
724
|
'00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
|
720
725
|
'4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
|
726
|
+
#
|
727
|
+
'A0 56 44 44 14 14 A2 06' => 'Sony FE 35mm F1.8', #IB (Techart adapter)
|
728
|
+
'A0 37 5C 8E 34 3C A2 06' => 'Sony FE 70-300mm F4.5-5.6 G OSS', #IB (Techart adapter)
|
721
729
|
);
|
722
730
|
|
723
731
|
# text encoding used in LocationInfo (ref PH)
|
@@ -4720,6 +4728,9 @@ my %nikonFocalConversions = (
|
|
4720
4728
|
21 => 'Nikkor Z 50mm f/1.2 S', #IB
|
4721
4729
|
22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
|
4722
4730
|
23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
|
4731
|
+
24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
|
4732
|
+
27 => 'Nikkor Z MC 50mm f/2.8', #IB
|
4733
|
+
29 => 'Nikkor Z 28mm f/2.8', #IB
|
4723
4734
|
},
|
4724
4735
|
},
|
4725
4736
|
0x36 => {
|
@@ -8492,8 +8503,8 @@ my %nikonFocalConversions = (
|
|
8492
8503
|
# 0x02 - undef[148]
|
8493
8504
|
# 0x03 - undef[284]
|
8494
8505
|
# 0x04 - undef[148,212]
|
8495
|
-
# 0x05 - undef[84]
|
8496
|
-
# 0x06 - undef[116]
|
8506
|
+
# 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28)
|
8507
|
+
# 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28)
|
8497
8508
|
# 0x07 - undef[104]
|
8498
8509
|
# 0x08 - undef[24]
|
8499
8510
|
# 0x09 - undef[36]
|
@@ -9468,7 +9479,7 @@ sub GetAFPointGrid($$;$)
|
|
9468
9479
|
return undef unless $val =~ /^([A-J])(\d+)$/i;
|
9469
9480
|
return (ord(uc($1))-65) * $ncol + $2 - 1;
|
9470
9481
|
} else {
|
9471
|
-
my $row = int(($val + 0.5) / $ncol);
|
9482
|
+
my $row = int(($val + 0.5) / $ncol) & 0xff;
|
9472
9483
|
my $col = $val - $ncol * $row + 1;
|
9473
9484
|
return chr(65+$row) . $col;
|
9474
9485
|
}
|
@@ -17,7 +17,7 @@ use strict;
|
|
17
17
|
use vars qw($VERSION);
|
18
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.04';
|
21
21
|
|
22
22
|
sub ProcessNikonSettings($$$);
|
23
23
|
|
@@ -592,7 +592,7 @@ my %infoD6 = (
|
|
592
592
|
},
|
593
593
|
},
|
594
594
|
0x026 => { Name => 'AF-AssistIlluminator', PrintConv => \%onOff }, # CSa11 (Z7_2)
|
595
|
-
|
595
|
+
0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa12 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
|
596
596
|
0x029 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 (D6)
|
597
597
|
0x02a => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 (D6), CSb1 (Z7_2)
|
598
598
|
0x02b => { # CSb4 (D6), CSb2 (Z7_2)
|
@@ -1920,6 +1920,14 @@ my %infoD6 = (
|
|
1920
1920
|
},
|
1921
1921
|
},
|
1922
1922
|
0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0)
|
1923
|
+
0x171 => { # CSb8 (D6 firmware v1.3.0)
|
1924
|
+
Name => 'KeepExposureWithTeleconverter',
|
1925
|
+
PrintConv => {
|
1926
|
+
1 => 'Off',
|
1927
|
+
2 => 'Shutter Speed',
|
1928
|
+
3 => 'ISO',
|
1929
|
+
},
|
1930
|
+
},
|
1923
1931
|
0x174 => { # CSa17-d (D6 firmware v1.2.0)
|
1924
1932
|
Name => 'FocusPointSelectionSpeed',
|
1925
1933
|
PrintConv => {
|