exiftool-vendored.pl 12.41.0 → 12.44.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 +60 -1
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +2 -2
- package/bin/exiftool +5 -4
- package/bin/lib/Image/ExifTool/Apple.pm +11 -2
- package/bin/lib/Image/ExifTool/Canon.pm +39 -24
- package/bin/lib/Image/ExifTool/DJI.pm +60 -1
- package/bin/lib/Image/ExifTool/DNG.pm +8 -2
- package/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- package/bin/lib/Image/ExifTool/Exif.pm +9 -0
- package/bin/lib/Image/ExifTool/FlashPix.pm +23 -2
- package/bin/lib/Image/ExifTool/FujiFilm.pm +23 -2
- package/bin/lib/Image/ExifTool/GPS.pm +21 -1
- package/bin/lib/Image/ExifTool/Geotag.pm +24 -4
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +10 -8
- package/bin/lib/Image/ExifTool/ID3.pm +5 -5
- package/bin/lib/Image/ExifTool/LNK.pm +5 -2
- package/bin/lib/Image/ExifTool/MakerNotes.pm +5 -0
- package/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +84 -29
- package/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +21 -2
- package/bin/lib/Image/ExifTool/PDF.pm +2 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
- package/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +6 -5
- package/bin/lib/Image/ExifTool/QuickTime.pm +7 -1
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -6
- package/bin/lib/Image/ExifTool/README +8 -2
- package/bin/lib/Image/ExifTool/Samsung.pm +233 -2
- package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- package/bin/lib/Image/ExifTool/Sony.pm +36 -28
- package/bin/lib/Image/ExifTool/TagLookup.pm +2528 -2483
- package/bin/lib/Image/ExifTool/TagNames.pod +192 -97
- package/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- package/bin/lib/Image/ExifTool/Writer.pl +4 -3
- package/bin/lib/Image/ExifTool.pm +40 -16
- package/bin/lib/Image/ExifTool.pod +13 -4
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/pp_build_exe.args +4 -4
- package/package.json +3 -3
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
# 2019/07/02 - PH Added ability to read IMU CSV files
|
|
15
15
|
# 2019/11/10 - PH Also write pitch to CameraElevationAngle
|
|
16
16
|
# 2020/12/01 - PH Added ability to read DJI CSV log files
|
|
17
|
+
# 2022/06/21 - PH Added ability to read Google Takeout JSON files
|
|
17
18
|
#
|
|
18
19
|
# References: 1) http://www.topografix.com/GPX/1/1/
|
|
19
20
|
# 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
|
|
@@ -28,7 +29,7 @@ use vars qw($VERSION);
|
|
|
28
29
|
use Image::ExifTool qw(:Public);
|
|
29
30
|
use Image::ExifTool::GPS;
|
|
30
31
|
|
|
31
|
-
$VERSION = '1.
|
|
32
|
+
$VERSION = '1.68';
|
|
32
33
|
|
|
33
34
|
sub JITTER() { return 2 } # maximum time jitter
|
|
34
35
|
|
|
@@ -133,7 +134,7 @@ sub LoadTrackLog($$;$)
|
|
|
133
134
|
local ($_, $/, *EXIFTOOL_TRKFILE);
|
|
134
135
|
my ($et, $val) = @_;
|
|
135
136
|
my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
|
|
136
|
-
my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings);
|
|
137
|
+
my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings, $sortFixes);
|
|
137
138
|
my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime);
|
|
138
139
|
|
|
139
140
|
unless (eval { require Time::Local }) {
|
|
@@ -285,6 +286,10 @@ sub LoadTrackLog($$;$)
|
|
|
285
286
|
}
|
|
286
287
|
}
|
|
287
288
|
next;
|
|
289
|
+
} elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)":/) {
|
|
290
|
+
# Google Takeout JSON format
|
|
291
|
+
$format = 'JSON';
|
|
292
|
+
$sortFixes = 1; # (fixes are not all in order for this format)
|
|
288
293
|
} else {
|
|
289
294
|
# search only first 50 lines of file for a valid fix
|
|
290
295
|
last if ++$skipped > 50;
|
|
@@ -506,6 +511,19 @@ DoneFix: $isDate = 1;
|
|
|
506
511
|
goto DoneFix;
|
|
507
512
|
}
|
|
508
513
|
next;
|
|
514
|
+
} elsif ($format eq 'JSON') {
|
|
515
|
+
# Google Takeout JSON format
|
|
516
|
+
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp)":\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
|
|
517
|
+
if ($1 eq 'timestamp') {
|
|
518
|
+
$time = GetTime($2);
|
|
519
|
+
goto DoneFix if $time and $$fix{lat} and $$fix{lon};
|
|
520
|
+
} elsif ($1 eq 'latitudeE7' or $1 eq 'latE7') {
|
|
521
|
+
$$fix{lat} = $2 * 1e-7;
|
|
522
|
+
} else {
|
|
523
|
+
$$fix{lon} = $2 * 1e-7;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
next;
|
|
509
527
|
}
|
|
510
528
|
my (%fix, $secs, $date, $nmea);
|
|
511
529
|
if ($format eq 'NMEA') {
|
|
@@ -751,6 +769,8 @@ DoneFix: $isDate = 1;
|
|
|
751
769
|
$numPoints -= $cutHDOP;
|
|
752
770
|
$numPoints -= $cutSats;
|
|
753
771
|
}
|
|
772
|
+
# sort fixes if necessary
|
|
773
|
+
@fixTimes = sort { $a <=> $b } @fixTimes if $sortFixes;
|
|
754
774
|
# mark first fix of the track
|
|
755
775
|
while (@fixTimes) {
|
|
756
776
|
$fix = $$points{$fixTimes[0]} or shift(@fixTimes), next;
|
|
@@ -1409,8 +1429,8 @@ This module is used by Image::ExifTool
|
|
|
1409
1429
|
This module loads GPS track logs, interpolates to determine position based
|
|
1410
1430
|
on time, and sets new GPS values for geotagging images. Currently supported
|
|
1411
1431
|
formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
|
|
1412
|
-
PMGNTRK, Honeywell PTNTHPR, Winplus Beacon text,
|
|
1413
|
-
|
|
1432
|
+
PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text, Google Takeout
|
|
1433
|
+
JSON, GPS/IMU CSV, DJI CSV, ExifTool CSV log files.
|
|
1414
1434
|
|
|
1415
1435
|
Methods in this module should not be called directly. Instead, the Geotag
|
|
1416
1436
|
feature is accessed by writing the values of the ExifTool Geotag, Geosync
|
|
@@ -25,7 +25,7 @@ use strict;
|
|
|
25
25
|
use vars qw($VERSION);
|
|
26
26
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
27
27
|
|
|
28
|
-
$VERSION = '1.
|
|
28
|
+
$VERSION = '1.39';
|
|
29
29
|
|
|
30
30
|
sub ProcessICC($$);
|
|
31
31
|
sub ProcessICC_Profile($$$);
|
|
@@ -522,11 +522,11 @@ my %manuSig = ( #6
|
|
|
522
522
|
prmg => 'Perceptual Reference Medium Gamut',
|
|
523
523
|
},
|
|
524
524
|
},
|
|
525
|
-
meta => { #5
|
|
525
|
+
meta => { #5
|
|
526
526
|
Name => 'Metadata',
|
|
527
527
|
SubDirectory => {
|
|
528
528
|
TagTable => 'Image::ExifTool::ICC_Profile::Metadata',
|
|
529
|
-
Validate => '$type eq "
|
|
529
|
+
Validate => '$type eq "dict"',
|
|
530
530
|
},
|
|
531
531
|
},
|
|
532
532
|
|
|
@@ -891,6 +891,7 @@ my %manuSig = ( #6
|
|
|
891
891
|
ManufacturerName => { },
|
|
892
892
|
MediaColor => { },
|
|
893
893
|
MediaWeight => { },
|
|
894
|
+
CreatorApp => { },
|
|
894
895
|
);
|
|
895
896
|
|
|
896
897
|
#------------------------------------------------------------------------------
|
|
@@ -1000,7 +1001,7 @@ sub FormatICCTag($$$)
|
|
|
1000
1001
|
}
|
|
1001
1002
|
|
|
1002
1003
|
#------------------------------------------------------------------------------
|
|
1003
|
-
# Process ICC metadata record (ref 5)
|
|
1004
|
+
# Process ICC metadata record (ref 5)
|
|
1004
1005
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
1005
1006
|
# Returns: 1 on success
|
|
1006
1007
|
sub ProcessMetadata($$$)
|
|
@@ -1032,7 +1033,7 @@ sub ProcessMetadata($$$)
|
|
|
1032
1033
|
my $namePtr = Get32u($dataPt, $entry);
|
|
1033
1034
|
my $nameLen = Get32u($dataPt, $entry + 4);
|
|
1034
1035
|
my $valuePtr = Get32u($dataPt, $entry + 8);
|
|
1035
|
-
my $valueLen = Get32u($dataPt, $entry +
|
|
1036
|
+
my $valueLen = Get32u($dataPt, $entry + 12);
|
|
1036
1037
|
next unless $namePtr and $valuePtr; # ignore if offsets are zero
|
|
1037
1038
|
if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
|
|
1038
1039
|
$valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
|
|
@@ -1040,8 +1041,8 @@ sub ProcessMetadata($$$)
|
|
|
1040
1041
|
$et->Warn('Corrupted ICC meta dictionary');
|
|
1041
1042
|
last;
|
|
1042
1043
|
}
|
|
1043
|
-
my $tag = substr(
|
|
1044
|
-
my $val = substr(
|
|
1044
|
+
my $tag = substr($$dataPt, $dirStart + $namePtr, $nameLen);
|
|
1045
|
+
my $val = substr($$dataPt, $dirStart + $valuePtr, $valueLen);
|
|
1045
1046
|
$tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8');
|
|
1046
1047
|
$val = $et->Decode($val, 'UTF16', 'MM');
|
|
1047
1048
|
# generate tagInfo if it doesn't exist
|
|
@@ -1050,6 +1051,7 @@ sub ProcessMetadata($$$)
|
|
|
1050
1051
|
$name =~ s/\s+(.)/\u$1/g;
|
|
1051
1052
|
$name =~ tr/-_a-zA-Z0-9//dc;
|
|
1052
1053
|
next unless length $name;
|
|
1054
|
+
$et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
|
|
1053
1055
|
AddTagToTable($tagTablePtr, $tag, { Name => $name });
|
|
1054
1056
|
}
|
|
1055
1057
|
$et->HandleTag($tagTablePtr, $tag, $val);
|
|
@@ -1312,7 +1314,7 @@ sub ProcessICC_Profile($$$)
|
|
|
1312
1314
|
DirName => $name,
|
|
1313
1315
|
Parent => $$dirInfo{DirName},
|
|
1314
1316
|
);
|
|
1315
|
-
my $type =
|
|
1317
|
+
my $type = $fmt;
|
|
1316
1318
|
#### eval Validate ($type)
|
|
1317
1319
|
if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
|
|
1318
1320
|
$et->Warn("Invalid ICC $name data");
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Revisions: 09/12/2005 - P. Harvey Created
|
|
7
7
|
# 09/08/2020 - PH Added Lyrics3 support
|
|
8
8
|
#
|
|
9
|
-
# References: 1) http://www.id3.org/
|
|
9
|
+
# References: 1) http://www.id3.org/ (now https://id3.org)
|
|
10
10
|
# 2) http://www.mp3-tech.org/
|
|
11
11
|
# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
|
|
12
12
|
# 4) https://id3.org/Lyrics3
|
|
@@ -76,9 +76,9 @@ my %dateTimeConv = (
|
|
|
76
76
|
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
|
77
77
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
|
78
78
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
|
79
|
-
"Comment-spa"). See L<
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
"Comment-spa"). See L<https://id3.org/> for the official ID3 specification
|
|
80
|
+
and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of
|
|
81
|
+
ISO 639-2 language codes.
|
|
82
82
|
},
|
|
83
83
|
ID3v1 => {
|
|
84
84
|
Name => 'ID3v1',
|
|
@@ -1661,7 +1661,7 @@ under the same terms as Perl itself.
|
|
|
1661
1661
|
|
|
1662
1662
|
=over 4
|
|
1663
1663
|
|
|
1664
|
-
=item L<
|
|
1664
|
+
=item L<https://id3.org/>
|
|
1665
1665
|
|
|
1666
1666
|
=item L<http://www.mp3-tech.org/>
|
|
1667
1667
|
|
|
@@ -15,7 +15,7 @@ use strict;
|
|
|
15
15
|
use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
|
|
18
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.08';
|
|
19
19
|
|
|
20
20
|
sub ProcessItemID($$$);
|
|
21
21
|
sub ProcessLinkInfo($$$);
|
|
@@ -273,7 +273,9 @@ sub ProcessLinkInfo($$$);
|
|
|
273
273
|
6 => 'Ram Disk',
|
|
274
274
|
},
|
|
275
275
|
},
|
|
276
|
-
DriveSerialNumber => {
|
|
276
|
+
DriveSerialNumber => {
|
|
277
|
+
PrintConv => 'join("-", unpack("A4 A4", sprintf("%08X", $val)))',
|
|
278
|
+
},
|
|
277
279
|
VolumeLabel => { },
|
|
278
280
|
LocalBasePath => { },
|
|
279
281
|
CommonNetworkRelLink => { },
|
|
@@ -508,6 +510,7 @@ sub ProcessLinkInfo($$$)
|
|
|
508
510
|
if ($off + 0x20 <= $dataLen) {
|
|
509
511
|
# my $len = Get32u($dataPt, $off);
|
|
510
512
|
$et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
|
|
513
|
+
$et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8);
|
|
511
514
|
$pos = Get32u($dataPt, $off + 0x0c);
|
|
512
515
|
if ($pos == 0x14) {
|
|
513
516
|
# use VolumeLabelOffsetUnicode instead
|
|
@@ -89,6 +89,11 @@ my $debug; # set to 1 to enable debugging code
|
|
|
89
89
|
FixBase => 1, # necessary for AVI and MOV videos
|
|
90
90
|
},
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
Name => 'MakerNoteDJIInfo',
|
|
94
|
+
Condition => '$$valPt =~ /^\[ae_dbg_info:/',
|
|
95
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
|
|
96
|
+
},
|
|
92
97
|
{
|
|
93
98
|
Name => 'MakerNoteDJI',
|
|
94
99
|
Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
|
|
@@ -14,7 +14,7 @@ use strict;
|
|
|
14
14
|
use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool::Exif;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.02';
|
|
18
18
|
|
|
19
19
|
# Motorola makernotes tags (ref PH)
|
|
20
20
|
%Image::ExifTool::Motorola::Main = (
|
|
@@ -54,7 +54,12 @@ $VERSION = '1.01';
|
|
|
54
54
|
# 0x6400 - string: 'AUTO','ON','OFF'
|
|
55
55
|
# 0x6401 - string: 'HDR'
|
|
56
56
|
# 0x6410 - string: 'NO','YES'
|
|
57
|
-
# 0x6420 - int32s: 0 (only exists in HDR images?)
|
|
57
|
+
# 0x6420 - int32s for some models: 0 (only exists in HDR images?)
|
|
58
|
+
0x6420 => { #forum13731
|
|
59
|
+
Condition => '$format eq "string"',
|
|
60
|
+
Name => 'CustomRendered',
|
|
61
|
+
Writable => 'string',
|
|
62
|
+
},
|
|
58
63
|
# 0x6430 - float
|
|
59
64
|
# 0x6431 - int8u: 0,1
|
|
60
65
|
# 0x6432 - int8u: 0,79,100
|
|
@@ -89,6 +94,7 @@ $VERSION = '1.01';
|
|
|
89
94
|
# 0x64c2,0x64c3 - int32s
|
|
90
95
|
# 0x64c4 - int32s
|
|
91
96
|
# 0x64c5 - int32u
|
|
97
|
+
0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731
|
|
92
98
|
# 0x6500 - int8u: 1
|
|
93
99
|
# 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0
|
|
94
100
|
# 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255
|
|
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
|
|
|
63
63
|
use Image::ExifTool::GPS;
|
|
64
64
|
use Image::ExifTool::XMP;
|
|
65
65
|
|
|
66
|
-
$VERSION = '4.
|
|
66
|
+
$VERSION = '4.08';
|
|
67
67
|
|
|
68
68
|
sub LensIDConv($$$);
|
|
69
69
|
sub ProcessNikonAVI($$$);
|
|
@@ -606,6 +606,7 @@ sub GetAFPointGrid($$;$);
|
|
|
606
606
|
'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
|
|
607
607
|
'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
|
|
608
608
|
'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
|
|
609
|
+
'E3 40 76 A6 38 40 DF 0E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)', #forum3833
|
|
609
610
|
'20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
|
|
610
611
|
'00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)',
|
|
611
612
|
'00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)',
|
|
@@ -667,6 +668,7 @@ sub GetAFPointGrid($$;$);
|
|
|
667
668
|
'00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
|
|
668
669
|
'00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
|
|
669
670
|
'07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
|
|
671
|
+
'71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
|
|
670
672
|
#
|
|
671
673
|
'00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
|
|
672
674
|
'00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
|
|
@@ -2079,7 +2081,7 @@ my %base64coord = (
|
|
|
2079
2081
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
|
|
2080
2082
|
DecryptStart => 4,
|
|
2081
2083
|
# TODO: eventually set the length dynamically according to actual offsets!
|
|
2082
|
-
DecryptLen => 0xec4b +
|
|
2084
|
+
DecryptLen => 0xec4b + 1907, # decoded thru end of Offset26
|
|
2083
2085
|
ByteOrder => 'LittleEndian',
|
|
2084
2086
|
},
|
|
2085
2087
|
},
|
|
@@ -4025,7 +4027,7 @@ my %base64coord = (
|
|
|
4025
4027
|
},
|
|
4026
4028
|
Format => 'int16u',
|
|
4027
4029
|
},
|
|
4028
|
-
0x2f => { #28 (Z7)
|
|
4030
|
+
0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
|
|
4029
4031
|
Name => 'AFFocusPointXPosition',
|
|
4030
4032
|
Condition => q{
|
|
4031
4033
|
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
|
@@ -4193,11 +4195,19 @@ my %base64coord = (
|
|
|
4193
4195
|
},
|
|
4194
4196
|
0x43 => {
|
|
4195
4197
|
Name => 'FocusPositionHorizontal',
|
|
4196
|
-
|
|
4198
|
+
Notes => q{
|
|
4199
|
+
the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1
|
|
4200
|
+
to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U
|
|
4201
|
+
(4) and 2D (12) are not used for some reason
|
|
4202
|
+
},
|
|
4203
|
+
# 493 focus points for Z9 fall in a 30x19 grid
|
|
4204
|
+
# (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
|
|
4205
|
+
PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
|
|
4197
4206
|
},
|
|
4198
4207
|
0x45 => {
|
|
4199
4208
|
Name => 'FocusPositionVertical',
|
|
4200
|
-
|
|
4209
|
+
# (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
|
|
4210
|
+
PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17); },
|
|
4201
4211
|
},
|
|
4202
4212
|
0x46 => {
|
|
4203
4213
|
Name => 'AFAreaWidth',
|
|
@@ -4857,7 +4867,7 @@ my %nikonFocalConversions = (
|
|
|
4857
4867
|
%binaryDataAttrs,
|
|
4858
4868
|
NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
|
|
4859
4869
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4860
|
-
DATAMEMBER => [ 0x03, 0x2f ],
|
|
4870
|
+
DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
|
|
4861
4871
|
0x00 => {
|
|
4862
4872
|
Name => 'LensDataVersion',
|
|
4863
4873
|
Format => 'string[4]',
|
|
@@ -4883,12 +4893,12 @@ my %nikonFocalConversions = (
|
|
|
4883
4893
|
%nikonApertureConversions,
|
|
4884
4894
|
},
|
|
4885
4895
|
# --> another extra byte at position 0x08 in this version of LensData (PH)
|
|
4886
|
-
0x09 => {
|
|
4887
|
-
|
|
4888
|
-
|
|
4889
|
-
|
|
4890
|
-
|
|
4891
|
-
},
|
|
4896
|
+
#0x09 => {
|
|
4897
|
+
# Name => 'FocusPosition', #28 - this appears to be copied from an older version of LensData and is no longer valid. Text with Z9 and Z7_2 with a variety of lenses
|
|
4898
|
+
# Condition => '$$self{OldLensData}',
|
|
4899
|
+
# PrintConv => 'sprintf("0x%02x", $val)',
|
|
4900
|
+
# PrintConvInv => '$val',
|
|
4901
|
+
#},
|
|
4892
4902
|
0x0b => {
|
|
4893
4903
|
Notes => 'this focus distance is approximate, and not very accurate for some lenses',
|
|
4894
4904
|
Name => 'FocusDistance',
|
|
@@ -4947,7 +4957,8 @@ my %nikonFocalConversions = (
|
|
|
4947
4957
|
%nikonApertureConversions,
|
|
4948
4958
|
},
|
|
4949
4959
|
#
|
|
4950
|
-
# ---- new LensData tags used by Nikkor Z
|
|
4960
|
+
# ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ----
|
|
4961
|
+
# (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28)
|
|
4951
4962
|
#
|
|
4952
4963
|
0x2f => { # look forward to see if new lens data exists...
|
|
4953
4964
|
Name => 'NewLensData',
|
|
@@ -4955,7 +4966,7 @@ my %nikonFocalConversions = (
|
|
|
4955
4966
|
RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
|
|
4956
4967
|
Hidden => 1,
|
|
4957
4968
|
},
|
|
4958
|
-
0x30 => {
|
|
4969
|
+
0x30 => { #PH
|
|
4959
4970
|
Name => 'LensID',
|
|
4960
4971
|
Condition => '$$self{NewLensData}',
|
|
4961
4972
|
Notes => 'tags from here onward used for Nikkor Z lenses only',
|
|
@@ -4981,9 +4992,22 @@ my %nikonFocalConversions = (
|
|
|
4981
4992
|
27 => 'Nikkor Z MC 50mm f/2.8', #IB
|
|
4982
4993
|
28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
|
|
4983
4994
|
29 => 'Nikkor Z 28mm f/2.8', #IB
|
|
4995
|
+
30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
|
|
4996
|
+
31 => 'Nikkor Z 24-120 f/4', #28
|
|
4997
|
+
32 => 'Nikkor Z 800mm f/6.3 VR S', #28
|
|
4984
4998
|
},
|
|
4985
4999
|
},
|
|
4986
|
-
|
|
5000
|
+
0x35 => { #28
|
|
5001
|
+
Name => 'LensMountType',
|
|
5002
|
+
RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
|
|
5003
|
+
Format => 'int8u',
|
|
5004
|
+
Unknown => 1,
|
|
5005
|
+
PrintConv => {
|
|
5006
|
+
0 => 'F-mount Lens',
|
|
5007
|
+
1 => 'Z-mount Lens',
|
|
5008
|
+
},
|
|
5009
|
+
},
|
|
5010
|
+
0x36 => { #PH
|
|
4987
5011
|
Name => 'MaxAperture',
|
|
4988
5012
|
Condition => '$$self{NewLensData}',
|
|
4989
5013
|
Format => 'int16u',
|
|
@@ -4993,7 +5017,7 @@ my %nikonFocalConversions = (
|
|
|
4993
5017
|
PrintConv => 'sprintf("%.1f",$val)',
|
|
4994
5018
|
PrintConvInv => '$val',
|
|
4995
5019
|
},
|
|
4996
|
-
0x38 => {
|
|
5020
|
+
0x38 => { #PH
|
|
4997
5021
|
Name => 'FNumber',
|
|
4998
5022
|
Condition => '$$self{NewLensData}',
|
|
4999
5023
|
Format => 'int16u',
|
|
@@ -5003,7 +5027,7 @@ my %nikonFocalConversions = (
|
|
|
5003
5027
|
PrintConv => 'sprintf("%.1f",$val)',
|
|
5004
5028
|
PrintConvInv => '$val',
|
|
5005
5029
|
},
|
|
5006
|
-
0x3c => {
|
|
5030
|
+
0x3c => { #PH
|
|
5007
5031
|
Name => 'FocalLength',
|
|
5008
5032
|
Condition => '$$self{NewLensData}',
|
|
5009
5033
|
Format => 'int16u',
|
|
@@ -5011,14 +5035,36 @@ my %nikonFocalConversions = (
|
|
|
5011
5035
|
PrintConv => '"$val mm"',
|
|
5012
5036
|
PrintConvInv => '$val=~s/\s*mm$//;$val',
|
|
5013
5037
|
},
|
|
5014
|
-
|
|
5015
|
-
Name => '
|
|
5016
|
-
|
|
5017
|
-
|
|
5038
|
+
0x4c => { #28
|
|
5039
|
+
Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity.
|
|
5040
|
+
Format => 'int8u',
|
|
5041
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5042
|
+
RawConv => '$$self{FocusDistanceRangeWidth} = $val',
|
|
5043
|
+
Unknown => 1,
|
|
5044
|
+
},
|
|
5045
|
+
0x4e => { #28
|
|
5046
|
+
Name => 'FocusDistance',
|
|
5047
|
+
Format => 'int16u',
|
|
5048
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5049
|
+
RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter
|
|
5018
5050
|
ValueConv => '0.01 * 10**($val/40)', # in m
|
|
5019
5051
|
ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
|
|
5020
|
-
PrintConv =>
|
|
5021
|
-
|
|
5052
|
+
PrintConv => q{
|
|
5053
|
+
$$self{FocusDistanceRangeWidth} == 0 ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
|
|
5054
|
+
},
|
|
5055
|
+
},
|
|
5056
|
+
0x56 => { #28
|
|
5057
|
+
Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
|
|
5058
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5059
|
+
Format => 'int8u',
|
|
5060
|
+
RawConv => 'unless ($$self{FocusDistanceRangeWidth} == 0 ) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
|
|
5061
|
+
Unknown => 1,
|
|
5062
|
+
},
|
|
5063
|
+
0x5a => { #28
|
|
5064
|
+
Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
|
|
5065
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5066
|
+
Format => 'int32s',
|
|
5067
|
+
Unknown => 1,
|
|
5022
5068
|
},
|
|
5023
5069
|
);
|
|
5024
5070
|
|
|
@@ -8586,6 +8632,8 @@ my %nikonFocalConversions = (
|
|
|
8586
8632
|
4 => 'Wide (L)',
|
|
8587
8633
|
5 => '3D',
|
|
8588
8634
|
6 => 'Auto',
|
|
8635
|
+
12 => 'Wide (C1)',
|
|
8636
|
+
13 => 'Wide (C2)',
|
|
8589
8637
|
},
|
|
8590
8638
|
},
|
|
8591
8639
|
530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
|
|
@@ -8656,6 +8704,8 @@ my %nikonFocalConversions = (
|
|
|
8656
8704
|
2 => 'H.265 8-bit (MOV)',
|
|
8657
8705
|
3 => 'H.265 10-bit (MOV)',
|
|
8658
8706
|
4 => 'ProRes 422 HQ 10-bit (MOV)',
|
|
8707
|
+
5 => 'ProRes RAW HQ 12-bit (MOV)',
|
|
8708
|
+
6 => 'NRAW 12-bit (NEV)'
|
|
8659
8709
|
},
|
|
8660
8710
|
},
|
|
8661
8711
|
616 => {
|
|
@@ -8739,13 +8789,18 @@ my %nikonFocalConversions = (
|
|
|
8739
8789
|
6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
|
|
8740
8790
|
10 => '+05:45 (Kathmandu)',
|
|
8741
8791
|
11 => '+05:30 (New Dehli)',
|
|
8792
|
+
12 => '+05:00 (Islamabad)',
|
|
8793
|
+
13 => '+04:30 (Kabul)',
|
|
8794
|
+
14 => '+04:00 (Abu Dhabi)',
|
|
8795
|
+
15 => '+03:30 (Tehran)',
|
|
8742
8796
|
16 => '+03:00 (Moscow, Nairobi)',
|
|
8743
|
-
15 => '+02:00 (Athens)',
|
|
8744
|
-
16 => '+01:00 (Madrid, Paris, Berlin)',
|
|
8745
8797
|
17 => '+02:00 (Athens, Helsinki)',
|
|
8746
|
-
18 => '+
|
|
8747
|
-
19 => '+00:00',
|
|
8798
|
+
18 => '+01:00 (Madrid, Paris, Berlin)',
|
|
8799
|
+
19 => '+00:00 (London)',
|
|
8800
|
+
20 => '-01:00 (Azores)',
|
|
8801
|
+
21 => '-02:00 (Fernando de Noronha)',
|
|
8748
8802
|
22 => '-03:00 (Buenos Aires, Sao Paulo)',
|
|
8803
|
+
23 => '-03:30 (Newfoundland)',
|
|
8749
8804
|
24 => '-04:00 (Manaus, Caracas)',
|
|
8750
8805
|
25 => '-05:00 (New York, Toronto, Lima)',
|
|
8751
8806
|
26 => '-06:00 (Chicago, Mexico City)',
|
|
@@ -11311,7 +11366,7 @@ sub PrintAFPointsGridInv($$$)
|
|
|
11311
11366
|
#------------------------------------------------------------------------------
|
|
11312
11367
|
# Print conversion for relative Left/Right AF points (ref 28)
|
|
11313
11368
|
# Inputs: 0) column, 1) number of columns
|
|
11314
|
-
# Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
|
|
11369
|
+
# Returns: AF point data as a string (e.g. '2L of Center' or 'C' or '3R of Center')
|
|
11315
11370
|
sub PrintAFPointsLeftRight($$)
|
|
11316
11371
|
{
|
|
11317
11372
|
my ($col, $ncol) = @_;
|
|
@@ -11324,7 +11379,7 @@ sub PrintAFPointsLeftRight($$)
|
|
|
11324
11379
|
#------------------------------------------------------------------------------
|
|
11325
11380
|
# Print conversion for relative Up/Down AF points (ref 28)
|
|
11326
11381
|
# Inputs: 0) row, 1) number of rows
|
|
11327
|
-
# Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
|
|
11382
|
+
# Returns: AF point data as a string (e.g. '2U from Center' or 'C' or '3D from Center')
|
|
11328
11383
|
sub PrintAFPointsUpDown($$)
|
|
11329
11384
|
{
|
|
11330
11385
|
my ($row, $nrow) = @_;
|
|
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
|
|
|
15
15
|
use strict;
|
|
16
16
|
use vars qw($VERSION);
|
|
17
17
|
|
|
18
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.20';
|
|
19
19
|
|
|
20
20
|
my %buttonsZ9= (
|
|
21
21
|
0 => 'None',
|
|
@@ -74,6 +74,9 @@ my %buttonsZ9= (
|
|
|
74
74
|
82 => 'Select To Send (PC)',
|
|
75
75
|
83 => 'Select To Send (FTP)',
|
|
76
76
|
85 => 'Control Lock',
|
|
77
|
+
86 => 'Save Focus Position',
|
|
78
|
+
87 => 'Recall Focus Position',
|
|
79
|
+
88 => 'Recall Shooting Functions (Hold)',
|
|
77
80
|
);
|
|
78
81
|
my %dialsZ9 = (
|
|
79
82
|
0 => '1 Frame',
|
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
40
40
|
use Image::ExifTool::Exif;
|
|
41
41
|
use Image::ExifTool::APP12;
|
|
42
42
|
|
|
43
|
-
$VERSION = '2.
|
|
43
|
+
$VERSION = '2.78';
|
|
44
44
|
|
|
45
45
|
sub PrintLensInfo($$$);
|
|
46
46
|
|
|
@@ -1911,6 +1911,23 @@ my %indexInfo = (
|
|
|
1911
1911
|
Name => 'FocusBracketStepSize',
|
|
1912
1912
|
Writable => 'int8u',
|
|
1913
1913
|
},
|
|
1914
|
+
0x309 => { #forum13341
|
|
1915
|
+
Name => 'AISubjectTrackingMode',
|
|
1916
|
+
Writable => 'int16u',
|
|
1917
|
+
ValueConv => '($val >> 8) . " " . ($val & 0xff)',
|
|
1918
|
+
ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
|
|
1919
|
+
PrintConv => [{
|
|
1920
|
+
0 => 'Off',
|
|
1921
|
+
1 => 'Motorsports',
|
|
1922
|
+
2 => 'Airplanes',
|
|
1923
|
+
3 => 'Trains',
|
|
1924
|
+
4 => 'Birds',
|
|
1925
|
+
5 => 'Dogs & Cats',
|
|
1926
|
+
},{
|
|
1927
|
+
0 => 'Object Not Found',
|
|
1928
|
+
1 => 'Object Found',
|
|
1929
|
+
}],
|
|
1930
|
+
},
|
|
1914
1931
|
0x400 => { #6
|
|
1915
1932
|
Name => 'FlashMode',
|
|
1916
1933
|
Writable => 'int16u',
|
|
@@ -2538,11 +2555,13 @@ my %indexInfo = (
|
|
|
2538
2555
|
'3 8' => 'ND8 (3EV)', #IB
|
|
2539
2556
|
'3 16' => 'ND16 (4EV)', #IB
|
|
2540
2557
|
'3 32' => 'ND32 (5EV)', #IB
|
|
2558
|
+
'3 64' => 'ND64 (6EV)', #forum13341
|
|
2541
2559
|
'5 4' => 'HDR1', #forum8906
|
|
2542
2560
|
'6 4' => 'HDR2', #forum8906
|
|
2543
2561
|
'8 8' => 'Tripod high resolution', #IB
|
|
2544
2562
|
'9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
|
|
2545
|
-
'11
|
|
2563
|
+
'11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
|
|
2564
|
+
'11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
|
|
2546
2565
|
OTHER => sub {
|
|
2547
2566
|
my ($val, $inv, $conv) = @_;
|
|
2548
2567
|
if ($inv) {
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
require Exporter;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.55';
|
|
25
25
|
|
|
26
26
|
sub FetchObject($$$$);
|
|
27
27
|
sub ExtractObject($$;$$);
|
|
@@ -2276,6 +2276,7 @@ XRef:
|
|
|
2276
2276
|
# load XRef stream in hybrid file if it exists
|
|
2277
2277
|
push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
|
|
2278
2278
|
$encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
|
|
2279
|
+
undef $encrypt if $encrypt and $encrypt eq 'null'; # (have seen "null")
|
|
2279
2280
|
if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
|
|
2280
2281
|
$id = ReadPDFValue($mainDict->{ID}->[0]);
|
|
2281
2282
|
}
|
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
use Image::ExifTool::Exif;
|
|
39
39
|
|
|
40
|
-
$VERSION = '2.
|
|
40
|
+
$VERSION = '2.17';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -2472,6 +2472,15 @@ my %shootingMode = (
|
|
|
2472
2472
|
Start => 12,
|
|
2473
2473
|
},
|
|
2474
2474
|
},
|
|
2475
|
+
0x200080 => { # (GH6)
|
|
2476
|
+
Name => 'ExifData',
|
|
2477
|
+
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
|
|
2478
|
+
SubDirectory => {
|
|
2479
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
|
2480
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
|
2481
|
+
Start => 12,
|
|
2482
|
+
},
|
|
2483
|
+
},
|
|
2475
2484
|
);
|
|
2476
2485
|
|
|
2477
2486
|
# Panasonic Composite tags
|