exiftool_vendored 12.14.0 → 12.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1529a49f0175445c31e6d5a6607546d958e2b08ce2c044d43232ac07f51a6fb5
4
- data.tar.gz: bc6637fc0ef323192aa5e6c7e8553520f2d0acd9039e870ae1f9340fa00445c8
3
+ metadata.gz: e30c22a774925019702c59a5aa788607b27a5b217824d47ec66be50e5a10e8f1
4
+ data.tar.gz: 5c54290d58d097af3d8950f187b940e6a930d1d9502c38252620b57c8ff64067
5
5
  SHA512:
6
- metadata.gz: 03fa438994202e58a6c85ae0715018f89ca76c3f0fbfa87a9a8438b5c73637ed53d92491759f63926e3c57cefb2ec5f22dadd8b67c04d20a8e06aaa33f0328c0
7
- data.tar.gz: 5e2cd8a33c4d66057bf115cd6f3bf3adaab426a44d8988747581d21478c81325e3cc88410b783cb6da7a55efbc04f7bc448291d509baf248995d10cfdcdeea0f
6
+ metadata.gz: '07965ed32bfb30fe68f862fc2e1e8c1a59094182b664d4cfbfdc9fe0c5e4db16b08733c0ff42c093c1dbd289148c24f5ed51e40b99b582701441cc4bf64b8061'
7
+ data.tar.gz: 5ab6c978e3d9066a288173d0efd9a786245fabe9114446b77115032153fc64252dd05b1b47d4608e94b0ded7bf996fdb02706136036ede870aa2c779796b6d63
@@ -4,9 +4,19 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.00. (Other versions are
7
+ Note: The most recent production release is Version 12.15. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Jan. 18, 2021 - Version 12.15 (production release)
11
+
12
+ - Added a couple of new Sony LensType values (thanks LibRaw and Jos Roost)
13
+ - Added a new Nikon FlashMode value (thanks Mike)
14
+ - Decode NikonSettings (thanks Warren Hatch)
15
+ - Decode thermal information from DJI RJPEG images
16
+ - Fixed extra newline in -echo3 and -echo4 outputs added in version 12.10
17
+ - Fixed out-of-memory problem when writing some very large PNG files under
18
+ Windows
19
+
10
20
  Jan. 6, 2021 - Version 12.14
11
21
 
12
22
  - Added support for 2 more types of timed GPS in video files (that makes 49
@@ -115,6 +115,7 @@ html/TagNames/Motorola.html
115
115
  html/TagNames/Nikon.html
116
116
  html/TagNames/NikonCapture.html
117
117
  html/TagNames/NikonCustom.html
118
+ html/TagNames/NikonSettings.html
118
119
  html/TagNames/Nintendo.html
119
120
  html/TagNames/OOXML.html
120
121
  html/TagNames/Ogg.html
@@ -337,6 +338,7 @@ lib/Image/ExifTool/Motorola.pm
337
338
  lib/Image/ExifTool/Nikon.pm
338
339
  lib/Image/ExifTool/NikonCapture.pm
339
340
  lib/Image/ExifTool/NikonCustom.pm
341
+ lib/Image/ExifTool/NikonSettings.pm
340
342
  lib/Image/ExifTool/Nintendo.pm
341
343
  lib/Image/ExifTool/OOXML.pm
342
344
  lib/Image/ExifTool/Ogg.pm
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.14"
50
+ "version" : "12.15"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.14
31
+ version: 12.15
data/bin/README CHANGED
@@ -106,8 +106,8 @@ your home directory, then you would type the following commands in a
106
106
  terminal window to extract and run ExifTool:
107
107
 
108
108
  cd ~/Desktop
109
- gzip -dc Image-ExifTool-12.14.tar.gz | tar -xf -
110
- cd Image-ExifTool-12.14
109
+ gzip -dc Image-ExifTool-12.15.tar.gz | tar -xf -
110
+ cd Image-ExifTool-12.15
111
111
  ./exiftool t/images/ExifTool.jpg
112
112
 
113
113
  Note: These commands extract meta information from one of the test images.
@@ -10,7 +10,7 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '12.14';
13
+ my $version = '12.15';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
16
  my $exeDir;
@@ -371,12 +371,12 @@ if (grep /^-common_args$/i, @ARGV) {
371
371
  Command: for (;;) {
372
372
 
373
373
  if (@echo3) {
374
- my $str = join "\n", @echo3, "\n";
374
+ my $str = join("\n", @echo3) . "\n";
375
375
  $str =~ s/\$\{status\}/$rtnVal/ig;
376
376
  print STDOUT $str;
377
377
  }
378
378
  if (@echo4) {
379
- my $str = join "\n", @echo4, "\n";
379
+ my $str = join("\n", @echo4) . "\n";
380
380
  $str =~ s/\$\{status\}/$rtnVal/ig;
381
381
  print STDERR $str;
382
382
  }
@@ -5367,7 +5367,7 @@ with this command:
5367
5367
 
5368
5368
  produces output like this:
5369
5369
 
5370
- -- Generated by ExifTool 12.14 --
5370
+ -- Generated by ExifTool 12.15 --
5371
5371
  File: a.jpg - 2003:10:31 15:44:19
5372
5372
  (f/5.6, 1/60s, ISO 100)
5373
5373
  File: b.jpg - 2006:05:23 11:57:38
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
28
28
  %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
30
30
 
31
- $VERSION = '12.14';
31
+ $VERSION = '12.15';
32
32
  $RELEASE = '';
33
33
  @ISA = qw(Exporter);
34
34
  %EXPORT_TAGS = (
@@ -6695,6 +6695,22 @@ sub ProcessJPEG($$)
6695
6695
  # extract the Stim information (it is in standard TIFF format)
6696
6696
  my $tagTablePtr = GetTagTable('Image::ExifTool::Stim::Main');
6697
6697
  $self->ProcessTIFF(\%dirInfo, $tagTablePtr);
6698
+ } elsif ($$self{Make} eq 'DJI') {
6699
+ $dumpType = 'DJI ThermalData';
6700
+ # add this data to the combined data if it exists
6701
+ my $dataPt = $segDataPt;
6702
+ if (defined $combinedSegData) {
6703
+ $combinedSegData .= $$segDataPt;
6704
+ $dataPt = \$combinedSegData;
6705
+ }
6706
+ if ($nextMarker == $marker) {
6707
+ $combinedSegData = $$segDataPt unless defined $combinedSegData;
6708
+ } else {
6709
+ # process DJI FLIR thermal data
6710
+ my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main');
6711
+ $self->HandleTag($tagTablePtr, 'APP3', $$dataPt);
6712
+ undef $combinedSegData;
6713
+ }
6698
6714
  } elsif ($$segDataPt =~ /^\xff\xd8\xff\xdb/) {
6699
6715
  $dumpType = 'PreviewImage'; # (Samsung, HP, BenQ)
6700
6716
  $preview = $$segDataPt;
@@ -6729,6 +6745,11 @@ sub ProcessJPEG($$)
6729
6745
  # set flag if this is the last FPXR segment
6730
6746
  $dirInfo{LastFPXR} = not ($nextMarker==$marker and $$nextSegDataPt=~/^FPXR\0/),
6731
6747
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
6748
+ } elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^\xaa\x55\x12\x06/) {
6749
+ $dumpType = 'DJI ThermalParams';
6750
+ DirStart(\%dirInfo, 0, 0);
6751
+ my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams');
6752
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
6732
6753
  } elsif ($preview) {
6733
6754
  # continued Samsung S1060 preview from APP3
6734
6755
  $dumpType = 'PreviewImage';
@@ -6751,6 +6772,10 @@ sub ProcessJPEG($$)
6751
6772
  } elsif ($$segDataPt =~ /^ssuniqueid\0/) {
6752
6773
  my $tagTablePtr = GetTagTable('Image::ExifTool::Samsung::APP5');
6753
6774
  $self->HandleTag($tagTablePtr, 'ssuniqueid', substr($$segDataPt, 11));
6775
+ } elsif ($$self{Make} eq 'DJI') {
6776
+ $dumpType = 'DJI ThermalCal';
6777
+ my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main');
6778
+ $self->HandleTag($tagTablePtr, 'APP5', $$segDataPt);
6754
6779
  } elsif ($preview) {
6755
6780
  $dumpType = 'PreviewImage';
6756
6781
  $preview .= $$segDataPt;
@@ -6786,6 +6811,10 @@ sub ProcessJPEG($$)
6786
6811
  my $tagTablePtr = GetTagTable('Image::ExifTool::GoPro::GPMF');
6787
6812
  DirStart(\%dirInfo, 6);
6788
6813
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
6814
+ } elsif ($$segDataPt =~ /^DTAT\0\0.\{/s) {
6815
+ $dumpType = 'DJI_DTAT';
6816
+ my $tagTablePtr = GetTagTable('Image::ExifTool::JPEG::Main');
6817
+ $self->HandleTag($tagTablePtr, 'APP6', $$segDataPt);
6789
6818
  }
6790
6819
  } elsif ($marker == 0xe7) { # APP7 (Pentax, Huawei, Qualcomm)
6791
6820
  if ($$segDataPt =~ /^PENTAX \0(II|MM)/) {
@@ -2298,10 +2298,10 @@ MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video,
2298
2298
  MIFF, MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS,
2299
2299
  MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft,
2300
2300
  Minolta, MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom,
2301
- NikonScan, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF, PICT, PNG,
2302
- PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD,
2303
- PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM,
2304
- ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
2301
+ NikonScan, NikonSettings, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF,
2302
+ PICT, PNG, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, PhaseOne,
2303
+ PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD,
2304
+ PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
2305
2305
  Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4,
2306
2306
  Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD,
2307
2307
  SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim,
@@ -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.02';
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' },
@@ -16,7 +16,7 @@ $VERSION = '1.30';
16
16
  sub ProcessOcad($$$);
17
17
  sub ProcessJPEG_HDR($$$);
18
18
 
19
- # (this main JPEG table is for documentation purposes only)
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.90';
65
+ $VERSION = '3.91';
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 => { Name => 'FocusMode', Writable => 'string' },
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 => 'Fired, Sync Mode', #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::ShotInfo',
1852
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
1832
1853
  DecryptStart => 4,
1833
- DecryptLen => 0xa4, # only decrypt the version info & offset fields for now
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) (AF-S?)
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 (198)', #PH (Z7) (focus lock with AF-C maybe?)
3390
- 199 => 'Auto (focus lock)', #PH (Z7, AF-S)
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,
@@ -9262,6 +9513,32 @@ sub PrintAFPointsGridInv($$$)
9262
9513
  return join(" ", unpack("H2"x$size, pack('C*', @dat)));
9263
9514
  }
9264
9515
 
9516
+ #------------------------------------------------------------------------------
9517
+ # Print conversion for relative Left/Right AF points (ref 28)
9518
+ # Inputs: 0) column, 1) number of columns
9519
+ # Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
9520
+ sub PrintAFPointsLeftRight($$)
9521
+ {
9522
+ my ($col, $ncol) = @_;
9523
+ my $center = 1 + ($ncol + 1)/2;
9524
+ return 'C' if $col == $center;
9525
+ return sprintf('%d', $center - $col) . 'L of Center' if $col < $center;
9526
+ return sprintf('%d', $col - $center) . 'R of Center' if $col > $center;
9527
+ }
9528
+
9529
+ #------------------------------------------------------------------------------
9530
+ # Print conversion for relative Up/Down AF points (ref 28)
9531
+ # Inputs: 0) column, 1) number of columns
9532
+ # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
9533
+ sub PrintAFPointsUpDown($$)
9534
+ {
9535
+ my ($row, $nrow) = @_;
9536
+ my $center = 1 + ($nrow + 1)/2;
9537
+ return 'C' if $row == $center;
9538
+ return sprintf('%d', $center - $row) . 'U from Center' if $row < $center;
9539
+ return sprintf('%d', $row - $center) . 'D from Center' if $row > $center;
9540
+ }
9541
+
9265
9542
  #------------------------------------------------------------------------------
9266
9543
  # Print PictureControl value
9267
9544
  # Inputs: 0) value (with 0x80 subtracted),