exiftool_vendored 11.99.0 → 12.11.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 +201 -2
- data/bin/MANIFEST +8 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +43 -42
- data/bin/exiftool +172 -99
- data/bin/lib/Image/ExifTool.pm +170 -117
- data/bin/lib/Image/ExifTool.pod +132 -97
- 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 +21 -10
- data/bin/lib/Image/ExifTool/Canon.pm +202 -13
- 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 +22 -3
- data/bin/lib/Image/ExifTool/EXE.pm +8 -5
- 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 +6 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +48 -22
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +86 -12
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
- data/bin/lib/Image/ExifTool/Import.pm +12 -9
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- 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/MPF.pm +2 -2
- data/bin/lib/Image/ExifTool/MacOS.pm +154 -38
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +143 -17
- data/bin/lib/Image/ExifTool/Olympus.pm +40 -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 +148 -14
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +11 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +240 -37
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
- data/bin/lib/Image/ExifTool/README +25 -21
- data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
- data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
- 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 +423 -39
- data/bin/lib/Image/ExifTool/Stim.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5798 -5675
- data/bin/lib/Image/ExifTool/TagNames.pod +575 -100
- 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 +30 -21
- data/bin/lib/Image/ExifTool/Writer.pl +49 -24
- data/bin/lib/Image/ExifTool/XMP.pm +99 -17
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +42 -41
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -8
@@ -14,16 +14,33 @@ use vars qw($VERSION);
|
|
14
14
|
use Image::ExifTool qw(:DataAccess :Utils);
|
15
15
|
use Image::ExifTool::Import;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.02';
|
18
18
|
|
19
19
|
sub ProcessTag($$$$%);
|
20
20
|
|
21
21
|
%Image::ExifTool::JSON::Main = (
|
22
22
|
GROUPS => { 0 => 'JSON', 1 => 'JSON', 2 => 'Other' },
|
23
|
+
VARS => { NO_ID => 1 },
|
23
24
|
NOTES => q{
|
24
|
-
|
25
|
-
tags from basic
|
25
|
+
Other than a few tags in the table below, JSON tags have not been
|
26
|
+
pre-defined. However, ExifTool will read any existing tags from basic
|
27
|
+
JSON-formatted files.
|
26
28
|
},
|
29
|
+
# ON1 settings tags
|
30
|
+
ON1_SettingsData => {
|
31
|
+
RawConv => q{
|
32
|
+
require Image::ExifTool::XMP;
|
33
|
+
$val = Image::ExifTool::XMP::DecodeBase64($val);
|
34
|
+
},
|
35
|
+
SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
|
36
|
+
},
|
37
|
+
ON1_SettingsMetadataCreated => { Groups => { 2 => 'Time' } },
|
38
|
+
ON1_SettingsMetadataModified => { Groups => { 2 => 'Time' } },
|
39
|
+
ON1_SettingsMetadataName => { },
|
40
|
+
ON1_SettingsMetadataPluginID => { },
|
41
|
+
ON1_SettingsMetadataTimestamp => { Groups => { 2 => 'Time' } },
|
42
|
+
ON1_SettingsMetadataUsage => { },
|
43
|
+
ON1_SettingsMetadataVisibleToUser=>{ },
|
27
44
|
);
|
28
45
|
|
29
46
|
#------------------------------------------------------------------------------
|
@@ -33,12 +50,18 @@ sub FoundTag($$$$%)
|
|
33
50
|
{
|
34
51
|
my ($et, $tagTablePtr, $tag, $val, %flags) = @_;
|
35
52
|
|
53
|
+
# special case to reformat ON1 tag names
|
54
|
+
if ($tag =~ s/^settings\w{8}-\w{4}-\w{4}-\w{4}-\w{12}(Data|Metadata.+)$/ON1_Settings$1/) {
|
55
|
+
$et->OverrideFileType('ONP','application/on1') if $$et{FILE_TYPE} eq 'JSON';
|
56
|
+
}
|
57
|
+
|
36
58
|
# avoid conflict with special table entries
|
37
59
|
$tag .= '!' if $Image::ExifTool::specialTags{$tag};
|
38
60
|
|
39
61
|
AddTagToTable($tagTablePtr, $tag, {
|
40
62
|
Name => Image::ExifTool::MakeTagName($tag),
|
41
63
|
%flags,
|
64
|
+
Temporary => 1,
|
42
65
|
}) unless $$tagTablePtr{$tag};
|
43
66
|
|
44
67
|
$et->HandleTag($tagTablePtr, $tag, $val);
|
@@ -94,7 +117,7 @@ sub ProcessJSON($$)
|
|
94
117
|
|
95
118
|
# remove any old tag definitions in case they change flags
|
96
119
|
foreach $key (TagTableKeys($tagTablePtr)) {
|
97
|
-
delete $$tagTablePtr{$key};
|
120
|
+
delete $$tagTablePtr{$key} if $$tagTablePtr{$key}{Temporary};
|
98
121
|
}
|
99
122
|
|
100
123
|
# extract tags from JSON database
|
@@ -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
|
@@ -28,8 +28,8 @@ sub ProcessMPImageList($$$);
|
|
28
28
|
from this segment is stored as a JPEG trailer. The MPF tags are not
|
29
29
|
writable, however the MPF segment may be deleted as a group (with "MPF:All")
|
30
30
|
but then the JPEG trailer should also be deleted (with "Trailer:All"). See
|
31
|
-
L<http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
32
|
-
specification.
|
31
|
+
L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
32
|
+
for the official specification.
|
33
33
|
},
|
34
34
|
0xb000 => 'MPFVersion',
|
35
35
|
0xb001 => 'NumberOfImages',
|
@@ -4,6 +4,7 @@
|
|
4
4
|
# Description: Read/write MacOS system tags
|
5
5
|
#
|
6
6
|
# Revisions: 2017/03/01 - P. Harvey Created
|
7
|
+
# 2020/10/13 - PH Added ability to read MacOS "._" files
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
|
9
10
|
package Image::ExifTool::MacOS;
|
@@ -11,15 +12,38 @@ use strict;
|
|
11
12
|
use vars qw($VERSION);
|
12
13
|
use Image::ExifTool qw(:DataAccess :Utils);
|
13
14
|
|
14
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.11';
|
15
16
|
|
16
17
|
sub MDItemLocalTime($);
|
18
|
+
sub ProcessATTR($$$);
|
17
19
|
|
18
20
|
my %mdDateInfo = (
|
19
21
|
ValueConv => \&MDItemLocalTime,
|
20
22
|
PrintConv => '$self->ConvertDateTime($val)',
|
21
23
|
);
|
22
24
|
|
25
|
+
# Information decoded from Mac OS sidecar files
|
26
|
+
%Image::ExifTool::MacOS::Main = (
|
27
|
+
GROUPS => { 0 => 'File', 1 => 'MacOS' },
|
28
|
+
NOTES => q{
|
29
|
+
Note that on some filesystems, MacOS creates sidecar files with names that
|
30
|
+
begin with "._". ExifTool will read these files if specified, and extract
|
31
|
+
the information listed in the following table without the need for extra
|
32
|
+
options, but these files are not writable directly.
|
33
|
+
},
|
34
|
+
2 => {
|
35
|
+
Name => 'RSRC',
|
36
|
+
SubDirectory => { TagTable => 'Image::ExifTool::RSRC::Main' },
|
37
|
+
},
|
38
|
+
9 => {
|
39
|
+
Name => 'ATTR',
|
40
|
+
SubDirectory => {
|
41
|
+
TagTable => 'Image::ExifTool::MacOS::XAttr',
|
42
|
+
ProcessProc => \&ProcessATTR,
|
43
|
+
},
|
44
|
+
},
|
45
|
+
);
|
46
|
+
|
23
47
|
# "mdls" tags (ref PH)
|
24
48
|
%Image::ExifTool::MacOS::MDItem = (
|
25
49
|
WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
|
@@ -221,6 +245,8 @@ my %mdDateInfo = (
|
|
221
245
|
XAttr tags are extracted using the "xattr" utility. They are extracted if
|
222
246
|
any "XAttr*" tag or the MacOS group is specifically requested, or by setting
|
223
247
|
the L<XAttrTags|../ExifTool.html#XAttrTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or higher.
|
248
|
+
And they extracted by default from MacOS "._" files when reading
|
249
|
+
these files directly.
|
224
250
|
},
|
225
251
|
'com.apple.FinderInfo' => {
|
226
252
|
Name => 'XAttrFinderInfo',
|
@@ -325,7 +351,7 @@ sub MDItemLocalTime($)
|
|
325
351
|
|
326
352
|
#------------------------------------------------------------------------------
|
327
353
|
# Set MacOS MDItem and XAttr tags from new tag values
|
328
|
-
# Inputs: 0)
|
354
|
+
# Inputs: 0) ExifTool ref, 1) file name, 2) list of tags to set
|
329
355
|
# Returns: 1=something was set OK, 0=didn't try, -1=error (and warning set)
|
330
356
|
# Notes: There may be errors even if 1 is returned
|
331
357
|
sub SetMacOSTags($$$)
|
@@ -486,8 +512,50 @@ sub ExtractMDItemTags($$)
|
|
486
512
|
$$et{INDENT} =~ s/\| $//;
|
487
513
|
}
|
488
514
|
|
515
|
+
|
516
|
+
#------------------------------------------------------------------------------
|
517
|
+
# Read MacOS XAttr value
|
518
|
+
# Inputs: 0) ExifTool object ref, 1) file name
|
519
|
+
sub ReadXAttrValue($$$$)
|
520
|
+
{
|
521
|
+
my ($et, $tagTablePtr, $tag, $val) = @_;
|
522
|
+
# add to our table if necessary
|
523
|
+
unless ($$tagTablePtr{$tag}) {
|
524
|
+
my $name;
|
525
|
+
# generate tag name from attribute name
|
526
|
+
if ($tag =~ /^com\.apple\.(.*)$/) {
|
527
|
+
($name = $1) =~ s/^metadata:_?k//;
|
528
|
+
$name =~ s/^metadata:(com_)?//;
|
529
|
+
} else {
|
530
|
+
$name = $tag;
|
531
|
+
}
|
532
|
+
$name =~ s/[.:_]([a-z])/\U$1/g;
|
533
|
+
$name = 'XAttr' . ucfirst $name;
|
534
|
+
my %tagInfo = ( Name => $name );
|
535
|
+
$tagInfo{Groups} = { 2 => 'Time' } if $tag=~/Date$/;
|
536
|
+
$et->VPrint(0, " [adding $tag]\n");
|
537
|
+
AddTagToTable($tagTablePtr, $tag, \%tagInfo);
|
538
|
+
}
|
539
|
+
if ($val =~ /^bplist0/) {
|
540
|
+
my %dirInfo = ( DataPt => \$val );
|
541
|
+
require Image::ExifTool::PLIST;
|
542
|
+
if (Image::ExifTool::PLIST::ProcessBinaryPLIST($et, \%dirInfo, $tagTablePtr)) {
|
543
|
+
return undef if ref $dirInfo{Value} eq 'HASH';
|
544
|
+
$val = $dirInfo{Value}
|
545
|
+
} else {
|
546
|
+
$et->Warn("Error decoding $$tagTablePtr{$tag}{Name}");
|
547
|
+
return undef;
|
548
|
+
}
|
549
|
+
}
|
550
|
+
if (not ref $val and ($val =~ /\0/ or length($val) > 200) or $tag eq 'XAttrMDLabel') {
|
551
|
+
my $buff = $val;
|
552
|
+
$val = \$buff;
|
553
|
+
}
|
554
|
+
return $val;
|
555
|
+
}
|
556
|
+
|
489
557
|
#------------------------------------------------------------------------------
|
490
|
-
#
|
558
|
+
# Read MacOS extended attribute tags using 'xattr' utility
|
491
559
|
# Inputs: 0) ExifTool object ref, 1) file name
|
492
560
|
sub ExtractXAttrTags($$)
|
493
561
|
{
|
@@ -517,39 +585,8 @@ sub ExtractXAttrTags($$)
|
|
517
585
|
$val .= pack('H*', $_);
|
518
586
|
next;
|
519
587
|
} elsif ($tag and defined $val) {
|
520
|
-
|
521
|
-
|
522
|
-
my $name;
|
523
|
-
# generate tag name from attribute name
|
524
|
-
if ($tag =~ /^com\.apple\.(.*)$/) {
|
525
|
-
($name = $1) =~ s/^metadata:_?k//;
|
526
|
-
$name =~ s/^metadata:(com_)?//;
|
527
|
-
} else {
|
528
|
-
$name = $tag;
|
529
|
-
}
|
530
|
-
$name =~ s/[.:_]([a-z])/\U$1/g;
|
531
|
-
$name = 'XAttr' . ucfirst $name;
|
532
|
-
my %tagInfo = ( Name => $name );
|
533
|
-
$tagInfo{Groups} = { 2 => 'Time' } if $tag=~/Date$/;
|
534
|
-
$et->VPrint(0, " [adding $tag]\n");
|
535
|
-
AddTagToTable($tagTablePtr, $tag, \%tagInfo);
|
536
|
-
}
|
537
|
-
if ($val =~ /^bplist0/) {
|
538
|
-
my %dirInfo = ( DataPt => \$val );
|
539
|
-
require Image::ExifTool::PLIST;
|
540
|
-
if (Image::ExifTool::PLIST::ProcessBinaryPLIST($et, \%dirInfo, $tagTablePtr)) {
|
541
|
-
next if ref $dirInfo{Value} eq 'HASH';
|
542
|
-
$val = $dirInfo{Value}
|
543
|
-
} else {
|
544
|
-
$et->Warn("Error decoding $$tagTablePtr{$tag}{Name}");
|
545
|
-
next;
|
546
|
-
}
|
547
|
-
}
|
548
|
-
if (not ref $val and ($val =~ /\0/ or length($val) > 200) or $tag eq 'XAttrMDLabel') {
|
549
|
-
my $buff = $val;
|
550
|
-
$val = \$buff;
|
551
|
-
}
|
552
|
-
$et->HandleTag($tagTablePtr, $tag, $val);
|
588
|
+
$val = ReadXAttrValue($et, $tagTablePtr, $tag, $val);
|
589
|
+
$et->HandleTag($tagTablePtr, $tag, $val) if defined $val;
|
553
590
|
undef $tag;
|
554
591
|
undef $val;
|
555
592
|
}
|
@@ -584,6 +621,84 @@ sub GetFileCreateDate($$)
|
|
584
621
|
delete $$et{SET_GROUP1};
|
585
622
|
}
|
586
623
|
|
624
|
+
#------------------------------------------------------------------------------
|
625
|
+
# Read ATTR metadata from "._" file
|
626
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
627
|
+
# Return: 1 on success
|
628
|
+
# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html)
|
629
|
+
sub ProcessATTR($$$)
|
630
|
+
{
|
631
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
632
|
+
my $dataPt = $$dirInfo{DataPt};
|
633
|
+
my $dataPos = $$dirInfo{DataPos};
|
634
|
+
my $dataLen = length $$dataPt;
|
635
|
+
|
636
|
+
$dataLen >= 58 and $$dataPt =~ /^.{34}ATTR/s or $et->Warn('Invalid ATTR header'), return 0;
|
637
|
+
my $entries = Get32u($dataPt, 66);
|
638
|
+
$et->VerboseDir('ATTR', $entries);
|
639
|
+
# (Note: The RAF is not in $dirInfo because it would break RSRC reading --
|
640
|
+
# the RSCR block uses relative offsets, while the ATTR block uses absolute! grrr!)
|
641
|
+
my $raf = $$et{RAF};
|
642
|
+
my $pos = 70; # first entry is after ATTR header
|
643
|
+
my $i;
|
644
|
+
for ($i=0; $i<$entries; ++$i) {
|
645
|
+
$pos + 12 > $dataLen and $et->Warn('Truncated ATTR entry'), last;
|
646
|
+
my $off = Get32u($dataPt, $pos);
|
647
|
+
my $len = Get32u($dataPt, $pos + 4);
|
648
|
+
my $n = Get8u($dataPt, $pos + 10); # number of characters in tag name
|
649
|
+
$pos + 11 + $n > $dataLen and $et->Warn('Truncated ATTR name'), last;
|
650
|
+
$off -= $dataPos; # convert to relative offset (grrr!)
|
651
|
+
$off < 0 or $off > $dataLen and $et->Warn('Invalid ATTR offset'), last;
|
652
|
+
my $tag = substr($$dataPt, $pos + 11, $n);
|
653
|
+
$tag =~ s/\0+$//; # remove null terminator
|
654
|
+
# remove random ID after kMDLabel in tag ID
|
655
|
+
$tag =~ s/^com.apple.metadata:kMDLabel_.*/com.apple.metadata:kMDLabel/s;
|
656
|
+
$off + $len > $dataLen and $et->Warn('Truncated ATTR value'), last;
|
657
|
+
my $val = ReadXAttrValue($et, $tagTablePtr, $tag, substr($$dataPt, $off, $len));
|
658
|
+
$et->HandleTag($tagTablePtr, $tag, $val,
|
659
|
+
DataPt => $dataPt,
|
660
|
+
DataPos => $dataPos,
|
661
|
+
Start => $off,
|
662
|
+
Size => $len,
|
663
|
+
) if defined $val;
|
664
|
+
$pos += (11 + $n + 3) & -4; # step to next entry (on even 4-byte boundary)
|
665
|
+
}
|
666
|
+
return 1;
|
667
|
+
}
|
668
|
+
|
669
|
+
#------------------------------------------------------------------------------
|
670
|
+
# Read information from a MacOS "._" sidecar file
|
671
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref
|
672
|
+
# Returns: 1 on success, 0 if this wasn't a valid "._" file
|
673
|
+
# (ref https://www.swiftforensics.com/2018/11/the-dot-underscore-file-format.html)
|
674
|
+
sub ProcessMacOS($$)
|
675
|
+
{
|
676
|
+
my ($et, $dirInfo) = @_;
|
677
|
+
my $raf = $$dirInfo{RAF};
|
678
|
+
my ($hdr, $buff, $i);
|
679
|
+
|
680
|
+
return 0 unless $raf->Read($hdr, 26) == 26 and $hdr =~ /^\0\x05\x16\x07\0(.)\0\0Mac OS X /s;
|
681
|
+
my $ver = ord $1;
|
682
|
+
# (extension may be anything, so just echo back the incoming file extension if it exists)
|
683
|
+
$et->SetFileType(undef, undef, $$et{FILE_EXT});
|
684
|
+
$ver == 2 or $et->Warn("Unsupported file version $ver"), return 1;
|
685
|
+
SetByteOrder('MM');
|
686
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::MacOS::Main');
|
687
|
+
my $entries = Get16u(\$hdr, 0x18);
|
688
|
+
$et->VerboseDir('MacOS', $entries);
|
689
|
+
$raf->Read($hdr, $entries * 12) == $entries * 12 or $et->Warn('Truncated header'), return 1;
|
690
|
+
for ($i=0; $i<$entries; ++$i) {
|
691
|
+
my $pos = $i * 12;
|
692
|
+
my $tag = Get32u(\$hdr, $pos);
|
693
|
+
my $off = Get32u(\$hdr, $pos + 4);
|
694
|
+
my $len = Get32u(\$hdr, $pos + 8);
|
695
|
+
$len > 100000000 and $et->Warn('Record size too large'), last;
|
696
|
+
$raf->Seek($off,0) and $raf->Read($buff,$len) == $len or $et->Warn('Truncated record'), last;
|
697
|
+
$et->HandleTag($tagTablePtr, $tag, undef, DataPt => \$buff, DataPos => $off, Index => $i);
|
698
|
+
}
|
699
|
+
return 1;
|
700
|
+
}
|
701
|
+
|
587
702
|
1; # end
|
588
703
|
|
589
704
|
__END__
|
@@ -600,8 +715,9 @@ This module is used by Image::ExifTool
|
|
600
715
|
|
601
716
|
This module contains definitions required by Image::ExifTool to extract
|
602
717
|
MDItem* and XAttr* tags on MacOS systems using the "mdls" and "xattr"
|
603
|
-
utilities respectively.
|
604
|
-
|
718
|
+
utilities respectively. It also reads metadata directly from the MacOS "_."
|
719
|
+
sidecar files that are used on some filesystems to store file attributes.
|
720
|
+
Writable tags use "xattr", "setfile" or "osascript" for writing.
|
605
721
|
|
606
722
|
=head1 AUTHOR
|
607
723
|
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.10';
|
18
18
|
|
19
19
|
my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
20
20
|
|
@@ -221,6 +221,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
221
221
|
},
|
222
222
|
0x2e => {
|
223
223
|
Name => 'TrackEntry',
|
224
|
+
# reset TrackType member at the start of each track
|
225
|
+
Condition => 'delete $$self{TrackType}; 1',
|
224
226
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
|
225
227
|
},
|
226
228
|
0x57 => { Name => 'TrackNumber', Format => 'unsigned' },
|
@@ -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.87';
|
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)
|
@@ -602,13 +602,18 @@ $VERSION = '2.83';
|
|
602
602
|
15 => 'Light', #JR (NC)
|
603
603
|
16 => 'Autumn Leaves', #JR (NC)
|
604
604
|
17 => 'Sepia', #JR
|
605
|
+
18 => 'FL', #JR (7SM3)
|
606
|
+
19 => 'Vivid 2', #JR (7SM3)
|
607
|
+
20 => 'IN', #JR (7SM3)
|
608
|
+
21 => 'SH', #JR (7SM3)
|
605
609
|
100 => 'Neutral', #JD
|
606
610
|
101 => 'Clear', #JD
|
607
611
|
102 => 'Deep', #JD
|
608
612
|
103 => 'Light', #JD
|
609
613
|
104 => 'Night View', #JD
|
610
614
|
105 => 'Autumn Leaves', #JD
|
611
|
-
|
615
|
+
255 => 'Off', #JR (new for ILCE-7SM3, July 2020)
|
616
|
+
0xffffffff => 'n/a', #PH
|
612
617
|
);
|
613
618
|
|
614
619
|
%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.89';
|
66
66
|
|
67
67
|
sub LensIDConv($$$);
|
68
68
|
sub ProcessNikonAVI($$$);
|
@@ -349,6 +349,7 @@ sub GetAFPointGrid($$;$);
|
|
349
349
|
'FE 47 00 00 24 24 4B 06' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #JD
|
350
350
|
'26 48 11 11 30 30 1C 02' => 'Sigma 8mm F4 EX Circular Fisheye',
|
351
351
|
'79 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX Circular Fisheye', #JD
|
352
|
+
'DB 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX DG Circular Fisheye', #30
|
352
353
|
'DC 48 19 19 24 24 4B 06' => 'Sigma 10mm F2.8 EX DC HSM Fisheye',
|
353
354
|
'C2 4C 24 24 14 14 4B 06' => 'Sigma 14mm F1.8 DG HSM | A', #IB
|
354
355
|
'48 48 24 24 24 24 4B 02' => 'Sigma 14mm F2.8 EX Aspherical HSM',
|
@@ -449,6 +450,7 @@ sub GetAFPointGrid($$;$);
|
|
449
450
|
# '92 3E 2D 88 2C 40 4B 0E' (22mm)
|
450
451
|
# '92 40 2D 88 2C 40 4B 0E' (18mm)
|
451
452
|
'26 48 31 49 24 24 1C 02' => 'Sigma 20-40mm F2.8',
|
453
|
+
'7B 48 37 44 18 18 4B 06' => 'Sigma 24-35mm F2.0 DG HSM | A', #30
|
452
454
|
'02 3A 37 50 31 3D 02 00' => 'Sigma 24-50mm F4-5.6 UC',
|
453
455
|
'26 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
|
454
456
|
'B6 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
|
@@ -513,6 +515,7 @@ sub GetAFPointGrid($$;$);
|
|
513
515
|
'CE 34 76 A0 38 40 4B 0E' => 'Sigma 150-500mm F5-6.3 DG OS APO HSM', #JD
|
514
516
|
'81 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', #Jaap Voets
|
515
517
|
'82 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | C',
|
518
|
+
'C4 4C 73 73 14 14 4B 46' => 'Sigma 135mm F1.8 DG HSM | A', #forum3833
|
516
519
|
'26 40 7B A0 34 40 1C 02' => 'Sigma APO 170-500mm F5-6.3 Aspherical RF',
|
517
520
|
'A7 49 80 A0 24 24 4B 06' => 'Sigma APO 200-500mm F2.8 EX DG',
|
518
521
|
'48 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM',
|
@@ -579,6 +582,7 @@ sub GetAFPointGrid($$;$);
|
|
579
582
|
'4D 41 3C 8E 2B 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)',
|
580
583
|
'4D 41 3C 8E 2C 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)',
|
581
584
|
'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)',
|
585
|
+
'C9 3C 44 76 25 31 DF 4E' => 'Tamron 35-150mm f/2.8-4 Di VC OSD (A043)', #30
|
582
586
|
'00 47 53 80 30 3C 00 06' => 'Tamron AF 55-200mm f/4-5.6 Di II LD (A15)',
|
583
587
|
'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
584
588
|
'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
|
@@ -711,6 +715,7 @@ sub GetAFPointGrid($$;$);
|
|
711
715
|
'00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS',
|
712
716
|
'00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
|
713
717
|
'00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
|
718
|
+
'4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
|
714
719
|
);
|
715
720
|
|
716
721
|
# text encoding used in LocationInfo (ref PH)
|
@@ -878,6 +883,38 @@ my %afPoints39 = (
|
|
878
883
|
10 => 'E3', 20 => 'B9', 30 => 'D4',
|
879
884
|
);
|
880
885
|
|
886
|
+
# AF point indices for models with 105 focus points, eg. D6 (ref 28)
|
887
|
+
# - 7 rows (A-G) with 15 columns (1-15), center is D8
|
888
|
+
my %afPoints105 = (
|
889
|
+
1 => 'D8', 28 => 'G7', 55 => 'F13', 82 => 'E4',
|
890
|
+
2 => 'C8', 29 => 'D6', 56 => 'G13', 83 => 'F4',
|
891
|
+
3 => 'B8', 30 => 'C6', 57 => 'D14', 84 => 'G4',
|
892
|
+
4 => 'A8', 31 => 'B6', 58 => 'C14', 85 => 'D3',
|
893
|
+
5 => 'E8', 32 => 'A6', 59 => 'B14', 86 => 'C3',
|
894
|
+
6 => 'F8', 33 => 'E6', 60 => 'A14', 87 => 'B3',
|
895
|
+
7 => 'G8', 34 => 'F6', 61 => 'E14', 88 => 'A3',
|
896
|
+
8 => 'D9', 35 => 'G6', 62 => 'F14', 89 => 'E3',
|
897
|
+
9 => 'C9', 36 => 'D11', 63 => 'G14', 90 => 'F3',
|
898
|
+
10 => 'B9', 37 => 'C11', 64 => 'D15', 91 => 'G3',
|
899
|
+
11 => 'A9', 38 => 'B11', 65 => 'C15', 92 => 'D2',
|
900
|
+
12 => 'E9', 39 => 'A11', 66 => 'B15', 93 => 'C2',
|
901
|
+
13 => 'F9', 40 => 'E11', 67 => 'A15', 94 => 'B2',
|
902
|
+
14 => 'G9', 41 => 'F11', 68 => 'E15', 95 => 'A2',
|
903
|
+
15 => 'D10', 42 => 'G11', 69 => 'F15', 96 => 'E2',
|
904
|
+
16 => 'C10', 43 => 'D12', 70 => 'G15', 97 => 'F2',
|
905
|
+
17 => 'B10', 44 => 'C12', 71 => 'D5', 98 => 'G2',
|
906
|
+
18 => 'A10', 45 => 'B12', 72 => 'C5', 99 => 'D1',
|
907
|
+
19 => 'E10', 46 => 'A12', 73 => 'B5', 100 => 'C1',
|
908
|
+
20 => 'F10', 47 => 'E12', 74 => 'A5', 101 => 'B1',
|
909
|
+
21 => 'G10', 48 => 'F12', 75 => 'E5', 102 => 'A1',
|
910
|
+
22 => 'D7', 49 => 'G12', 76 => 'F5', 103 => 'E1',
|
911
|
+
23 => 'C7', 50 => 'D13', 77 => 'G5', 104 => 'F1',
|
912
|
+
24 => 'B7', 51 => 'C13', 78 => 'D4', 105 => 'G1',
|
913
|
+
25 => 'A7', 52 => 'B13', 79 => 'C4',
|
914
|
+
26 => 'E7', 53 => 'A13', 80 => 'B4',
|
915
|
+
27 => 'F7', 54 => 'E13', 81 => 'A4',
|
916
|
+
);
|
917
|
+
|
881
918
|
# AF point indices for models with 135 focus points, eg. 1J1 (ref PH)
|
882
919
|
# - 9 rows (A-I) with 15 columns (1-15), center is E8
|
883
920
|
# - odd columns, columns 2 and 14, and the remaining corner points are
|
@@ -1540,7 +1577,7 @@ my %binaryDataAttrs = (
|
|
1540
1577
|
0x008c => {
|
1541
1578
|
Name => 'ContrastCurve', #JD
|
1542
1579
|
Writable => 'undef',
|
1543
|
-
Flags => [ 'Binary', 'Protected' ],
|
1580
|
+
Flags => [ 'Binary', 'Protected', 'Drop' ], # (drop because not found in Nikon JPEG's)
|
1544
1581
|
},
|
1545
1582
|
# ColorHue: MODE1/MODE1a=sRGB, MODE2=Adobe RGB, MODE3a=more saturated sRGB
|
1546
1583
|
# --> should really be called ColorSpace or ColorMode, but that would conflict with other tags
|
@@ -1785,6 +1822,16 @@ my %binaryDataAttrs = (
|
|
1785
1822
|
ByteOrder => 'LittleEndian',
|
1786
1823
|
},
|
1787
1824
|
},
|
1825
|
+
{ # (D6 firmware version 1.00, ref 28)
|
1826
|
+
Condition => '$$valPt =~ /^0246/',
|
1827
|
+
Name => 'ShotInfoD6',
|
1828
|
+
SubDirectory => {
|
1829
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfo',
|
1830
|
+
DecryptStart => 4,
|
1831
|
+
DecryptLen => 0xa4, # only decrypt the version info & offset fields for now
|
1832
|
+
ByteOrder => 'LittleEndian',
|
1833
|
+
},
|
1834
|
+
},
|
1788
1835
|
{ # (D610 firmware version 1.00)
|
1789
1836
|
Condition => '$$valPt =~ /^0232/',
|
1790
1837
|
Name => 'ShotInfoD610',
|
@@ -1834,6 +1881,7 @@ my %binaryDataAttrs = (
|
|
1834
1881
|
7 => 'Unpacked 12 bits', #IB (padded to 16)
|
1835
1882
|
8 => 'Small', #IB
|
1836
1883
|
9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
|
1884
|
+
10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
|
1837
1885
|
},
|
1838
1886
|
},
|
1839
1887
|
0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
|
@@ -2035,7 +2083,7 @@ my %binaryDataAttrs = (
|
|
2035
2083
|
},
|
2036
2084
|
},
|
2037
2085
|
{
|
2038
|
-
Condition => '$$valPt =~ /^
|
2086
|
+
Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
|
2039
2087
|
Name => 'LensData0800',
|
2040
2088
|
SubDirectory => {
|
2041
2089
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|
@@ -3300,6 +3348,7 @@ my %binaryDataAttrs = (
|
|
3300
3348
|
15 => 'Dynamic Area (72 points)', #PH
|
3301
3349
|
16 => 'Group Area (HL)', #28
|
3302
3350
|
17 => 'Group Area (VL)', #28
|
3351
|
+
18 => 'Dynamic Area (49 points)', #28
|
3303
3352
|
128 => 'Single', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V2,1V3)
|
3304
3353
|
129 => 'Auto (41 points)', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V1,1V2,1V3,AW1)
|
3305
3354
|
130 => 'Subject Tracking (41 points)', #PH (1J1,1J4,1J3)
|
@@ -3337,6 +3386,10 @@ my %binaryDataAttrs = (
|
|
3337
3386
|
197 => 'Auto', #PH (Z7)
|
3338
3387
|
198 => 'Auto (198)', #PH (Z7) (focus lock with AF-C maybe?)
|
3339
3388
|
199 => 'Auto (focus lock)', #PH (Z7, AF-S)
|
3389
|
+
200 => 'Normal-area AF', #28 (D6)
|
3390
|
+
201 => 'Wide-area AF', #28 (D6)
|
3391
|
+
202 => 'Face-priority AF', #28 (D6)
|
3392
|
+
203 => 'Subject-tracking AF', #28 (D6)
|
3340
3393
|
},
|
3341
3394
|
},
|
3342
3395
|
],
|
@@ -3355,12 +3408,14 @@ my %binaryDataAttrs = (
|
|
3355
3408
|
6 => 'On (105-point)', #PH (1J4/1V3[128/130])
|
3356
3409
|
7 => 'On (153-point)', #PH (D5/D500/D850)
|
3357
3410
|
8 => 'On (81-point)', #38
|
3411
|
+
9 => 'On (105-point)', #28 (D6)
|
3358
3412
|
},
|
3359
3413
|
},
|
3360
3414
|
7 => [
|
3361
3415
|
{ #PH/JD
|
3362
3416
|
Name => 'PrimaryAFPoint',
|
3363
|
-
|
3417
|
+
# PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28)
|
3418
|
+
Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
|
3364
3419
|
Notes => q{
|
3365
3420
|
models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
|
3366
3421
|
D4, D4S, D300, D300S, D700, D800, D800e and D810
|
@@ -3495,7 +3550,7 @@ my %binaryDataAttrs = (
|
|
3495
3550
|
8 => [
|
3496
3551
|
{ #JD/PH
|
3497
3552
|
Name => 'AFPointsUsed',
|
3498
|
-
Condition => '$$self{PhaseDetectAF} < 2',
|
3553
|
+
Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
|
3499
3554
|
Notes => q{
|
3500
3555
|
models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
|
3501
3556
|
point is C6
|
@@ -3614,6 +3669,8 @@ my %binaryDataAttrs = (
|
|
3614
3669
|
},
|
3615
3670
|
{ #PH
|
3616
3671
|
Name => 'AFPointsUsed',
|
3672
|
+
# version 301 uses a separate field at offset 0x0a for this tag (ref 28)
|
3673
|
+
Condition => '$$self{AFInfo2Version} ne "0301"',
|
3617
3674
|
Format => 'undef[7]',
|
3618
3675
|
ValueConv => 'join(" ", unpack("H2"x7, $val))',
|
3619
3676
|
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
@@ -3621,6 +3678,19 @@ my %binaryDataAttrs = (
|
|
3621
3678
|
PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
|
3622
3679
|
},
|
3623
3680
|
],
|
3681
|
+
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
|
3682
|
+
Name => 'AFPointsUsed',
|
3683
|
+
Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
|
3684
|
+
Notes => q{
|
3685
|
+
models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
|
3686
|
+
point is D8
|
3687
|
+
},
|
3688
|
+
Format => 'undef[14]',
|
3689
|
+
ValueConv => 'join(" ", unpack("H2"x14, $val))',
|
3690
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3691
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
|
3692
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
|
3693
|
+
},
|
3624
3694
|
0x10 => { #PH (D90 and D5000)
|
3625
3695
|
Name => 'AFImageWidth',
|
3626
3696
|
Condition => '$$self{AFInfo2Version} eq "0100"',
|
@@ -3663,11 +3733,21 @@ my %binaryDataAttrs = (
|
|
3663
3733
|
Format => 'int16u',
|
3664
3734
|
RawConv => '$val ? $val : undef',
|
3665
3735
|
},
|
3666
|
-
0x1c =>
|
3667
|
-
|
3668
|
-
|
3669
|
-
|
3670
|
-
|
3736
|
+
0x1c => [
|
3737
|
+
{ #PH
|
3738
|
+
Name => 'ContrastDetectAFInFocus',
|
3739
|
+
Condition => '$$self{AFInfo2Version} eq "0100"',
|
3740
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
3741
|
+
},{ #PH (D500, see forum11190)
|
3742
|
+
Name => 'AFPointsSelected',
|
3743
|
+
Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
|
3744
|
+
Format => 'undef[20]',
|
3745
|
+
ValueConv => 'join(" ", unpack("H2"x20, $val))',
|
3746
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3747
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
|
3748
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
|
3749
|
+
},
|
3750
|
+
],
|
3671
3751
|
# 0x1d - always zero (with or without live view)
|
3672
3752
|
0x2a => { #PH (Z7)
|
3673
3753
|
Name => 'AFImageWidth',
|
@@ -3683,14 +3763,31 @@ my %binaryDataAttrs = (
|
|
3683
3763
|
},
|
3684
3764
|
0x2e => { #PH (Z7)
|
3685
3765
|
Name => 'AFAreaXPosition',
|
3686
|
-
Condition =>
|
3687
|
-
|
3688
|
-
|
3689
|
-
|
3690
|
-
Name => 'AFAreaYPosition',
|
3691
|
-
Condition => '$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/',
|
3766
|
+
Condition => q{
|
3767
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3768
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3769
|
+
},
|
3692
3770
|
Format => 'int16u',
|
3693
3771
|
},
|
3772
|
+
0x30 => [
|
3773
|
+
{ #PH (Z7)
|
3774
|
+
Name => 'AFAreaYPosition',
|
3775
|
+
Condition => q{
|
3776
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3777
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3778
|
+
},
|
3779
|
+
Format => 'int16u',
|
3780
|
+
},{ #PH (D500, see forum11190)
|
3781
|
+
Name => 'AFPointsInFocus',
|
3782
|
+
Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
|
3783
|
+
Notes => 'AF points in focus at the time time image was captured',
|
3784
|
+
Format => 'undef[20]',
|
3785
|
+
ValueConv => 'join(" ", unpack("H2"x20, $val))',
|
3786
|
+
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
3787
|
+
PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
|
3788
|
+
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
|
3789
|
+
},
|
3790
|
+
],
|
3694
3791
|
0x32 => { #PH (Z7)
|
3695
3792
|
Name => 'AFAreaWidth',
|
3696
3793
|
Condition => '$$self{AFInfo2Version} =~ /^03/',
|
@@ -3703,6 +3800,19 @@ my %binaryDataAttrs = (
|
|
3703
3800
|
Format => 'int16u',
|
3704
3801
|
RawConv => '$val ? $val : undef',
|
3705
3802
|
},
|
3803
|
+
0x38 => { #28
|
3804
|
+
Name => 'PrimaryAFPoint',
|
3805
|
+
Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/',
|
3806
|
+
Notes => q{
|
3807
|
+
Nikon models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15): D6
|
3808
|
+
},
|
3809
|
+
PrintConvColumns => 5,
|
3810
|
+
PrintConv => {
|
3811
|
+
0 => '(none)',
|
3812
|
+
%afPoints105,
|
3813
|
+
1 => 'D8 (Center)',
|
3814
|
+
},
|
3815
|
+
},
|
3706
3816
|
0x44 => [
|
3707
3817
|
{
|
3708
3818
|
Name => 'PrimaryAFPoint',
|
@@ -3802,6 +3912,7 @@ my %binaryDataAttrs = (
|
|
3802
3912
|
# (don't know what the difference between 1 and 2 is)
|
3803
3913
|
1 => 'On (1)',
|
3804
3914
|
2 => 'On (2)',
|
3915
|
+
3 => 'On (Zoom)', #28
|
3805
3916
|
},
|
3806
3917
|
},
|
3807
3918
|
1 => {
|
@@ -3811,6 +3922,7 @@ my %binaryDataAttrs = (
|
|
3811
3922
|
PrintConvInv => '$val eq "n/a" ? 255 : $val',
|
3812
3923
|
},
|
3813
3924
|
2 => {
|
3925
|
+
# when AFFineTune = 3 (indicating a zoom lens), this Tag stores the tuning adjustment for the wide end of the zoom range (ref 28)
|
3814
3926
|
Name => 'AFFineTuneAdj',
|
3815
3927
|
Priority => 0, # so other value takes priority if it exists
|
3816
3928
|
Notes => 'may only be valid for saved lenses',
|
@@ -3818,6 +3930,14 @@ my %binaryDataAttrs = (
|
|
3818
3930
|
PrintConv => '$val > 0 ? "+$val" : $val',
|
3819
3931
|
PrintConvInv => '$val',
|
3820
3932
|
},
|
3933
|
+
3 => {
|
3934
|
+
Name => 'AFFineTuneAdjTele',
|
3935
|
+
# should probably insert a Condition that restricts this to AFFineTune = 3 (ref 28)
|
3936
|
+
Notes => 'only valid for zoom lenses (ie, AFTune=3)',
|
3937
|
+
Format => 'int8s',
|
3938
|
+
PrintConv => '$val > 0 ? "+$val" : $val',
|
3939
|
+
PrintConvInv => '$val',
|
3940
|
+
},
|
3821
3941
|
);
|
3822
3942
|
|
3823
3943
|
# Nikon NEF processing information (ref forum6281)
|
@@ -4538,6 +4658,12 @@ my %nikonFocalConversions = (
|
|
4538
4658
|
13 => 'Nikkor Z 24-70mm f/2.8 S',
|
4539
4659
|
14 => 'Nikkor Z 85mm f/1.8 S',
|
4540
4660
|
15 => 'Nikkor Z 24mm f/1.8 S', #IB
|
4661
|
+
16 => 'Nikkor Z 70-200mm f/2.8 VR S', #IB
|
4662
|
+
17 => 'Nikkor Z 20mm f/1.8 S', #IB
|
4663
|
+
18 => 'Nikkor Z 24-200mm f/4-6.3 VR', #IB
|
4664
|
+
21 => 'Nikkor Z 50mm f/1.2 S', #IB
|
4665
|
+
22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
|
4666
|
+
23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
|
4541
4667
|
},
|
4542
4668
|
},
|
4543
4669
|
0x36 => {
|
@@ -8873,7 +8999,7 @@ my %nikonFocalConversions = (
|
|
8873
8999
|
},
|
8874
9000
|
},
|
8875
9001
|
{
|
8876
|
-
Condition => '$$valPt =~ /^
|
9002
|
+
Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
|
8877
9003
|
Name => 'LensData0800',
|
8878
9004
|
SubDirectory => {
|
8879
9005
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|