exiftool_vendored 12.14.0 → 12.15.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 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),