exiftool_vendored 11.99.0 → 12.06.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +119 -2
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +32 -32
- data/bin/exiftool +55 -50
- data/bin/lib/Image/ExifTool.pm +155 -109
- data/bin/lib/Image/ExifTool.pod +103 -77
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -6
- data/bin/lib/Image/ExifTool/Canon.pm +2 -1
- data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
- data/bin/lib/Image/ExifTool/DPX.pm +56 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +16 -3
- data/bin/lib/Image/ExifTool/Exif.pm +15 -6
- data/bin/lib/Image/ExifTool/Font.pm +9 -2
- data/bin/lib/Image/ExifTool/GIF.pm +5 -0
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +86 -12
- data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +134 -15
- data/bin/lib/Image/ExifTool/Olympus.pm +34 -17
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +147 -13
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +2 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +204 -27
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +355 -19
- data/bin/lib/Image/ExifTool/README +20 -19
- data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -0
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
- data/bin/lib/Image/ExifTool/Sony.pm +376 -11
- data/bin/lib/Image/ExifTool/TagLookup.pm +1949 -1872
- data/bin/lib/Image/ExifTool/TagNames.pod +329 -53
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +23 -15
- data/bin/lib/Image/ExifTool/Writer.pl +44 -21
- data/bin/lib/Image/ExifTool/XMP.pm +41 -4
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +31 -31
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -3
@@ -19,7 +19,7 @@ use strict;
|
|
19
19
|
use vars qw($VERSION %ttLang);
|
20
20
|
use Image::ExifTool qw(:DataAccess :Utils);
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.10';
|
23
23
|
|
24
24
|
sub ProcessOTF($$);
|
25
25
|
|
@@ -589,6 +589,11 @@ sub ProcessFont($$)
|
|
589
589
|
$et->HandleTag($tagTablePtr, 'postfont', $2);
|
590
590
|
}
|
591
591
|
$rtnVal = 1;
|
592
|
+
} elsif ($buff =~ /^(wOF[F2])/) {
|
593
|
+
my $type = $1 eq 'wOFF' ? 'woff' : 'woff2';
|
594
|
+
$et->SetFileType(uc($type), "font/$type");
|
595
|
+
# (don't yet extract metadata from these files)
|
596
|
+
$rtnVal = 1;
|
592
597
|
} else {
|
593
598
|
$rtnVal = 0;
|
594
599
|
}
|
@@ -611,7 +616,9 @@ This module is used by Image::ExifTool
|
|
611
616
|
|
612
617
|
This module contains the routines required by Image::ExifTool to read meta
|
613
618
|
information from various format font files. Currently recognized font file
|
614
|
-
types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM.
|
619
|
+
types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM. As well,
|
620
|
+
WOFF and WOFF2 font files are identified, but metadata is not currently
|
621
|
+
extracted from these formats.
|
615
622
|
|
616
623
|
=head1 AUTHOR
|
617
624
|
|
@@ -115,6 +115,11 @@ my %gifMap = (
|
|
115
115
|
ValueConv => '$val + 1',
|
116
116
|
},
|
117
117
|
5 => 'BackgroundColor',
|
118
|
+
6 => {
|
119
|
+
Name => 'AspectRatio',
|
120
|
+
RawConv => '$val ? $val : undef',
|
121
|
+
ValueConv => '($val + 15) / 64',
|
122
|
+
},
|
118
123
|
);
|
119
124
|
|
120
125
|
# GIF Netscape 2.0 animation extension (ref 3)
|
@@ -573,6 +573,8 @@ my %epsg_vertcs = (
|
|
573
573
|
3053 => 'Hjorsey 1955 Lambert',
|
574
574
|
3057 => 'ISN93 Lambert 1993',
|
575
575
|
3300 => 'Estonian Coordinate System of 1992',
|
576
|
+
3786 => 'Popular Visualisation CRS / Mercator', #PH (NC)
|
577
|
+
3857 => 'WGS 84 / Pseudo-Mercator', #PH (NC)
|
576
578
|
20137 => 'Adindan UTM zone 37N',
|
577
579
|
20138 => 'Adindan UTM zone 38N',
|
578
580
|
20248 => 'AGD66 AMG zone 48',
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::QuickTime;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.04';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -590,6 +590,7 @@ sub ProcessString($$$)
|
|
590
590
|
# Process GoPro metadata (gpmd samples, GPMF box, or APP6) (ref PH/1/2)
|
591
591
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
592
592
|
# Returns: 1 on success
|
593
|
+
# - with hack to check for encrypted text in gpmd data (Rove Stealth 4K)
|
593
594
|
sub ProcessGoPro($$$)
|
594
595
|
{
|
595
596
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
@@ -601,6 +602,14 @@ sub ProcessGoPro($$$)
|
|
601
602
|
my $unknown = $verbose || $et->Options('Unknown');
|
602
603
|
my ($size, $type, $unit, $scal, $setGroup0);
|
603
604
|
|
605
|
+
# the Rove Stealth 4K writes encrypted text here, so check for this first
|
606
|
+
# (really should check for this before loading GoPro module, but I was lazy) PHIL
|
607
|
+
if ($$dataPt =~ /^\0\0\xf2\xe1\xf0\xeeTT/) {
|
608
|
+
$et->VerboseDir('gpmd encrypted text', undef, length($$dataPt));
|
609
|
+
my $strmTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
610
|
+
Image::ExifTool::QuickTime::Process_text($et, $strmTbl, $dataPt);
|
611
|
+
return 1;
|
612
|
+
}
|
604
613
|
$et->VerboseDir($$dirInfo{DirName} || 'GPMF', undef, $dirEnd-$pos) if $verbose;
|
605
614
|
if ($pos) {
|
606
615
|
my $parent = $$dirInfo{Parent};
|
@@ -890,7 +890,7 @@ sub ParsePictureTiming($$)
|
|
890
890
|
|
891
891
|
#------------------------------------------------------------------------------
|
892
892
|
# Process H.264 Supplementary Enhancement Information (ref 1/PH)
|
893
|
-
# Inputs: 0)
|
893
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
894
894
|
# Returns: 1 if we processed payload type 5
|
895
895
|
# Payload types:
|
896
896
|
# 0 - buffer period
|
@@ -1,13 +1,15 @@
|
|
1
1
|
#------------------------------------------------------------------------------
|
2
2
|
# File: ID3.pm
|
3
3
|
#
|
4
|
-
# Description: Read ID3 meta information
|
4
|
+
# Description: Read ID3 and Lyrics3 meta information
|
5
5
|
#
|
6
6
|
# Revisions: 09/12/2005 - P. Harvey Created
|
7
|
+
# 09/08/2020 - PH Added Lyrics3 support
|
7
8
|
#
|
8
9
|
# References: 1) http://www.id3.org/
|
9
10
|
# 2) http://www.mp3-tech.org/
|
10
11
|
# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
|
12
|
+
# 4) https://id3.org/Lyrics3
|
11
13
|
#------------------------------------------------------------------------------
|
12
14
|
|
13
15
|
package Image::ExifTool::ID3;
|
@@ -16,7 +18,7 @@ use strict;
|
|
16
18
|
use vars qw($VERSION);
|
17
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
20
|
|
19
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.55';
|
20
22
|
|
21
23
|
sub ProcessID3v2($$$);
|
22
24
|
sub ProcessPrivate($$$);
|
@@ -68,13 +70,13 @@ my %dateTimeConv = (
|
|
68
70
|
%Image::ExifTool::ID3::Main = (
|
69
71
|
VARS => { NO_ID => 1 },
|
70
72
|
NOTES => q{
|
71
|
-
ExifTool extracts ID3 information from MP3, MPEG, AIFF, OGG,
|
72
|
-
and RealAudio files. ID3v2 tags which support multiple
|
73
|
-
Comment and Lyrics) are extracted by specifying the tag name,
|
74
|
-
dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
75
|
-
See L<http://www.id3.org/> for the official ID3
|
76
|
-
L<http://www.loc.gov/standards/iso639-2/php/code_list.php>
|
77
|
-
639-2 language codes.
|
73
|
+
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, AIFF, OGG,
|
74
|
+
FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
75
|
+
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
76
|
+
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
77
|
+
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
|
78
|
+
specification and L<http://www.loc.gov/standards/iso639-2/php/code_list.php>
|
79
|
+
for a list of ISO 639-2 language codes.
|
78
80
|
},
|
79
81
|
ID3v1 => {
|
80
82
|
Name => 'ID3v1',
|
@@ -98,6 +100,24 @@ my %dateTimeConv = (
|
|
98
100
|
},
|
99
101
|
);
|
100
102
|
|
103
|
+
# Lyrics3 tags (ref 4)
|
104
|
+
%Image::ExifTool::ID3::Lyrics3 = (
|
105
|
+
GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' },
|
106
|
+
NOTES => q{
|
107
|
+
ExifTool extracts Lyrics3 version 1.00 and 2.00 tags from any file that
|
108
|
+
supports ID3. See L<https://id3.org/Lyrics3> for the specification.
|
109
|
+
},
|
110
|
+
IND => 'Indications',
|
111
|
+
LYR => 'Lyrics',
|
112
|
+
INF => 'AdditionalInfo',
|
113
|
+
AUT => { Name => 'Author', Groups => { 2 => 'Author' } },
|
114
|
+
EAL => 'ExtendedAlbumName',
|
115
|
+
EAR => 'ExtendedArtistName',
|
116
|
+
ETT => 'ExtendedTrackTitle',
|
117
|
+
IMG => 'AssociatedImageFile',
|
118
|
+
CRC => 'CRC', #PH
|
119
|
+
);
|
120
|
+
|
101
121
|
# Mapping for ID3v1 Genre numbers
|
102
122
|
my %genre = (
|
103
123
|
0 => 'Blues',
|
@@ -1347,7 +1367,7 @@ sub ProcessID3v2($$$)
|
|
1347
1367
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
1348
1368
|
# Returns: 1 on success, 0 if this file didn't contain ID3 information
|
1349
1369
|
# - also processes audio data if any ID3 information was found
|
1350
|
-
# - sets ExifTool DoneID3 to 1 when called, or to
|
1370
|
+
# - sets ExifTool DoneID3 to 1 when called, or to trailer size if an ID3v1 trailer exists
|
1351
1371
|
sub ProcessID3($$)
|
1352
1372
|
{
|
1353
1373
|
my ($et, $dirInfo) = @_;
|
@@ -1426,8 +1446,9 @@ sub ProcessID3($$)
|
|
1426
1446
|
#
|
1427
1447
|
# read ID3v1 trailer if it exists
|
1428
1448
|
#
|
1449
|
+
my $trailSize = 0;
|
1429
1450
|
if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) {
|
1430
|
-
|
1451
|
+
$trailSize = 128;
|
1431
1452
|
%id3Trailer = (
|
1432
1453
|
DataPt => \$tBuff,
|
1433
1454
|
DataPos => $raf->Tell() - 128,
|
@@ -1437,8 +1458,59 @@ sub ProcessID3($$)
|
|
1437
1458
|
$id3Len += length($tBuff);
|
1438
1459
|
$rtnVal = 1;
|
1439
1460
|
# load 'Enhanced TAG' information if available
|
1440
|
-
|
1461
|
+
my $eSize = 227; # size of ID3 Enhanced TAG info
|
1462
|
+
if ($raf->Seek(-$trailSize - $eSize, 2) and $raf->Read($eBuff, $eSize) == $eSize and $eBuff =~ /^TAG+/) {
|
1441
1463
|
$id3Trailer{EnhancedTAG} = \$eBuff;
|
1464
|
+
$trailSize += $eSize;
|
1465
|
+
}
|
1466
|
+
$$et{DoneID3} = $trailSize; # save trailer size
|
1467
|
+
}
|
1468
|
+
#
|
1469
|
+
# read Lyrics3 trailer if it exists
|
1470
|
+
#
|
1471
|
+
if ($raf->Seek(-$trailSize-15, 2) and $raf->Read($buff, 15) == 15 and $buff =~ /^(.{6})LYRICS(END|200)$/) {
|
1472
|
+
my $ver = $2; # Lyrics3 version ('END' for version 1)
|
1473
|
+
my $len = ($ver eq 'END') ? 5100 : $1 + 15; # max Lyrics3 length
|
1474
|
+
my $tbl = GetTagTable('Image::ExifTool::ID3::Lyrics3');
|
1475
|
+
$len = $raf->Tell() if $len > $raf->Tell();
|
1476
|
+
if ($raf->Seek(-$len, 1) and $raf->Read($buff, $len) == $len and $buff =~ /LYRICSBEGIN/g) {
|
1477
|
+
my $pos = pos($buff);
|
1478
|
+
$$et{DoneID3} = $trailSize + $len - $pos + 11; # update trailer length
|
1479
|
+
my $oldIndent = $$et{INDENT};
|
1480
|
+
$$et{INDENT} .= '| ';
|
1481
|
+
if ($et->Options('Verbose')) {
|
1482
|
+
$et->VPrint(0, "Lyrics3:\n");
|
1483
|
+
$et->VerboseDir('Lyrics3', undef, $len);
|
1484
|
+
if ($pos > 11) {
|
1485
|
+
$buff = substr($buff, $pos - 11);
|
1486
|
+
$pos = 11;
|
1487
|
+
}
|
1488
|
+
$et->VerboseDump(\$buff);
|
1489
|
+
}
|
1490
|
+
if ($ver eq 'END') {
|
1491
|
+
# Lyrics3 v1.00
|
1492
|
+
my $val = substr($buff, $pos, $len - $pos - 9);
|
1493
|
+
$et->HandleTag($tbl, 'LYR', $et->Decode($val, 'Latin'));
|
1494
|
+
} else {
|
1495
|
+
# Lyrics3 v2.00
|
1496
|
+
for (;;) {
|
1497
|
+
# (note: the size field is 5 digits,, not 6 as per the documentation)
|
1498
|
+
last unless $buff =~ /\G(.{3})(\d{5})/g;
|
1499
|
+
my ($tag, $size) = ($1, $2);
|
1500
|
+
$pos += 8;
|
1501
|
+
last if $pos + $size > length($buff);
|
1502
|
+
unless ($$tbl{$tag}) {
|
1503
|
+
AddTagToTable($tbl, $tag, { Name => Image::ExifTool::MakeTagName("Lyrics3_$tag") });
|
1504
|
+
}
|
1505
|
+
$et->HandleTag($tbl, $tag, $et->Decode(substr($buff, $pos, $size), 'Latin'));
|
1506
|
+
$pos += $size;
|
1507
|
+
pos($buff) = $pos;
|
1508
|
+
}
|
1509
|
+
$pos == length($buff) - 15 or $et->Warn('Malformed Lyrics3 v2.00 block');
|
1510
|
+
}
|
1511
|
+
$$et{INDENT} = $oldIndent;
|
1512
|
+
} else {
|
1513
|
+
$et->Warn('Error reading Lyrics3 trailer');
|
1442
1514
|
}
|
1443
1515
|
}
|
1444
1516
|
#
|
@@ -1583,6 +1655,8 @@ under the same terms as Perl itself.
|
|
1583
1655
|
|
1584
1656
|
=item L<http://www.fortunecity.com/underworld/sonic/3/id3tag.html>
|
1585
1657
|
|
1658
|
+
=item L<https://id3.org/Lyrics3>
|
1659
|
+
|
1586
1660
|
=back
|
1587
1661
|
|
1588
1662
|
=head1 SEE ALSO
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::de;
|
|
11
11
|
use strict;
|
12
12
|
use vars qw($VERSION);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.36';
|
15
15
|
|
16
16
|
%Image::ExifTool::Lang::de::Translate = (
|
17
17
|
'AEAperture' => 'AE-Blende',
|
@@ -993,7 +993,9 @@ $VERSION = '1.35';
|
|
993
993
|
},
|
994
994
|
},
|
995
995
|
'AdvancedSceneMode' => {
|
996
|
+
Description => 'Erweiteter Szenenmodus',
|
996
997
|
PrintConv => {
|
998
|
+
'Off' => 'Aus',
|
997
999
|
'Creative Macro' => 'Makro kreativ',
|
998
1000
|
'Flower' => 'Blumen',
|
999
1001
|
'HDR B&W' => 'HDR Schwarz-Weiß',
|
@@ -1302,7 +1302,7 @@ $VERSION = '1.16';
|
|
1302
1302
|
'ExifImageHeight' => 'Alto Imagen',
|
1303
1303
|
'ExifImageWidth' => 'Ancho Imagen',
|
1304
1304
|
'ExifOffset' => 'Puntero Exif IFD',
|
1305
|
-
'ExifToolVersion' => 'Versión
|
1305
|
+
'ExifToolVersion' => 'Versión ExifTool',
|
1306
1306
|
'ExifVersion' => 'Versión Exif',
|
1307
1307
|
'ExpandFilm' => 'Película Expandida',
|
1308
1308
|
'ExpandFilterLens' => 'Filtro Objetivo Expandida',
|
@@ -262,7 +262,7 @@ sub ParseAC3Descriptor($$)
|
|
262
262
|
|
263
263
|
#------------------------------------------------------------------------------
|
264
264
|
# Parse PID stream data
|
265
|
-
# Inputs: 0)
|
265
|
+
# Inputs: 0) ExifTool ref, 1) PID number, 2) PID type, 3) PID name, 4) data ref
|
266
266
|
# Returns: 0=stream parsed OK,
|
267
267
|
# 1=stream parsed but we want to parse more of these,
|
268
268
|
# -1=can't parse yet because we don't know the type
|
@@ -325,7 +325,7 @@ sub MDItemLocalTime($)
|
|
325
325
|
|
326
326
|
#------------------------------------------------------------------------------
|
327
327
|
# Set MacOS MDItem and XAttr tags from new tag values
|
328
|
-
# Inputs: 0)
|
328
|
+
# Inputs: 0) ExifTool ref, 1) file name, 2) list of tags to set
|
329
329
|
# Returns: 1=something was set OK, 0=didn't try, -1=error (and warning set)
|
330
330
|
# Notes: There may be errors even if 1 is returned
|
331
331
|
sub SetMacOSTags($$$)
|
@@ -49,7 +49,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
|
|
49
49
|
use Image::ExifTool qw(:DataAccess :Utils);
|
50
50
|
use Image::ExifTool::Exif;
|
51
51
|
|
52
|
-
$VERSION = '2.
|
52
|
+
$VERSION = '2.84';
|
53
53
|
|
54
54
|
# Full list of product codes for Sony-compatible Minolta lenses
|
55
55
|
# (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
|
@@ -608,7 +608,8 @@ $VERSION = '2.83';
|
|
608
608
|
103 => 'Light', #JD
|
609
609
|
104 => 'Night View', #JD
|
610
610
|
105 => 'Autumn Leaves', #JD
|
611
|
-
|
611
|
+
255 => 'Off', #JR (new for ILCE-7SM3, July 2020)
|
612
|
+
0xffffffff => 'n/a', #PH
|
612
613
|
);
|
613
614
|
|
614
615
|
%minoltaSceneMode = (
|
@@ -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 = '3.
|
65
|
+
$VERSION = '3.86';
|
66
66
|
|
67
67
|
sub LensIDConv($$$);
|
68
68
|
sub ProcessNikonAVI($$$);
|
@@ -449,6 +449,7 @@ sub GetAFPointGrid($$;$);
|
|
449
449
|
# '92 3E 2D 88 2C 40 4B 0E' (22mm)
|
450
450
|
# '92 40 2D 88 2C 40 4B 0E' (18mm)
|
451
451
|
'26 48 31 49 24 24 1C 02' => 'Sigma 20-40mm F2.8',
|
452
|
+
'7B 48 37 44 18 18 4B 06' => 'Sigma 24-35mm F2.0 DG HSM | A', #30
|
452
453
|
'02 3A 37 50 31 3D 02 00' => 'Sigma 24-50mm F4-5.6 UC',
|
453
454
|
'26 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
|
454
455
|
'B6 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
|
@@ -513,6 +514,7 @@ sub GetAFPointGrid($$;$);
|
|
513
514
|
'CE 34 76 A0 38 40 4B 0E' => 'Sigma 150-500mm F5-6.3 DG OS APO HSM', #JD
|
514
515
|
'81 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', #Jaap Voets
|
515
516
|
'82 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | C',
|
517
|
+
'C4 4C 73 73 14 14 4B 46' => 'Sigma 135mm F1.8 DG HSM | A', #forum3833
|
516
518
|
'26 40 7B A0 34 40 1C 02' => 'Sigma APO 170-500mm F5-6.3 Aspherical RF',
|
517
519
|
'A7 49 80 A0 24 24 4B 06' => 'Sigma APO 200-500mm F2.8 EX DG',
|
518
520
|
'48 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM',
|
@@ -579,6 +581,7 @@ sub GetAFPointGrid($$;$);
|
|
579
581
|
'4D 41 3C 8E 2B 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)',
|
580
582
|
'4D 41 3C 8E 2C 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)',
|
581
583
|
'F9 40 3C 8E 2C 40 40 0E' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)',
|
584
|
+
'C9 3C 44 76 25 31 DF 4E' => 'Tamron 35-150mm f/2.8-4 Di VC OSD (A043)', #30
|
582
585
|
'00 47 53 80 30 3C 00 06' => 'Tamron AF 55-200mm f/4-5.6 Di II LD (A15)',
|
583
586
|
'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
584
587
|
'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
@@ -711,6 +714,7 @@ sub GetAFPointGrid($$;$);
|
|
711
714
|
'00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS',
|
712
715
|
'00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
|
713
716
|
'00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
|
717
|
+
'4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
|
714
718
|
);
|
715
719
|
|
716
720
|
# text encoding used in LocationInfo (ref PH)
|
@@ -878,6 +882,38 @@ my %afPoints39 = (
|
|
878
882
|
10 => 'E3', 20 => 'B9', 30 => 'D4',
|
879
883
|
);
|
880
884
|
|
885
|
+
# AF point indices for models with 105 focus points, eg. D6 (ref 28)
|
886
|
+
# - 7 rows (A-G) with 15 columns (1-15), center is D8
|
887
|
+
my %afPoints105 = (
|
888
|
+
1 => 'D8', 28 => 'G7', 55 => 'F13', 82 => 'E4',
|
889
|
+
2 => 'C8', 29 => 'D6', 56 => 'G13', 83 => 'F4',
|
890
|
+
3 => 'B8', 30 => 'C6', 57 => 'D14', 84 => 'G4',
|
891
|
+
4 => 'A8', 31 => 'B6', 58 => 'C14', 85 => 'D3',
|
892
|
+
5 => 'E8', 32 => 'A6', 59 => 'B14', 86 => 'C3',
|
893
|
+
6 => 'F8', 33 => 'E6', 60 => 'A14', 87 => 'B3',
|
894
|
+
7 => 'G8', 34 => 'F6', 61 => 'E14', 88 => 'A3',
|
895
|
+
8 => 'D9', 35 => 'G6', 62 => 'F14', 89 => 'E3',
|
896
|
+
9 => 'C9', 36 => 'D11', 63 => 'G14', 90 => 'F3',
|
897
|
+
10 => 'B9', 37 => 'C11', 64 => 'D15', 91 => 'G3',
|
898
|
+
11 => 'A9', 38 => 'B11', 65 => 'C15', 92 => 'D2',
|
899
|
+
12 => 'E9', 39 => 'A11', 66 => 'B15', 93 => 'C2',
|
900
|
+
13 => 'F9', 40 => 'E11', 67 => 'A15', 94 => 'B2',
|
901
|
+
14 => 'G9', 41 => 'F11', 68 => 'E15', 95 => 'A2',
|
902
|
+
15 => 'D10', 42 => 'G11', 69 => 'F15', 96 => 'E2',
|
903
|
+
16 => 'C10', 43 => 'D12', 70 => 'G15', 97 => 'F2',
|
904
|
+
17 => 'B10', 44 => 'C12', 71 => 'D5', 98 => 'G2',
|
905
|
+
18 => 'A10', 45 => 'B12', 72 => 'C5', 99 => 'D1',
|
906
|
+
19 => 'E10', 46 => 'A12', 73 => 'B5', 100 => 'C1',
|
907
|
+
20 => 'F10', 47 => 'E12', 74 => 'A5', 101 => 'B1',
|
908
|
+
21 => 'G10', 48 => 'F12', 75 => 'E5', 102 => 'A1',
|
909
|
+
22 => 'D7', 49 => 'G12', 76 => 'F5', 103 => 'E1',
|
910
|
+
23 => 'C7', 50 => 'D13', 77 => 'G5', 104 => 'F1',
|
911
|
+
24 => 'B7', 51 => 'C13', 78 => 'D4', 105 => 'G1',
|
912
|
+
25 => 'A7', 52 => 'B13', 79 => 'C4',
|
913
|
+
26 => 'E7', 53 => 'A13', 80 => 'B4',
|
914
|
+
27 => 'F7', 54 => 'E13', 81 => 'A4',
|
915
|
+
);
|
916
|
+
|
881
917
|
# AF point indices for models with 135 focus points, eg. 1J1 (ref PH)
|
882
918
|
# - 9 rows (A-I) with 15 columns (1-15), center is E8
|
883
919
|
# - odd columns, columns 2 and 14, and the remaining corner points are
|
@@ -1540,7 +1576,7 @@ my %binaryDataAttrs = (
|
|
1540
1576
|
0x008c => {
|
1541
1577
|
Name => 'ContrastCurve', #JD
|
1542
1578
|
Writable => 'undef',
|
1543
|
-
Flags => [ 'Binary', 'Protected' ],
|
1579
|
+
Flags => [ 'Binary', 'Protected', 'Drop' ], # (drop because not found in Nikon JPEG's)
|
1544
1580
|
},
|
1545
1581
|
# ColorHue: MODE1/MODE1a=sRGB, MODE2=Adobe RGB, MODE3a=more saturated sRGB
|
1546
1582
|
# --> should really be called ColorSpace or ColorMode, but that would conflict with other tags
|
@@ -1785,6 +1821,16 @@ my %binaryDataAttrs = (
|
|
1785
1821
|
ByteOrder => 'LittleEndian',
|
1786
1822
|
},
|
1787
1823
|
},
|
1824
|
+
{ # (D6 firmware version 1.00, ref 28)
|
1825
|
+
Condition => '$$valPt =~ /^0246/',
|
1826
|
+
Name => 'ShotInfoD6',
|
1827
|
+
SubDirectory => {
|
1828
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfo',
|
1829
|
+
DecryptStart => 4,
|
1830
|
+
DecryptLen => 0xa4, # only decrypt the version info & offset fields for now
|
1831
|
+
ByteOrder => 'LittleEndian',
|
1832
|
+
},
|
1833
|
+
},
|
1788
1834
|
{ # (D610 firmware version 1.00)
|
1789
1835
|
Condition => '$$valPt =~ /^0232/',
|
1790
1836
|
Name => 'ShotInfoD610',
|
@@ -1834,6 +1880,7 @@ my %binaryDataAttrs = (
|
|
1834
1880
|
7 => 'Unpacked 12 bits', #IB (padded to 16)
|
1835
1881
|
8 => 'Small', #IB
|
1836
1882
|
9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
|
1883
|
+
10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
|
1837
1884
|
},
|
1838
1885
|
},
|
1839
1886
|
0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
|
@@ -3300,6 +3347,7 @@ my %binaryDataAttrs = (
|
|
3300
3347
|
15 => 'Dynamic Area (72 points)', #PH
|
3301
3348
|
16 => 'Group Area (HL)', #28
|
3302
3349
|
17 => 'Group Area (VL)', #28
|
3350
|
+
18 => 'Dynamic Area (49 points)', #28
|
3303
3351
|
128 => 'Single', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V2,1V3)
|
3304
3352
|
129 => 'Auto (41 points)', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V1,1V2,1V3,AW1)
|
3305
3353
|
130 => 'Subject Tracking (41 points)', #PH (1J1,1J4,1J3)
|
@@ -3337,6 +3385,10 @@ my %binaryDataAttrs = (
|
|
3337
3385
|
197 => 'Auto', #PH (Z7)
|
3338
3386
|
198 => 'Auto (198)', #PH (Z7) (focus lock with AF-C maybe?)
|
3339
3387
|
199 => 'Auto (focus lock)', #PH (Z7, AF-S)
|
3388
|
+
200 => 'Normal-area AF', #28 (D6)
|
3389
|
+
201 => 'Wide-area AF', #28 (D6)
|
3390
|
+
202 => 'Face-priority AF', #28 (D6)
|
3391
|
+
203 => 'Subject-tracking AF', #28 (D6)
|
3340
3392
|
},
|
3341
3393
|
},
|
3342
3394
|
],
|
@@ -3355,12 +3407,14 @@ my %binaryDataAttrs = (
|
|
3355
3407
|
6 => 'On (105-point)', #PH (1J4/1V3[128/130])
|
3356
3408
|
7 => 'On (153-point)', #PH (D5/D500/D850)
|
3357
3409
|
8 => 'On (81-point)', #38
|
3410
|
+
9 => 'On (105-point)', #28 (D6)
|
3358
3411
|
},
|
3359
3412
|
},
|
3360
3413
|
7 => [
|
3361
3414
|
{ #PH/JD
|
3362
3415
|
Name => 'PrimaryAFPoint',
|
3363
|
-
|
3416
|
+
# PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28)
|
3417
|
+
Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
|
3364
3418
|
Notes => q{
|
3365
3419
|
models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
|
3366
3420
|
D4, D4S, D300, D300S, D700, D800, D800e and D810
|
@@ -3495,7 +3549,7 @@ my %binaryDataAttrs = (
|
|
3495
3549
|
8 => [
|
3496
3550
|
{ #JD/PH
|
3497
3551
|
Name => 'AFPointsUsed',
|
3498
|
-
Condition => '$$self{PhaseDetectAF} < 2',
|
3552
|
+
Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
|
3499
3553
|
Notes => q{
|
3500
3554
|
models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
|
3501
3555
|
point is C6
|
@@ -3614,6 +3668,8 @@ my %binaryDataAttrs = (
|
|
3614
3668
|
},
|
3615
3669
|
{ #PH
|
3616
3670
|
Name => 'AFPointsUsed',
|
3671
|
+
# version 301 uses a separate field at offset 0x0a for this tag (ref 28)
|
3672
|
+
Condition => '$$self{AFInfo2Version} ne "0301"',
|
3617
3673
|
Format => 'undef[7]',
|
3618
3674
|
ValueConv => 'join(" ", unpack("H2"x7, $val))',
|
3619
3675
|
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
@@ -3621,6 +3677,19 @@ my %binaryDataAttrs = (
|
|
3621
3677
|
PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
|
3622
3678
|
},
|
3623
3679
|
],
|
3680
|
+
0x0a => { #28 (D6) in any of the 3 Group modes on the D6, the points specify the outer boundaries of the focus point area; otherwise the tag value is consistent with other Nikon bodies
|
3681
|
+
Name => 'AFPointsUsed',
|
3682
|
+
Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
|
3683
|
+
Notes => q{
|
3684
|
+
models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
|
3685
|
+
point is D8
|
3686
|
+
},
|
3687
|
+
Format => 'undef[14]',
|
3688
|
+
ValueConv => 'join(" ", unpack("H2"x14, $val))',
|
3689
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3690
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
|
3691
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
|
3692
|
+
},
|
3624
3693
|
0x10 => { #PH (D90 and D5000)
|
3625
3694
|
Name => 'AFImageWidth',
|
3626
3695
|
Condition => '$$self{AFInfo2Version} eq "0100"',
|
@@ -3663,11 +3732,21 @@ my %binaryDataAttrs = (
|
|
3663
3732
|
Format => 'int16u',
|
3664
3733
|
RawConv => '$val ? $val : undef',
|
3665
3734
|
},
|
3666
|
-
0x1c =>
|
3667
|
-
|
3668
|
-
|
3669
|
-
|
3670
|
-
|
3735
|
+
0x1c => [
|
3736
|
+
{ #PH
|
3737
|
+
Name => 'ContrastDetectAFInFocus',
|
3738
|
+
Condition => '$$self{AFInfo2Version} eq "0100"',
|
3739
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
3740
|
+
},{ #PH (D500, see forum11190)
|
3741
|
+
Name => 'AFPointsSelected',
|
3742
|
+
Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
|
3743
|
+
Format => 'undef[20]',
|
3744
|
+
ValueConv => 'join(" ", unpack("H2"x20, $val))',
|
3745
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3746
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
|
3747
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
|
3748
|
+
},
|
3749
|
+
],
|
3671
3750
|
# 0x1d - always zero (with or without live view)
|
3672
3751
|
0x2a => { #PH (Z7)
|
3673
3752
|
Name => 'AFImageWidth',
|
@@ -3683,14 +3762,31 @@ my %binaryDataAttrs = (
|
|
3683
3762
|
},
|
3684
3763
|
0x2e => { #PH (Z7)
|
3685
3764
|
Name => 'AFAreaXPosition',
|
3686
|
-
Condition =>
|
3687
|
-
|
3688
|
-
|
3689
|
-
|
3690
|
-
Name => 'AFAreaYPosition',
|
3691
|
-
Condition => '$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/',
|
3765
|
+
Condition => q{
|
3766
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3767
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3768
|
+
},
|
3692
3769
|
Format => 'int16u',
|
3693
3770
|
},
|
3771
|
+
0x30 => [
|
3772
|
+
{ #PH (Z7)
|
3773
|
+
Name => 'AFAreaYPosition',
|
3774
|
+
Condition => q{
|
3775
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3776
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3777
|
+
},
|
3778
|
+
Format => 'int16u',
|
3779
|
+
},{ #PH (D500, see forum11190)
|
3780
|
+
Name => 'AFPointsInFocus',
|
3781
|
+
Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
|
3782
|
+
Notes => 'AF points in focus at the time time image was captured',
|
3783
|
+
Format => 'undef[20]',
|
3784
|
+
ValueConv => 'join(" ", unpack("H2"x20, $val))',
|
3785
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3786
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
|
3787
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
|
3788
|
+
},
|
3789
|
+
],
|
3694
3790
|
0x32 => { #PH (Z7)
|
3695
3791
|
Name => 'AFAreaWidth',
|
3696
3792
|
Condition => '$$self{AFInfo2Version} =~ /^03/',
|
@@ -3703,6 +3799,19 @@ my %binaryDataAttrs = (
|
|
3703
3799
|
Format => 'int16u',
|
3704
3800
|
RawConv => '$val ? $val : undef',
|
3705
3801
|
},
|
3802
|
+
0x38 => { #28
|
3803
|
+
Name => 'PrimaryAFPoint',
|
3804
|
+
Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/',
|
3805
|
+
Notes => q{
|
3806
|
+
Nikon models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15): D6
|
3807
|
+
},
|
3808
|
+
PrintConvColumns => 5,
|
3809
|
+
PrintConv => {
|
3810
|
+
0 => '(none)',
|
3811
|
+
%afPoints105,
|
3812
|
+
1 => 'D8 (Center)',
|
3813
|
+
},
|
3814
|
+
},
|
3706
3815
|
0x44 => [
|
3707
3816
|
{
|
3708
3817
|
Name => 'PrimaryAFPoint',
|
@@ -3802,6 +3911,7 @@ my %binaryDataAttrs = (
|
|
3802
3911
|
# (don't know what the difference between 1 and 2 is)
|
3803
3912
|
1 => 'On (1)',
|
3804
3913
|
2 => 'On (2)',
|
3914
|
+
3 => 'On (Zoom)', #28
|
3805
3915
|
},
|
3806
3916
|
},
|
3807
3917
|
1 => {
|
@@ -3811,6 +3921,7 @@ my %binaryDataAttrs = (
|
|
3811
3921
|
PrintConvInv => '$val eq "n/a" ? 255 : $val',
|
3812
3922
|
},
|
3813
3923
|
2 => {
|
3924
|
+
# when AFFineTune = 3 (indicating a zoom lens), this Tag stores the tuning adjustment for the wide end of the zoom range (ref 28)
|
3814
3925
|
Name => 'AFFineTuneAdj',
|
3815
3926
|
Priority => 0, # so other value takes priority if it exists
|
3816
3927
|
Notes => 'may only be valid for saved lenses',
|
@@ -3818,6 +3929,14 @@ my %binaryDataAttrs = (
|
|
3818
3929
|
PrintConv => '$val > 0 ? "+$val" : $val',
|
3819
3930
|
PrintConvInv => '$val',
|
3820
3931
|
},
|
3932
|
+
3 => {
|
3933
|
+
Name => 'AFFineTuneAdjTele',
|
3934
|
+
# should probably insert a Condition that restricts this to AFFineTune = 3 (ref 28)
|
3935
|
+
Notes => 'only valid for zoom lenses (ie, AFTune=3)',
|
3936
|
+
Format => 'int8s',
|
3937
|
+
PrintConv => '$val > 0 ? "+$val" : $val',
|
3938
|
+
PrintConvInv => '$val',
|
3939
|
+
},
|
3821
3940
|
);
|
3822
3941
|
|
3823
3942
|
# Nikon NEF processing information (ref forum6281)
|