exiftool_vendored 12.14.0 → 12.18.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.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +52 -2
- data/bin/MANIFEST +2 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +39 -32
- data/bin/lib/Image/ExifTool.pm +30 -1
- data/bin/lib/Image/ExifTool.pod +7 -5
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -3
- data/bin/lib/Image/ExifTool/Canon.pm +21 -2
- data/bin/lib/Image/ExifTool/CanonCustom.pm +19 -1
- data/bin/lib/Image/ExifTool/DJI.pm +27 -1
- data/bin/lib/Image/ExifTool/DPX.pm +3 -3
- data/bin/lib/Image/ExifTool/Exif.pm +31 -15
- data/bin/lib/Image/ExifTool/FujiFilm.pm +2 -1
- data/bin/lib/Image/ExifTool/GPS.pm +5 -5
- data/bin/lib/Image/ExifTool/H264.pm +20 -5
- data/bin/lib/Image/ExifTool/JPEG.pm +23 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +312 -36
- data/bin/lib/Image/ExifTool/NikonSettings.pm +2013 -0
- data/bin/lib/Image/ExifTool/PNG.pm +11 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +31 -19
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +22 -4
- data/bin/lib/Image/ExifTool/README +5 -4
- data/bin/lib/Image/ExifTool/RIFF.pm +8 -7
- data/bin/lib/Image/ExifTool/Sony.pm +20 -18
- data/bin/lib/Image/ExifTool/TagLookup.pm +3983 -3810
- data/bin/lib/Image/ExifTool/TagNames.pod +408 -22
- data/bin/lib/Image/ExifTool/WriteXMP.pl +9 -6
- data/bin/lib/Image/ExifTool/Writer.pl +6 -4
- data/bin/lib/Image/ExifTool/XMP.pm +28 -2
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +36 -3
@@ -19,7 +19,7 @@ use Image::ExifTool qw(:DataAccess);
|
|
19
19
|
use Image::ExifTool::Canon;
|
20
20
|
use Image::ExifTool::Exif;
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.58';
|
23
23
|
|
24
24
|
sub ProcessCanonCustom($$$);
|
25
25
|
sub ProcessCanonCustom2($$$);
|
@@ -2098,6 +2098,24 @@ my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv );
|
|
2098
2098
|
'$val=~/(\d+)/ ? $1 : 0',
|
2099
2099
|
'$val=~/(\d+)/ ? $1 : 0',
|
2100
2100
|
],
|
2101
|
+
},{ # (1DXmkIII firmware 1.3)
|
2102
|
+
Name => 'ContinuousShootingSpeed',
|
2103
|
+
Condition => '$count == 5',
|
2104
|
+
Count => 5,
|
2105
|
+
PrintConv => [
|
2106
|
+
'"Hi $val"',
|
2107
|
+
'"Cont $val"',
|
2108
|
+
'"Lo $val"',
|
2109
|
+
'"Soft $val"',
|
2110
|
+
'"Soft LS $val"',
|
2111
|
+
],
|
2112
|
+
PrintConvInv => [
|
2113
|
+
'$val=~/(\d+)/ ? $1 : 0',
|
2114
|
+
'$val=~/(\d+)/ ? $1 : 0',
|
2115
|
+
'$val=~/(\d+)/ ? $1 : 0',
|
2116
|
+
'$val=~/(\d+)/ ? $1 : 0',
|
2117
|
+
'$val=~/(\d+)/ ? $1 : 0',
|
2118
|
+
],
|
2101
2119
|
},{ # others
|
2102
2120
|
Name => 'ContinuousShootingSpeed',
|
2103
2121
|
Count => 3,
|
@@ -15,7 +15,7 @@ use Image::ExifTool::Exif;
|
|
15
15
|
use Image::ExifTool::XMP;
|
16
16
|
use Image::ExifTool::GPS;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.03';
|
19
19
|
|
20
20
|
my %convFloat2 = (
|
21
21
|
PrintConv => 'sprintf("%+.2f", $val)',
|
@@ -44,6 +44,32 @@ my %convFloat2 = (
|
|
44
44
|
0x0b => { Name => 'CameraRoll', Writable => 'float', %convFloat2 },
|
45
45
|
);
|
46
46
|
|
47
|
+
# thermal parameters in APP4 of DJI ZH20T images (ref forum11401)
|
48
|
+
%Image::ExifTool::DJI::ThermalParams = (
|
49
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
50
|
+
GROUPS => { 0 => 'APP4', 2 => 'Image' },
|
51
|
+
NOTES => 'Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.',
|
52
|
+
# 0x00 - 0xaa551206 - temperature header magic number
|
53
|
+
0x24 => { Name => 'K1', Format => 'float' },
|
54
|
+
0x28 => { Name => 'K2', Format => 'float' },
|
55
|
+
0x2c => { Name => 'K3', Format => 'float' },
|
56
|
+
0x30 => { Name => 'K4', Format => 'float' },
|
57
|
+
0x34 => { Name => 'KF', Format => 'float' },
|
58
|
+
0x38 => { Name => 'B1', Format => 'float' },
|
59
|
+
0x3c => { Name => 'B2', Format => 'float' },
|
60
|
+
0x44 => { Name => 'ObjectDistance', Format => 'int16u' },
|
61
|
+
0x46 => { Name => 'RelativeHumidity', Format => 'int16u' },
|
62
|
+
0x48 => { Name => 'Emissivity', Format => 'int16u' },
|
63
|
+
0x4a => { Name => 'Reflection', Format => 'int16u', },
|
64
|
+
0x4c => { Name => 'AmbientTemperature', Format => 'int16u' }, # (aka D1)
|
65
|
+
0x50 => { Name => 'D2', Format => 'int32s' },
|
66
|
+
0x54 => { Name => 'KJ', Format => 'int16u' },
|
67
|
+
0x56 => { Name => 'DB', Format => 'int16u' },
|
68
|
+
0x58 => { Name => 'KK', Format => 'int16u' },
|
69
|
+
# 0x500 - 0x55aa1206 - device header magic number
|
70
|
+
# (nothing yet decoded from device header)
|
71
|
+
);
|
72
|
+
|
47
73
|
%Image::ExifTool::DJI::XMP = (
|
48
74
|
%Image::ExifTool::XMP::xmpTableDefaults,
|
49
75
|
GROUPS => { 0 => 'XMP', 1 => 'XMP-drone-dji', 2 => 'Location' },
|
@@ -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.05';
|
19
19
|
|
20
20
|
# DPX tags
|
21
21
|
%Image::ExifTool::DPX::Main = (
|
@@ -158,11 +158,11 @@ $VERSION = '1.04';
|
|
158
158
|
1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
|
159
159
|
# 1620=> { Name => 'AspectRatio', Format => 'int32u' },
|
160
160
|
1724 => { Name => 'OriginalFrameRate',Format => 'float' },
|
161
|
-
1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '$val =~ /\d/ ? $val : undef' }, #2
|
161
|
+
1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2
|
162
162
|
1732 => { Name => 'FrameID', Format => 'string[32]' },
|
163
163
|
1764 => { Name => 'SlateInformation', Format => 'string[100]' },
|
164
164
|
1920 => { Name => 'TimeCode', Format => 'int32u' }, #2
|
165
|
-
1940 => { Name => 'FrameRate', Format => 'float', RawConv => '$val =~ /\d/ ? $val : undef' }, #2
|
165
|
+
1940 => { Name => 'FrameRate', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2
|
166
166
|
1972 => { Name => 'Reserved5', Format => 'string[76]', Unknown => 1 },
|
167
167
|
2048 => { Name => 'UserID', Format => 'string[32]' },
|
168
168
|
);
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.32';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -2560,6 +2560,7 @@ my %opcodeInfo = (
|
|
2560
2560
|
5 => 'Color sequential area',
|
2561
2561
|
7 => 'Trilinear',
|
2562
2562
|
8 => 'Color sequential linear',
|
2563
|
+
# 15 - used by DJI XT2
|
2563
2564
|
},
|
2564
2565
|
},
|
2565
2566
|
0xa300 => {
|
@@ -4728,8 +4729,8 @@ my %subSecConv = (
|
|
4728
4729
|
},
|
4729
4730
|
LensID => {
|
4730
4731
|
Groups => { 2 => 'Camera' },
|
4732
|
+
Require => 'LensType',
|
4731
4733
|
Desire => {
|
4732
|
-
0 => 'LensType',
|
4733
4734
|
1 => 'FocalLength',
|
4734
4735
|
2 => 'MaxAperture',
|
4735
4736
|
3 => 'MaxApertureValue',
|
@@ -4748,25 +4749,16 @@ my %subSecConv = (
|
|
4748
4749
|
Applies only to LensType values with a lookup table. May be configured
|
4749
4750
|
by adding user-defined lenses
|
4750
4751
|
},
|
4751
|
-
# this LensID is only valid if the LensType has a PrintConv
|
4752
|
-
# or LensType or LensModel are the model name
|
4752
|
+
# this LensID is only valid if the LensType has a PrintConv or is a model name
|
4753
4753
|
RawConv => q{
|
4754
4754
|
my $printConv = $$self{TAG_INFO}{LensType}{PrintConv};
|
4755
|
-
return $val if ref $printConv eq 'HASH' or
|
4756
|
-
|
4757
|
-
(defined $val[0] and $val[0] =~ /(mm|\d\/F)/) or
|
4758
|
-
(defined $val[6] and $val[6] =~ /(mm|\d\/F)/);
|
4755
|
+
return $val if ref $printConv eq 'HASH' or (ref $printConv eq 'ARRAY' and
|
4756
|
+
ref $$printConv[0] eq 'HASH') or $val[0] =~ /(mm|\d\/F)/;
|
4759
4757
|
return undef;
|
4760
4758
|
},
|
4761
|
-
ValueConv => '$val
|
4759
|
+
ValueConv => '$val',
|
4762
4760
|
PrintConv => q{
|
4763
4761
|
my $pcv;
|
4764
|
-
# use LensModel ([6]) if LensType ([0]) is not populated
|
4765
|
-
# (iPhone populates LensModel but not LensType)
|
4766
|
-
if (not defined $val[0] and defined $val[6]) {
|
4767
|
-
$val[0] = $val[6];
|
4768
|
-
$prt[0] = $prt[6];
|
4769
|
-
}
|
4770
4762
|
# use LensType2 instead of LensType if available and valid (Sony E-mount lenses)
|
4771
4763
|
# (0x8000 or greater; 0 for several older/3rd-party E-mount lenses)
|
4772
4764
|
if (defined $val[9] and ($val[9] & 0x8000 or $val[9] == 0)) {
|
@@ -4794,6 +4786,30 @@ my %subSecConv = (
|
|
4794
4786
|
return $lens;
|
4795
4787
|
},
|
4796
4788
|
},
|
4789
|
+
'LensID-2' => {
|
4790
|
+
Name => 'LensID',
|
4791
|
+
Groups => { 2 => 'Camera' },
|
4792
|
+
Desire => {
|
4793
|
+
0 => 'LensModel',
|
4794
|
+
1 => 'Lens',
|
4795
|
+
2 => 'XMP-aux:LensID',
|
4796
|
+
3 => 'Make',
|
4797
|
+
},
|
4798
|
+
Inhibit => {
|
4799
|
+
4 => 'Composite:LensID',
|
4800
|
+
},
|
4801
|
+
RawConv => q{
|
4802
|
+
return undef if defined $val[2] and defined $val[3];
|
4803
|
+
return $val if defined $val[0] and $val[0] =~ /(mm|\d\/F)/;
|
4804
|
+
return $val if defined $val[1] and $val[1] =~ /(mm|\d\/F)/;
|
4805
|
+
return undef;
|
4806
|
+
},
|
4807
|
+
ValueConv => q{
|
4808
|
+
return $val[0] if defined $val[0] and $val[0] =~ /(mm|\d\/F)/;
|
4809
|
+
return $val[1];
|
4810
|
+
},
|
4811
|
+
PrintConv => '$_=$val; s/(\d)\/F/$1mm F/; s/mmF/mm F/; s/(\d) mm/${1}mm/; s/ - /-/; $_',
|
4812
|
+
},
|
4797
4813
|
);
|
4798
4814
|
|
4799
4815
|
# table for unknown IFD entries
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
use Image::ExifTool::Exif;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.79';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -623,6 +623,7 @@ my %faceCategories = (
|
|
623
623
|
0x700 => 'Eterna', #12
|
624
624
|
0x800 => 'Classic Negative', #forum10536
|
625
625
|
0x900 => 'Bleach Bypass', #forum10890
|
626
|
+
0xa00 => 'Nostalgic Neg', #forum12085
|
626
627
|
},
|
627
628
|
},
|
628
629
|
0x1402 => { #2
|
@@ -12,7 +12,7 @@ use strict;
|
|
12
12
|
use vars qw($VERSION);
|
13
13
|
use Image::ExifTool::Exif;
|
14
14
|
|
15
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.52';
|
16
16
|
|
17
17
|
my %coordConv = (
|
18
18
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
@@ -50,8 +50,8 @@ my %coordConv = (
|
|
50
50
|
OTHER => sub {
|
51
51
|
my ($val, $inv) = @_;
|
52
52
|
return undef unless $inv;
|
53
|
-
return uc $1 if $val =~ /\b([NS])
|
54
|
-
return $1 eq '-' ? 'S' : 'N' if $val =~
|
53
|
+
return uc $1 if $val =~ /\b([NS])\b/i;
|
54
|
+
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
55
55
|
return undef;
|
56
56
|
},
|
57
57
|
N => 'North',
|
@@ -78,8 +78,8 @@ my %coordConv = (
|
|
78
78
|
OTHER => sub {
|
79
79
|
my ($val, $inv) = @_;
|
80
80
|
return undef unless $inv;
|
81
|
-
return uc $1 if $val =~ /\b([EW])
|
82
|
-
return $1 eq '-' ? 'W' : 'E' if $val =~
|
81
|
+
return uc $1 if $val =~ /\b([EW])\b/i;
|
82
|
+
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
83
83
|
return undef;
|
84
84
|
},
|
85
85
|
E => 'East',
|
@@ -89,7 +89,7 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
|
|
89
89
|
Notes => 'hours:minutes:seconds:frames',
|
90
90
|
ValueConv => 'sprintf("%.2x:%.2x:%.2x:%.2x",reverse unpack("C*",$val))',
|
91
91
|
},
|
92
|
-
# 0x14 - TitleBinaryGroup
|
92
|
+
# 0x14 - TitleBinaryGroup - val: 0x00000000,0x14200130
|
93
93
|
# 0x15 - TitleCassetteNo (ref 7)
|
94
94
|
# 0x16-0x17 - TitleSoftID (ref 7)
|
95
95
|
# (0x18,0x19 listed as TitleTextHeader/TitleText by ref 7)
|
@@ -134,8 +134,8 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
|
|
134
134
|
Name => 'Camera2',
|
135
135
|
SubDirectory => { TagTable => 'Image::ExifTool::H264::Camera2' },
|
136
136
|
},
|
137
|
-
# 0x73 Lens - val:
|
138
|
-
# 0x74 Gain
|
137
|
+
# 0x73 Lens - val: 0x04ffffd3,0x0effffd3,0x15ffffd3,0x41ffffd3,0x52ffffd3,0x59ffffd3,0x65ffffd3,0x71ffffd3,0x75ffffd3,0x79ffffd3,0x7fffffd3,0xffffffd3...
|
138
|
+
# 0x74 Gain - val: 0xb8ffff0f
|
139
139
|
# 0x75 Pedestal
|
140
140
|
# 0x76 Gamma
|
141
141
|
# 0x77 Detail
|
@@ -376,34 +376,49 @@ my $parsePictureTiming; # flag to enable parsing of picture timing information (
|
|
376
376
|
Notes => 'combined with tag 0xc8',
|
377
377
|
},
|
378
378
|
# 0xc9-0xcf - GPSOption
|
379
|
+
# 0xc9 - val: 0x001d0203
|
380
|
+
0xca => { #PH (Sony DSC-HX7V)
|
381
|
+
Name => 'GPSDateStamp',
|
382
|
+
Format => 'string',
|
383
|
+
Groups => { 1 => 'GPS', 2 => 'Time' },
|
384
|
+
Combine => 2, # the next 2 tags contain the rest of the string
|
385
|
+
Notes => 'combined with tags 0xcb and 0xcc',
|
386
|
+
ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
|
387
|
+
},
|
379
388
|
0xe0 => {
|
380
389
|
Name => 'MakeModel',
|
381
390
|
SubDirectory => { TagTable => 'Image::ExifTool::H264::MakeModel' },
|
382
391
|
},
|
383
392
|
# 0xe1-0xef - MakerOption
|
384
393
|
# 0xe1 - val: 0x01000670,0x01000678,0x06ffffff,0x01ffffff,0x01000020,0x01000400...
|
385
|
-
# 0xe2-0xe8 - val: 0x00000000 in many samples
|
386
394
|
0xe1 => { #6
|
387
395
|
Name => 'RecInfo',
|
388
396
|
Condition => '$$self{Make} eq "Canon"',
|
389
397
|
Notes => 'Canon only',
|
390
398
|
SubDirectory => { TagTable => 'Image::ExifTool::H264::RecInfo' },
|
391
399
|
},
|
400
|
+
# 0xe2-0xe8 - val: 0x00000000 in many samples
|
401
|
+
# 0xe2 - val: 0x00000000,0x01000000,0x01010000,0x8080900c,0x8080a074
|
402
|
+
# 0xe3 - val: 0x00801f89,0x00801f8b,0x00c01f89,0xc9c01f80
|
392
403
|
0xe4 => { #PH
|
393
404
|
Name => 'Model',
|
394
405
|
Condition => '$$self{Make} eq "Sony"', # (possibly also Canon models?)
|
395
406
|
Description => 'Camera Model Name',
|
396
|
-
Notes => 'Sony
|
407
|
+
Notes => 'Sony only, combined with tags 0xe5 and 0xe6',
|
397
408
|
Format => 'string',
|
398
409
|
Combine => 2, # (not sure about 0xe6, but include it just in case)
|
399
410
|
RawConv => '$val eq "" ? undef : $val',
|
400
411
|
},
|
412
|
+
# 0xeb - val: 0x008a0a00,0x0a300000,0x508a0a00,0x52880a00,0x528a0a00
|
413
|
+
# 0xec - val: 0x0b700000
|
414
|
+
# 0xed - val: 0x0ce0f819
|
401
415
|
0xee => { #6 (HFS200)
|
402
416
|
Name => 'FrameInfo',
|
403
417
|
Condition => '$$self{Make} eq "Canon"',
|
404
418
|
Notes => 'Canon only',
|
405
419
|
SubDirectory => { TagTable => 'Image::ExifTool::H264::FrameInfo' },
|
406
420
|
},
|
421
|
+
# 0xef - val: 0x01c00000,0x0e00000c
|
407
422
|
);
|
408
423
|
|
409
424
|
# ConsumerCamera1 information (ref PH)
|
@@ -16,7 +16,7 @@ $VERSION = '1.30';
|
|
16
16
|
sub ProcessOcad($$$);
|
17
17
|
sub ProcessJPEG_HDR($$$);
|
18
18
|
|
19
|
-
# (
|
19
|
+
# (most of the tags in this table are for documentation purposes only)
|
20
20
|
%Image::ExifTool::JPEG::Main = (
|
21
21
|
NOTES => q{
|
22
22
|
This table lists information extracted by ExifTool from JPEG images. See
|
@@ -96,6 +96,12 @@ sub ProcessJPEG_HDR($$$);
|
|
96
96
|
Name => 'Stim',
|
97
97
|
Condition => '$$valPt =~ /^Stim\0/',
|
98
98
|
SubDirectory => { TagTable => 'Image::ExifTool::Stim::Main' },
|
99
|
+
}, {
|
100
|
+
Name => 'ThermalData', # (written by DJI FLIR models)
|
101
|
+
Condition => '$$self{Make} eq "DJI"',
|
102
|
+
Notes => 'DJI raw thermal data',
|
103
|
+
Groups => { 0 => 'APP3', 1 => 'DJI', 2 => 'Image' },
|
104
|
+
Binary => 1,
|
99
105
|
}, {
|
100
106
|
Name => 'PreviewImage', # (written by HP R837 and Samsung S1060)
|
101
107
|
Condition => '$$valPt =~ /^\xff\xd8\xff\xdb/',
|
@@ -109,6 +115,10 @@ sub ProcessJPEG_HDR($$$);
|
|
109
115
|
Name => 'FPXR', # (non-standard location written by some HP models)
|
110
116
|
Condition => '$$valPt =~ /^FPXR\0/',
|
111
117
|
SubDirectory => { TagTable => 'Image::ExifTool::FlashPix::Main' },
|
118
|
+
}, {
|
119
|
+
Name => 'ThermalParams', # (written by DJI FLIR models)
|
120
|
+
Condition => '$$self{Make} eq "DJI" and $$valPt =~ /^\xaa\x55\x12\x06/',
|
121
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::ThermalParams' },
|
112
122
|
}, {
|
113
123
|
Name => 'PreviewImage', # (eg. Samsung S1060)
|
114
124
|
Notes => 'continued from APP3',
|
@@ -121,6 +131,12 @@ sub ProcessJPEG_HDR($$$);
|
|
121
131
|
Name => 'SamsungUniqueID',
|
122
132
|
Condition => '$$valPt =~ /ssuniqueid\0/',
|
123
133
|
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::APP5' },
|
134
|
+
}, {
|
135
|
+
Name => 'ThermalCalibration', # (written by DJI FLIR models)
|
136
|
+
Condition => '$$self{Make} eq "DJI"',
|
137
|
+
Notes => 'DJI thermal calibration data',
|
138
|
+
Groups => { 0 => 'APP5', 1 => 'DJI', 2 => 'Image' },
|
139
|
+
Binary => 1,
|
124
140
|
}, {
|
125
141
|
Name => 'PreviewImage', # (eg. BenQ DC E1050)
|
126
142
|
Notes => 'continued from APP4',
|
@@ -142,6 +158,12 @@ sub ProcessJPEG_HDR($$$);
|
|
142
158
|
Condition => '$$valPt =~ /^GoPro\0/',
|
143
159
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' },
|
144
160
|
# also seen Motorola APP6 "MMIMETA\0", with sub-types: AL3A,ALED,MMI0,MOTD,QC3A
|
161
|
+
}, {
|
162
|
+
Name => 'DJI_DTAT', # (written by ZH20T)
|
163
|
+
Condition => '$$valPt =~ /^DTAT\0\0.\{/s',
|
164
|
+
Groups => { 0 => 'APP6', 1 => 'DJI' },
|
165
|
+
Notes => 'DJI Thermal Analysis Tool record',
|
166
|
+
ValueConv => 'substr($val,7)',
|
145
167
|
}],
|
146
168
|
APP7 => [{
|
147
169
|
Name => 'Pentax',
|
@@ -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.93';
|
66
66
|
|
67
67
|
sub LensIDConv($$$);
|
68
68
|
sub ProcessNikonAVI($$$);
|
@@ -886,33 +886,33 @@ my %afPoints39 = (
|
|
886
886
|
# AF point indices for models with 105 focus points, eg. D6 (ref 28)
|
887
887
|
# - 7 rows (A-G) with 15 columns (1-15), center is D8
|
888
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',
|
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
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',
|
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
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',
|
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
916
|
);
|
917
917
|
|
918
918
|
# AF point indices for models with 135 focus points, eg. 1J1 (ref PH)
|
@@ -1097,7 +1097,12 @@ my %binaryDataAttrs = (
|
|
1097
1097
|
0x0004 => { Name => 'Quality', Writable => 'string' },
|
1098
1098
|
0x0005 => { Name => 'WhiteBalance', Writable => 'string' },
|
1099
1099
|
0x0006 => { Name => 'Sharpness', Writable => 'string' },
|
1100
|
-
0x0007 => {
|
1100
|
+
0x0007 => {
|
1101
|
+
Name => 'FocusMode',
|
1102
|
+
DataMember => 'FocusMode',
|
1103
|
+
Writable => 'string',
|
1104
|
+
RawConv => '$$self{FocusMode} = $val',
|
1105
|
+
},
|
1101
1106
|
# FlashSetting (better named FlashSyncMode, ref 28) values:
|
1102
1107
|
# "Normal", "Slow", "Rear Slow", "RED-EYE", "RED-EYE SLOW"
|
1103
1108
|
0x0008 => { Name => 'FlashSetting', Writable => 'string' },
|
@@ -1424,12 +1429,27 @@ my %binaryDataAttrs = (
|
|
1424
1429
|
Count => 4,
|
1425
1430
|
# (may need to divide by 4 for some images, eg. D3300/D5300, 12 bit - ref IB)
|
1426
1431
|
},
|
1432
|
+
0x003e => { #28
|
1433
|
+
Name => 'ImageSizeRAW',
|
1434
|
+
PrintConv => {
|
1435
|
+
1 => 'Large',
|
1436
|
+
2 => 'Medium',
|
1437
|
+
3 => 'Small',
|
1438
|
+
},
|
1439
|
+
},
|
1427
1440
|
0x0045 => { #IB
|
1428
1441
|
Name => 'CropArea',
|
1429
1442
|
Notes => 'left, top, width, height',
|
1430
1443
|
Writable => 'int16u',
|
1431
1444
|
Count => 4,
|
1432
1445
|
},
|
1446
|
+
0x004e => { #28
|
1447
|
+
Name => 'NikonSettings',
|
1448
|
+
Writable => 'undef',
|
1449
|
+
Permanent => 0,
|
1450
|
+
Flags => [ 'Binary', 'Protected' ],
|
1451
|
+
SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
|
1452
|
+
},
|
1433
1453
|
0x004f => { #IB (D850)
|
1434
1454
|
Name => 'ColorTemperatureAuto',
|
1435
1455
|
Writable => 'int16u',
|
@@ -1500,6 +1520,7 @@ my %binaryDataAttrs = (
|
|
1500
1520
|
7 => 'Fired, External', #14
|
1501
1521
|
8 => 'Fired, Commander Mode',
|
1502
1522
|
9 => 'Fired, TTL Mode',
|
1523
|
+
18 => 'LED Light', #G.F. (movie LED light)
|
1503
1524
|
},
|
1504
1525
|
},
|
1505
1526
|
0x0088 => [
|
@@ -1828,9 +1849,9 @@ my %binaryDataAttrs = (
|
|
1828
1849
|
Condition => '$$valPt =~ /^0246/',
|
1829
1850
|
Name => 'ShotInfoD6',
|
1830
1851
|
SubDirectory => {
|
1831
|
-
TagTable => 'Image::ExifTool::Nikon::
|
1852
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
|
1832
1853
|
DecryptStart => 4,
|
1833
|
-
DecryptLen =>
|
1854
|
+
DecryptLen => 0xc21a + 12,
|
1834
1855
|
ByteOrder => 'LittleEndian',
|
1835
1856
|
},
|
1836
1857
|
},
|
@@ -1844,6 +1865,16 @@ my %binaryDataAttrs = (
|
|
1844
1865
|
ByteOrder => 'BigEndian',
|
1845
1866
|
},
|
1846
1867
|
},
|
1868
|
+
{ # (Z6_2 firmware version 1.00 and Z7_2 firmware versions 1.00 & 1.01, ref 28)
|
1869
|
+
Condition => '$$valPt =~ /^0800/ or $$valPt =~ /^0803/',
|
1870
|
+
Name => 'ShotInfoZ7_2',
|
1871
|
+
SubDirectory => {
|
1872
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7_2',
|
1873
|
+
DecryptStart => 4,
|
1874
|
+
DecryptLen => 0xce32 + 12,
|
1875
|
+
ByteOrder => 'LittleEndian',
|
1876
|
+
},
|
1877
|
+
},
|
1847
1878
|
{ # D7100=0227, Z6/Z7=0800
|
1848
1879
|
Condition => '$$valPt =~ /^0[28]/',
|
1849
1880
|
Name => 'ShotInfo02xx',
|
@@ -2218,6 +2249,11 @@ my %binaryDataAttrs = (
|
|
2218
2249
|
Name => 'FlashInfo0107', # (0107 for D4S/D750/D810/D5500/D7200, 0108 for D5/D500/D3400)
|
2219
2250
|
Condition => '$$valPt =~ /^010[78]/',
|
2220
2251
|
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' },
|
2252
|
+
},
|
2253
|
+
{
|
2254
|
+
Name => 'FlashInfo0300', # (Z7_2)
|
2255
|
+
Condition => '$$valPt =~ /^0300/',
|
2256
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0300' },
|
2221
2257
|
},
|
2222
2258
|
{
|
2223
2259
|
Name => 'FlashInfoUnknown',
|
@@ -3381,13 +3417,13 @@ my %binaryDataAttrs = (
|
|
3381
3417
|
130 => 'Subject Tracking (41 points)', #PH (NC)
|
3382
3418
|
131 => 'Face Priority (41 points)', #PH (NC)
|
3383
3419
|
192 => 'Pinpoint', #PH (Z7)
|
3384
|
-
193 => 'Single', #PH (Z7)
|
3420
|
+
193 => 'Single', #PH (Z7)
|
3385
3421
|
194 => 'Dynamic', #PH (Z7)
|
3386
3422
|
195 => 'Wide (S)', #PH (Z7)
|
3387
3423
|
196 => 'Wide (L)', #PH (Z7)
|
3388
3424
|
197 => 'Auto', #PH (Z7)
|
3389
|
-
198 => 'Auto (
|
3390
|
-
199 => 'Auto (
|
3425
|
+
198 => 'Auto (People)', #28 (Z7) #if no faces are detected, will record as 'Auto'. Camera setting recorded in AFAreaMode field in the MakerNotes area
|
3426
|
+
199 => 'Auto (Animal)', #28 (Z7) #if no animals are detected, will record as 'Auto'. Camera setting recorded in AFAreaMode field in the MakerNotes area
|
3391
3427
|
200 => 'Normal-area AF', #28 (D6)
|
3392
3428
|
201 => 'Wide-area AF', #28 (D6)
|
3393
3429
|
202 => 'Face-priority AF', #28 (D6)
|
@@ -3682,7 +3718,7 @@ my %binaryDataAttrs = (
|
|
3682
3718
|
],
|
3683
3719
|
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
|
3684
3720
|
Name => 'AFPointsUsed',
|
3685
|
-
Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
|
3721
|
+
Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
|
3686
3722
|
Notes => q{
|
3687
3723
|
models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
|
3688
3724
|
point is D8
|
@@ -3771,6 +3807,14 @@ my %binaryDataAttrs = (
|
|
3771
3807
|
},
|
3772
3808
|
Format => 'int16u',
|
3773
3809
|
},
|
3810
|
+
0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
|
3811
|
+
Name => 'AFFocusPointXPosition',
|
3812
|
+
Condition => q{
|
3813
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3814
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3815
|
+
},
|
3816
|
+
PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); },
|
3817
|
+
},
|
3774
3818
|
0x30 => [
|
3775
3819
|
{ #PH (Z7)
|
3776
3820
|
Name => 'AFAreaYPosition',
|
@@ -3790,6 +3834,14 @@ my %binaryDataAttrs = (
|
|
3790
3834
|
PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
|
3791
3835
|
},
|
3792
3836
|
],
|
3837
|
+
0x31 => { #28 (Z7)
|
3838
|
+
Name => 'AFFocusPointYPosition',
|
3839
|
+
Condition => q{
|
3840
|
+
$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
|
3841
|
+
$$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
|
3842
|
+
},
|
3843
|
+
PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
|
3844
|
+
},
|
3793
3845
|
0x32 => { #PH (Z7)
|
3794
3846
|
Name => 'AFAreaWidth',
|
3795
3847
|
Condition => '$$self{AFInfo2Version} =~ /^03/',
|
@@ -6394,6 +6446,77 @@ my %nikonFocalConversions = (
|
|
6394
6446
|
},
|
6395
6447
|
# note: DecryptLen currently set to OtherOffset + 0x2ea5 - 0x2c90
|
6396
6448
|
);
|
6449
|
+
|
6450
|
+
# shot information for the D6 firmware 1.00 (encrypted) - ref 28
|
6451
|
+
%Image::ExifTool::Nikon::ShotInfoD6 = (
|
6452
|
+
PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
6453
|
+
WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
6454
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6455
|
+
VARS => { ID_LABEL => 'Index' },
|
6456
|
+
DATAMEMBER => [ 0x9c, 0xc219 ],
|
6457
|
+
WRITABLE => 1,
|
6458
|
+
FIRST_ENTRY => 0,
|
6459
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6460
|
+
NOTES => 'These tags are extracted from encrypted data in images from the D6.',
|
6461
|
+
0x00 => {
|
6462
|
+
Name => 'ShotInfoVersion',
|
6463
|
+
Format => 'string[4]',
|
6464
|
+
Writable => 0,
|
6465
|
+
},
|
6466
|
+
0x24 => {
|
6467
|
+
Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data)
|
6468
|
+
DataMember => 'NumberOffsets',
|
6469
|
+
Format => 'int32u',
|
6470
|
+
Writable => 0,
|
6471
|
+
Hidden => 1,
|
6472
|
+
},
|
6473
|
+
0x9c => {
|
6474
|
+
Name => 'OrientationOffset',
|
6475
|
+
DataMember => 'OrientationOffset',
|
6476
|
+
Format => 'int32u',
|
6477
|
+
Writable => 0,
|
6478
|
+
Hidden => 1,
|
6479
|
+
RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
|
6480
|
+
},
|
6481
|
+
### 0xc21a - OrientationInfo start (D6 firmware 1.00)
|
6482
|
+
0xc219 => {
|
6483
|
+
Name => 'Hook1',
|
6484
|
+
Hidden => 1,
|
6485
|
+
RawConv => 'undef',
|
6486
|
+
# account for variable location of OrientationInfo data
|
6487
|
+
Hook => '$varSize = $$self{OrientationOffset} - 0xc21a',
|
6488
|
+
},
|
6489
|
+
|
6490
|
+
0xc21a => {
|
6491
|
+
Name => 'RollAngle',
|
6492
|
+
Format => 'fixed32u',
|
6493
|
+
Notes => 'converted to degrees of clockwise camera roll',
|
6494
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
6495
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
6496
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
6497
|
+
PrintConvInv => '$val',
|
6498
|
+
},
|
6499
|
+
0xc21e => {
|
6500
|
+
Name => 'PitchAngle',
|
6501
|
+
Format => 'fixed32u',
|
6502
|
+
Notes => 'converted to degrees of upward camera tilt',
|
6503
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
6504
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
6505
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
6506
|
+
PrintConvInv => '$val',
|
6507
|
+
},
|
6508
|
+
0xc222 => {
|
6509
|
+
Name => 'YawAngle',
|
6510
|
+
Format => 'fixed32u',
|
6511
|
+
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
6512
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
6513
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
6514
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
6515
|
+
PrintConvInv => '$val',
|
6516
|
+
},
|
6517
|
+
# note: DecryptLen currently set to 0xc21a + 12
|
6518
|
+
);
|
6519
|
+
|
6397
6520
|
# shot information for the D610 firmware 1.00 (encrypted) - ref PH
|
6398
6521
|
%Image::ExifTool::Nikon::ShotInfoD610 = (
|
6399
6522
|
PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
@@ -7211,6 +7334,98 @@ my %nikonFocalConversions = (
|
|
7211
7334
|
# note: DecryptLen currently set to 0x3697
|
7212
7335
|
);
|
7213
7336
|
|
7337
|
+
# shot information for the Z7_2 firmware 1.00 (encrypted) - ref 28
|
7338
|
+
%Image::ExifTool::Nikon::ShotInfoZ7_2 = (
|
7339
|
+
PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
7340
|
+
WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
7341
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7342
|
+
VARS => { ID_LABEL => 'Index' },
|
7343
|
+
DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x98, 0xce31 ],
|
7344
|
+
WRITABLE => 1,
|
7345
|
+
FIRST_ENTRY => 0,
|
7346
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7347
|
+
NOTES => 'These tags are extracted from encrypted data in images from the Z7_2.',
|
7348
|
+
0x00 => {
|
7349
|
+
Name => 'ShotInfoVersion',
|
7350
|
+
Format => 'string[4]',
|
7351
|
+
Writable => 0,
|
7352
|
+
},
|
7353
|
+
0x04 => {
|
7354
|
+
Name => 'FirmwareVersion',
|
7355
|
+
DataMember => 'FirmwareVersion',
|
7356
|
+
Format => 'string[8]',
|
7357
|
+
Writable => 0,
|
7358
|
+
RawConv => '$$self{FirmwareVersion} = $val',
|
7359
|
+
},
|
7360
|
+
0x0E => {
|
7361
|
+
Name => 'FirmwareVersion2',
|
7362
|
+
Format => 'string[8]',
|
7363
|
+
Writable => 0,
|
7364
|
+
RawConv => '$$self{FirmwareVersion2} = $val',
|
7365
|
+
Hidden => 1,
|
7366
|
+
},
|
7367
|
+
0x18 => {
|
7368
|
+
Name => 'FirmwareVersion3',
|
7369
|
+
Format => 'string[8]',
|
7370
|
+
Writable => 0,
|
7371
|
+
RawConv => '$$self{FirmwareVersion3} = $val',
|
7372
|
+
Hidden => 1,
|
7373
|
+
},
|
7374
|
+
0x24 => {
|
7375
|
+
Name => 'NumberOffsets', #number of entries in offset table. offsets are from start of ShotInfo data.
|
7376
|
+
DataMember => 'NumberOffsets',
|
7377
|
+
Format => 'int32u',
|
7378
|
+
Writable => 0,
|
7379
|
+
Hidden => 1,
|
7380
|
+
},
|
7381
|
+
0x98 => {
|
7382
|
+
Name => 'OrientationOffset',
|
7383
|
+
DataMember => 'OrientationOffset',
|
7384
|
+
Format => 'int32u',
|
7385
|
+
Writable => 0,
|
7386
|
+
Hidden => 1,
|
7387
|
+
RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
|
7388
|
+
},
|
7389
|
+
|
7390
|
+
### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
|
7391
|
+
0xce31 => {
|
7392
|
+
Name => 'Hook1',
|
7393
|
+
Hidden => 1,
|
7394
|
+
RawConv => 'undef',
|
7395
|
+
# account for variable location of OrientationInfo data
|
7396
|
+
Hook => '$varSize = $$self{OrientationOffset} - 0xce32',
|
7397
|
+
},
|
7398
|
+
|
7399
|
+
0xce32 => {
|
7400
|
+
Name => 'RollAngle',
|
7401
|
+
Format => 'fixed32u',
|
7402
|
+
Notes => 'converted to degrees of clockwise camera roll',
|
7403
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
7404
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
7405
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
7406
|
+
PrintConvInv => '$val',
|
7407
|
+
},
|
7408
|
+
0xce36 => {
|
7409
|
+
Name => 'PitchAngle',
|
7410
|
+
Format => 'fixed32u',
|
7411
|
+
Notes => 'converted to degrees of upward camera tilt',
|
7412
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
7413
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
7414
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
7415
|
+
PrintConvInv => '$val',
|
7416
|
+
},
|
7417
|
+
0xce3a => {
|
7418
|
+
Name => 'YawAngle',
|
7419
|
+
Format => 'fixed32u',
|
7420
|
+
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
7421
|
+
ValueConv => '$val <= 180 ? $val : $val - 360',
|
7422
|
+
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
7423
|
+
PrintConv => 'sprintf("%.1f", $val)',
|
7424
|
+
PrintConvInv => '$val',
|
7425
|
+
},
|
7426
|
+
#note: DecryptLen currently set to 0xce32 + 12
|
7427
|
+
);
|
7428
|
+
|
7214
7429
|
# Flash information (ref JD)
|
7215
7430
|
%Image::ExifTool::Nikon::FlashInfo0100 = (
|
7216
7431
|
%binaryDataAttrs,
|
@@ -8105,6 +8320,42 @@ my %nikonFocalConversions = (
|
|
8105
8320
|
],
|
8106
8321
|
);
|
8107
8322
|
|
8323
|
+
# Flash information for the Z7_2 (ref 28)
|
8324
|
+
# (likey similar to FlashInfo010 and FlashInfo0108 with addition of support for radio controlled units such as the SB-5000?
|
8325
|
+
%Image::ExifTool::Nikon::FlashInfo0300 = (
|
8326
|
+
%binaryDataAttrs,
|
8327
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8328
|
+
0 => {
|
8329
|
+
Name => 'FlashInfoVersion',
|
8330
|
+
Format => 'string[4]',
|
8331
|
+
Writable => 0,
|
8332
|
+
},
|
8333
|
+
4 => {
|
8334
|
+
Name => 'FlashSource',
|
8335
|
+
PrintConv => {
|
8336
|
+
0 => 'None',
|
8337
|
+
1 => 'External',
|
8338
|
+
2 => 'Internal',
|
8339
|
+
},
|
8340
|
+
},
|
8341
|
+
6 => {
|
8342
|
+
Format => 'int8u[2]',
|
8343
|
+
Name => 'ExternalFlashFirmware',
|
8344
|
+
SeparateTable => 'FlashFirmware',
|
8345
|
+
PrintConv => \%flashFirmware,
|
8346
|
+
},
|
8347
|
+
27 => {
|
8348
|
+
Name => 'FlashCompensation',
|
8349
|
+
# this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
|
8350
|
+
# the compensation from the external unit (0x0017) for "Optional" FlashType - PH
|
8351
|
+
Format => 'int8s',
|
8352
|
+
Priority => 0,
|
8353
|
+
ValueConv => '-$val/6',
|
8354
|
+
ValueConvInv => '-6 * $val',
|
8355
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
|
8356
|
+
PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
|
8357
|
+
},
|
8358
|
+
);
|
8108
8359
|
# Unknown Flash information
|
8109
8360
|
%Image::ExifTool::Nikon::FlashInfoUnknown = (
|
8110
8361
|
%binaryDataAttrs,
|
@@ -8933,6 +9184,7 @@ my %nikonFocalConversions = (
|
|
8933
9184
|
7 => 'Fired, External', #14
|
8934
9185
|
8 => 'Fired, Commander Mode',
|
8935
9186
|
9 => 'Fired, TTL Mode',
|
9187
|
+
18 => 'LED Light', #G.F. (movie LED light)
|
8936
9188
|
},
|
8937
9189
|
},
|
8938
9190
|
0x2000098 => [
|
@@ -9262,6 +9514,32 @@ sub PrintAFPointsGridInv($$$)
|
|
9262
9514
|
return join(" ", unpack("H2"x$size, pack('C*', @dat)));
|
9263
9515
|
}
|
9264
9516
|
|
9517
|
+
#------------------------------------------------------------------------------
|
9518
|
+
# Print conversion for relative Left/Right AF points (ref 28)
|
9519
|
+
# Inputs: 0) column, 1) number of columns
|
9520
|
+
# Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
|
9521
|
+
sub PrintAFPointsLeftRight($$)
|
9522
|
+
{
|
9523
|
+
my ($col, $ncol) = @_;
|
9524
|
+
my $center = 1 + ($ncol + 1)/2;
|
9525
|
+
return 'C' if $col == $center;
|
9526
|
+
return sprintf('%d', $center - $col) . 'L of Center' if $col < $center;
|
9527
|
+
return sprintf('%d', $col - $center) . 'R of Center' if $col > $center;
|
9528
|
+
}
|
9529
|
+
|
9530
|
+
#------------------------------------------------------------------------------
|
9531
|
+
# Print conversion for relative Up/Down AF points (ref 28)
|
9532
|
+
# Inputs: 0) column, 1) number of columns
|
9533
|
+
# Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
|
9534
|
+
sub PrintAFPointsUpDown($$)
|
9535
|
+
{
|
9536
|
+
my ($row, $nrow) = @_;
|
9537
|
+
my $center = 1 + ($nrow + 1)/2;
|
9538
|
+
return 'C' if $row == $center;
|
9539
|
+
return sprintf('%d', $center - $row) . 'U from Center' if $row < $center;
|
9540
|
+
return sprintf('%d', $row - $center) . 'D from Center' if $row > $center;
|
9541
|
+
}
|
9542
|
+
|
9265
9543
|
#------------------------------------------------------------------------------
|
9266
9544
|
# Print PictureControl value
|
9267
9545
|
# Inputs: 0) value (with 0x80 subtracted),
|
@@ -9667,12 +9945,10 @@ sub PrescanExif($$$)
|
|
9667
9945
|
$dataLen = length $data;
|
9668
9946
|
$dirStart = 0;
|
9669
9947
|
}
|
9670
|
-
# loop through
|
9671
|
-
my ($lastTag) = sort { $b <=> $a } keys %$tagHash; # (reverse sort)
|
9948
|
+
# loop through Nikon MakerNote IFD entries
|
9672
9949
|
for ($index=0; $index<$numEntries; ++$index) {
|
9673
9950
|
my $entry = $dirStart + 2 + 12 * $index;
|
9674
9951
|
my $tagID = Get16u($dataPt, $entry);
|
9675
|
-
last if $tagID > $lastTag; # (assuming tags are in order)
|
9676
9952
|
next unless exists $$tagHash{$tagID}; # only extract required tags
|
9677
9953
|
my $format = Get16u($dataPt, $entry+2);
|
9678
9954
|
next if $format < 1 or $format > 13;
|