exiftool_vendored 12.42.0 → 12.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +189 -6
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +113 -95
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +66 -37
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/DJI.pm +2 -1
  19. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  20. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  21. data/bin/lib/Image/ExifTool/Exif.pm +17 -12
  22. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  23. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  24. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  25. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  26. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  27. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  28. data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
  29. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  30. data/bin/lib/Image/ExifTool/ID3.pm +6 -6
  31. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  32. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  33. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  34. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  35. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  36. data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  37. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  38. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  39. data/bin/lib/Image/ExifTool/Nikon.pm +288 -122
  40. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  41. data/bin/lib/Image/ExifTool/Olympus.pm +3 -2
  42. data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  43. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  44. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  45. data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
  46. data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  47. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  48. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  49. data/bin/lib/Image/ExifTool/README +13 -3
  50. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  51. data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  52. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  53. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  54. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  55. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +4737 -4517
  57. data/bin/lib/Image/ExifTool/TagNames.pod +1837 -1417
  58. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  59. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  60. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  61. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  62. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  63. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  64. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  65. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  66. data/bin/lib/Image/ExifTool/Writer.pl +13 -5
  67. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  68. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  69. data/bin/lib/Image/ExifTool.pm +111 -24
  70. data/bin/lib/Image/ExifTool.pod +83 -69
  71. data/bin/perl-Image-ExifTool.spec +43 -43
  72. data/lib/exiftool_vendored/version.rb +1 -1
  73. metadata +9 -4
@@ -49,6 +49,7 @@
49
49
  # 36) Hayo Baann (forum10207)
50
50
  # 37) Tom Lachecki, private communication
51
51
  # 38) https://github.com/exiftool/exiftool/pull/40 (and forum10893)
52
+ # 39) Stefan Grube private communication (Z9)
52
53
  # IB) Iliah Borg private communication (LibRaw)
53
54
  # JD) Jens Duttke private communication
54
55
  # NJ) Niels Kristian Bech Jensen private communication
@@ -63,7 +64,7 @@ use Image::ExifTool::Exif;
63
64
  use Image::ExifTool::GPS;
64
65
  use Image::ExifTool::XMP;
65
66
 
66
- $VERSION = '4.06';
67
+ $VERSION = '4.13';
67
68
 
68
69
  sub LensIDConv($$$);
69
70
  sub ProcessNikonAVI($$$);
@@ -363,6 +364,7 @@ sub GetAFPointGrid($$;$);
363
364
  '26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
364
365
  'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
365
366
  '02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
367
+ '7E 54 37 37 0C 0C 4B 06' => 'Sigma 24mm F1.4 DG HSM | A', #30
366
368
  '26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
367
369
  '48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
368
370
  'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
@@ -606,6 +608,7 @@ sub GetAFPointGrid($$;$);
606
608
  'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
607
609
  'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
608
610
  'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
611
+ 'E3 40 76 A6 38 40 DF 0E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)', #forum3833
609
612
  '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
610
613
  '00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)',
611
614
  '00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)',
@@ -668,6 +671,7 @@ sub GetAFPointGrid($$;$);
668
671
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
669
672
  '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
670
673
  '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
674
+ 'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
671
675
  #
672
676
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
673
677
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -855,7 +859,7 @@ my %focusModeZ7 = (
855
859
 
856
860
  my %infoZSeries = (
857
861
  Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i',
858
- Notes => 'Z Series cameras thru Decemeber 2021',
862
+ Notes => 'Z Series cameras thru December 2021',
859
863
  );
860
864
  my %iSOAutoHiLimitZ7 = (
861
865
  0 => 'ISO 64',
@@ -1124,8 +1128,6 @@ my %afPoints153 = (
1124
1128
 
1125
1129
  # AF point indices for models with 81 focus points, eg. Z6/Z7/Z50 (ref 38)
1126
1130
  # - 9 rows (A-I) with 9 columns (1-9), center is E5
1127
- # NOTE: the AF points start 2 bytes into the data, so the map starts
1128
- # at 17 instead of 1
1129
1131
  #
1130
1132
  # 7 6 5 4 3 2 1 0
1131
1133
  # 00 : [H5][G5][F5][A5][B5][C5][D5][E5]
@@ -1140,23 +1142,23 @@ my %afPoints153 = (
1140
1142
  # 09 : [H1][G1][F1][A1][B1][C1][D1][E1]
1141
1143
  # 0a : [ ][ ][ ][ ][ ][ ][ ][I1]
1142
1144
  my %afPoints81 = (
1143
- 17 => 'E5', 34 => 'I6', 51 => 'H7', 68 => 'G8', 85 => 'F9',
1144
- 18 => 'D5', 35 => 'E4', 52 => 'I7', 69 => 'H8', 86 => 'G9',
1145
- 19 => 'C5', 36 => 'D4', 53 => 'E3', 70 => 'I8', 87 => 'H9',
1146
- 20 => 'B5', 37 => 'C4', 54 => 'D3', 71 => 'E2', 88 => 'I9',
1147
- 21 => 'A5', 38 => 'B4', 55 => 'C3', 72 => 'D2', 89 => 'E1',
1148
- 22 => 'F5', 39 => 'A4', 56 => 'B3', 73 => 'C2', 90 => 'D1',
1149
- 23 => 'G5', 40 => 'F4', 57 => 'A3', 74 => 'B2', 91 => 'C1',
1150
- 24 => 'H5', 41 => 'G4', 58 => 'F3', 75 => 'A2', 92 => 'B1',
1151
- 25 => 'I5', 42 => 'H4', 59 => 'G3', 76 => 'F2', 93 => 'A1',
1152
- 26 => 'E6', 43 => 'I4', 60 => 'H3', 77 => 'G2', 94 => 'F1',
1153
- 27 => 'D6', 44 => 'E7', 61 => 'I3', 78 => 'H2', 95 => 'G1',
1154
- 28 => 'C6', 45 => 'D7', 62 => 'E8', 79 => 'I2', 96 => 'H1',
1155
- 29 => 'B6', 46 => 'C7', 63 => 'D8', 80 => 'E9', 97 => 'I1',
1156
- 30 => 'A6', 47 => 'B7', 64 => 'C8', 81 => 'D9',
1157
- 31 => 'F6', 48 => 'A7', 65 => 'B8', 82 => 'C9',
1158
- 32 => 'G6', 49 => 'F7', 66 => 'A8', 83 => 'B9',
1159
- 33 => 'H6', 50 => 'G7', 67 => 'F8', 84 => 'A9',
1145
+ 1 => 'E5', 18 => 'I6', 35 => 'H7', 52 => 'G8', 69 => 'F9',
1146
+ 2 => 'D5', 19 => 'E4', 36 => 'I7', 53 => 'H8', 70 => 'G9',
1147
+ 3 => 'C5', 20 => 'D4', 37 => 'E3', 54 => 'I8', 71 => 'H9',
1148
+ 4 => 'B5', 21 => 'C4', 38 => 'D3', 55 => 'E2', 72 => 'I9',
1149
+ 5 => 'A5', 22 => 'B4', 39 => 'C3', 56 => 'D2', 73 => 'E1',
1150
+ 6 => 'F5', 23 => 'A4', 40 => 'B3', 57 => 'C2', 74 => 'D1',
1151
+ 7 => 'G5', 24 => 'F4', 41 => 'A3', 58 => 'B2', 75 => 'C1',
1152
+ 8 => 'H5', 25 => 'G4', 42 => 'F3', 59 => 'A2', 76 => 'B1',
1153
+ 9 => 'I5', 26 => 'H4', 43 => 'G3', 60 => 'F2', 77 => 'A1',
1154
+ 10 => 'E6', 27 => 'I4', 44 => 'H3', 61 => 'G2', 78 => 'F1',
1155
+ 11 => 'D6', 28 => 'E7', 45 => 'I3', 62 => 'H2', 79 => 'G1',
1156
+ 12 => 'C6', 29 => 'D7', 46 => 'E8', 63 => 'I2', 80 => 'H1',
1157
+ 13 => 'B6', 30 => 'C7', 47 => 'D8', 64 => 'E9', 81 => 'I1',
1158
+ 14 => 'A6', 31 => 'B7', 48 => 'C8', 65 => 'D9',
1159
+ 15 => 'F6', 32 => 'A7', 49 => 'B8', 66 => 'C9',
1160
+ 16 => 'G6', 33 => 'F7', 50 => 'A8', 67 => 'B9',
1161
+ 17 => 'H6', 34 => 'G7', 51 => 'F8', 68 => 'A9',
1160
1162
  );
1161
1163
 
1162
1164
  my %cropHiSpeed = ( #IB
@@ -1597,10 +1599,14 @@ my %base64coord = (
1597
1599
  81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II)
1598
1600
  },
1599
1601
  },
1600
- 0x0035 => { #32
1602
+ 0x0035 => [{ #32
1601
1603
  Name => 'HDRInfo',
1604
+ Condition => '$count != 6',
1602
1605
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo' },
1603
- },
1606
+ },{
1607
+ Name => 'HDRInfo2',
1608
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo2' },
1609
+ }],
1604
1610
  0x0037 => { #XavierJubier
1605
1611
  Name => 'MechanicalShutterCount',
1606
1612
  Writable => 'int32u',
@@ -1623,6 +1629,11 @@ my %base64coord = (
1623
1629
  3 => 'Small',
1624
1630
  },
1625
1631
  },
1632
+ 0x003f => { #https://github.com/darktable-org/darktable/issues/12282
1633
+ Name => 'WhiteBalanceFineTune',
1634
+ Writable => 'rational64s',
1635
+ Count => 2,
1636
+ },
1626
1637
  0x0045 => { #IB
1627
1638
  Name => 'CropArea',
1628
1639
  Notes => 'left, top, width, height',
@@ -2080,7 +2091,7 @@ my %base64coord = (
2080
2091
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
2081
2092
  DecryptStart => 4,
2082
2093
  # TODO: eventually set the length dynamically according to actual offsets!
2083
- DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
2094
+ DecryptLen => 0xec4b + 2105, # decoded thru end of Offset26
2084
2095
  ByteOrder => 'LittleEndian',
2085
2096
  },
2086
2097
  },
@@ -2481,6 +2492,12 @@ my %base64coord = (
2481
2492
  TagTable => 'Image::ExifTool::Nikon::MultiExposure',
2482
2493
  ByteOrder => 'LittleEndian',
2483
2494
  },
2495
+ },{
2496
+ Name => 'MultiExposure2',
2497
+ Condition => '$$valPt =~ /^010[23]/', # 0102 is NC (PH)
2498
+ SubDirectory => {
2499
+ TagTable => 'Image::ExifTool::Nikon::MultiExposure2',
2500
+ },
2484
2501
  }],
2485
2502
  0x00b1 => { #14/PH/JD (D80)
2486
2503
  Name => 'HighISONoiseReduction',
@@ -2797,10 +2814,10 @@ my %base64coord = (
2797
2814
  Name => 'VRMode',
2798
2815
  PrintConv => {
2799
2816
  0 => 'Off',
2800
- 1 => 'Sport',
2801
- 3 => 'Normal',
2817
+ 1 => 'Normal', #39 (was 'Sport')
2818
+ 3 => 'Sport', #39 (was 'Normal')
2802
2819
  },
2803
- %infoZSeries
2820
+ %infoZSeries,
2804
2821
  },{
2805
2822
  Name => 'VRMode',
2806
2823
  PrintConv => {
@@ -2811,6 +2828,13 @@ my %base64coord = (
2811
2828
  },
2812
2829
  }],
2813
2830
  # 7 - values: 0, 1
2831
+ 8 => { #39
2832
+ Name => 'VRType',
2833
+ PrintConv => {
2834
+ 2 => 'In-body', # (IBIS)
2835
+ 3 => 'In-body + Lens', # (IBIS + VR)
2836
+ },
2837
+ },
2814
2838
  );
2815
2839
 
2816
2840
  # Face detection information - PH (S8100)
@@ -3343,8 +3367,10 @@ my %base64coord = (
3343
3367
  sprintf("%s%.2d:%.2d", $sign, $h, abs($val)-60*$h);
3344
3368
  },
3345
3369
  PrintConvInv => q{
3346
- $val =~ /([-+]?)(\d+):(\d+)/ or return undef;
3347
- return $1 . ($2 * 60 + $3);
3370
+ $val =~ /Z$/ and return 0;
3371
+ $val =~ /([-+])(\d{1,2}):?(\d{2})$/ and return $1 . ($2 * 60 + $3);
3372
+ $val =~ /^(\d{2})(\d{2})$/ and return $1 * 60 + $2;
3373
+ return undef;
3348
3374
  },
3349
3375
  },
3350
3376
  2 => {
@@ -3561,7 +3587,6 @@ my %base64coord = (
3561
3587
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3562
3588
  DATAMEMBER => [ 0, 4, 6 ],
3563
3589
  NOTES => "These tags are written by Nikon DSLR's which have the live view feature.",
3564
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
3565
3590
  0 => {
3566
3591
  Name => 'AFInfo2Version',
3567
3592
  Format => 'undef[4]',
@@ -3672,7 +3697,7 @@ my %base64coord = (
3672
3697
  { #PH/JD
3673
3698
  Name => 'PrimaryAFPoint',
3674
3699
  # PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28)
3675
- Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3700
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3676
3701
  Notes => q{
3677
3702
  models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
3678
3703
  D4, D4S, D300, D300S, D700, D800, D800e and D810
@@ -3778,22 +3803,6 @@ my %base64coord = (
3778
3803
  1 => 'E9 (Center)',
3779
3804
  },
3780
3805
  },
3781
- { #PH (Z7) (NC)
3782
- Name => 'PrimaryAFPoint',
3783
- Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
3784
- Notes => q{
3785
- Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15
3786
- at the center
3787
- },
3788
- PrintConv => {
3789
- 0 => '(none)',
3790
- 246 => 'I15 (Center)',
3791
- OTHER => sub {
3792
- my ($val, $inv) = @_;
3793
- return GetAFPointGrid($val, 29, $inv);
3794
- },
3795
- },
3796
- },
3797
3806
  {
3798
3807
  Name => 'PrimaryAFPoint',
3799
3808
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -3807,7 +3816,7 @@ my %base64coord = (
3807
3816
  8 => [
3808
3817
  { #JD/PH
3809
3818
  Name => 'AFPointsUsed',
3810
- Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3819
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3811
3820
  Notes => q{
3812
3821
  models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
3813
3822
  point is C6
@@ -3911,33 +3920,78 @@ my %base64coord = (
3911
3920
  PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
3912
3921
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
3913
3922
  },
3914
- { #38 (Z6/Z7/Z50)
3915
- Name => 'AFPointsUsed',
3916
- Condition => '$$self{PhaseDetectAF} == 8 and $$self{Model} =~ /^NIKON Z/',
3917
- Notes => q{
3918
- models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for
3919
- phase detect AF points. Center point is E5
3920
- },
3921
- Format => 'undef[13]',
3922
- ValueConv => 'join(" ", unpack("H2"x13, $val))',
3923
- ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3924
- PrintConv => sub { PrintAFPoints(shift, \%afPoints81); },
3925
- PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints81); },
3926
- },
3927
3923
  { #PH
3928
3924
  Name => 'AFPointsUsed',
3929
3925
  # version 301 uses a separate field at offset 0x0a for this tag (ref 28)
3930
- Condition => '$$self{AFInfo2Version} ne "0301"',
3926
+ Condition => '$$self{AFInfo2Version} !~ /^03/',
3931
3927
  Format => 'undef[7]',
3932
3928
  ValueConv => 'join(" ", unpack("H2"x7, $val))',
3933
3929
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3934
3930
  PrintConv => '"Unknown ($val)"',
3935
3931
  PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
3936
3932
  },
3933
+ { #PH
3934
+ Name => 'PrimaryAFPoint',
3935
+ Condition => '$$self{PhaseDetectAF} == 1 and $$self{AFInfo2Version} =~ /^03/',
3936
+ Notes => 'newer models with 51-point AF',
3937
+ PrintConvColumns => 5,
3938
+ PrintConv => {
3939
+ 0 => '(none)',
3940
+ %afPoints51,
3941
+ 1 => 'C6 (Center)', # (add " (Center)" to central point)
3942
+ },
3943
+ },
3944
+ { #PH (Z7)
3945
+ Name => 'PrimaryAFPoint',
3946
+ Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
3947
+ PrintConv => {
3948
+ 0 => '(none)',
3949
+ %afPoints81,
3950
+ 1 => 'E5 (Center)', # (add " (Center)" to central point)
3951
+ },
3952
+ },
3953
+ # this was wrong, but keep the code as a comment in case it may be useful later
3954
+ #{ #PH (Z7) (NC)
3955
+ # Name => 'PrimaryAFPoint',
3956
+ # Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
3957
+ # Notes => q{
3958
+ # Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15
3959
+ # at the center
3960
+ # },
3961
+ # PrintConv => {
3962
+ # 0 => '(none)',
3963
+ # 246 => 'I15 (Center)',
3964
+ # OTHER => sub {
3965
+ # my ($val, $inv) = @_;
3966
+ # return GetAFPointGrid($val, 29, $inv);
3967
+ # },
3968
+ # },
3969
+ #},
3937
3970
  ],
3938
- 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
3939
- Name => 'AFPointsUsed',
3940
- Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
3971
+ 0x0a => [{ #PH (D780)
3972
+ Name => 'AFPointsUsed',
3973
+ Condition => '$$self{PhaseDetectAF} == 1 and $$self{AFInfo2Version} =~ /^03/',
3974
+ Notes => 'newer models with 51-point AF',
3975
+ Format => 'undef[7]',
3976
+ ValueConv => 'join(" ", unpack("H2"x7, $val))',
3977
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3978
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints51); },
3979
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints51); },
3980
+ },{ #38 (Z6/Z7/Z50)
3981
+ Name => 'AFPointsUsed',
3982
+ Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
3983
+ Notes => q{
3984
+ models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for
3985
+ phase detect AF points. Center point is E5
3986
+ },
3987
+ Format => 'undef[11]',
3988
+ ValueConv => 'join(" ", unpack("H2"x11, $val))',
3989
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3990
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints81); },
3991
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints81); },
3992
+ },{ #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
3993
+ Name => 'AFPointsUsed',
3994
+ Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/',
3941
3995
  Notes => q{
3942
3996
  models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
3943
3997
  point is D8
@@ -3947,7 +4001,7 @@ my %base64coord = (
3947
4001
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3948
4002
  PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
3949
4003
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
3950
- },
4004
+ }],
3951
4005
  0x10 => { #PH (D90 and D5000)
3952
4006
  Name => 'AFImageWidth',
3953
4007
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -4026,7 +4080,7 @@ my %base64coord = (
4026
4080
  },
4027
4081
  Format => 'int16u',
4028
4082
  },
4029
- 0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4083
+ 0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4030
4084
  Name => 'AFFocusPointXPosition',
4031
4085
  Condition => q{
4032
4086
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
@@ -4174,7 +4228,7 @@ my %base64coord = (
4174
4228
  },
4175
4229
  );
4176
4230
 
4177
- %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4231
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' (Z9)
4178
4232
  %binaryDataAttrs,
4179
4233
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4180
4234
  DATAMEMBER => [ 0 ],
@@ -4194,11 +4248,19 @@ my %base64coord = (
4194
4248
  },
4195
4249
  0x43 => {
4196
4250
  Name => 'FocusPositionHorizontal',
4197
- PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4251
+ Notes => q{
4252
+ the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1
4253
+ to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U
4254
+ (4) and 2D (12) are not used for some reason
4255
+ },
4256
+ # 493 focus points for Z9 fall in a 30x19 grid
4257
+ # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
4258
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
4198
4259
  },
4199
4260
  0x45 => {
4200
4261
  Name => 'FocusPositionVertical',
4201
- PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4262
+ # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
4263
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17); },
4202
4264
  },
4203
4265
  0x46 => {
4204
4266
  Name => 'AFAreaWidth',
@@ -4210,9 +4272,13 @@ my %base64coord = (
4210
4272
  Name => 'AFAreaHeight',
4211
4273
  Format => 'int16u',
4212
4274
  RawConv => '$val ? $val : undef',
4213
- }
4214
- # AFFocusResult is the result of the last AF operation and not necessarily an indication of the state of the of the capture (e.g., the subject may have moved or the image re-framed)
4215
- #0x4a => { Name => 'AFFocusResult',PrintConv => {0=> "No Focus", 1=>"Focus"} }, #new tag created because Z9 uses a hybrid contrast/phase AF (closest former tag was ContrastDetectAFInFocus).
4275
+ },
4276
+ 0x4a => {
4277
+ Name => 'FocusResult',
4278
+ # in Manual Foucs mode, reflects the state of viewfinder focus indicator.
4279
+ # In AF-C or AF-S, reflects the result of the last AF operation.
4280
+ PrintConv => { 0=> "Out of Focus", 1=>"Focus"},
4281
+ },
4216
4282
  );
4217
4283
 
4218
4284
  # Nikon AF fine-tune information (ref 28)
@@ -4858,7 +4924,7 @@ my %nikonFocalConversions = (
4858
4924
  %binaryDataAttrs,
4859
4925
  NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
4860
4926
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4861
- DATAMEMBER => [ 0x03, 0x2f ],
4927
+ DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
4862
4928
  0x00 => {
4863
4929
  Name => 'LensDataVersion',
4864
4930
  Format => 'string[4]',
@@ -4884,12 +4950,12 @@ my %nikonFocalConversions = (
4884
4950
  %nikonApertureConversions,
4885
4951
  },
4886
4952
  # --> another extra byte at position 0x08 in this version of LensData (PH)
4887
- 0x09 => {
4888
- Name => 'FocusPosition',
4889
- Condition => '$$self{OldLensData}',
4890
- PrintConv => 'sprintf("0x%02x", $val)',
4891
- PrintConvInv => '$val',
4892
- },
4953
+ #0x09 => {
4954
+ # Name => 'FocusPosition', #28 - this appears to be copied from an older version of LensData and is no longer valid. Text with Z9 and Z7_2 with a variety of lenses
4955
+ # Condition => '$$self{OldLensData}',
4956
+ # PrintConv => 'sprintf("0x%02x", $val)',
4957
+ # PrintConvInv => '$val',
4958
+ #},
4893
4959
  0x0b => {
4894
4960
  Notes => 'this focus distance is approximate, and not very accurate for some lenses',
4895
4961
  Name => 'FocusDistance',
@@ -4948,7 +5014,8 @@ my %nikonFocalConversions = (
4948
5014
  %nikonApertureConversions,
4949
5015
  },
4950
5016
  #
4951
- # ---- new LensData tags used by Nikkor Z lenses ---- (ref PH)
5017
+ # ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ----
5018
+ # (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28)
4952
5019
  #
4953
5020
  0x2f => { # look forward to see if new lens data exists...
4954
5021
  Name => 'NewLensData',
@@ -4956,7 +5023,7 @@ my %nikonFocalConversions = (
4956
5023
  RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
4957
5024
  Hidden => 1,
4958
5025
  },
4959
- 0x30 => {
5026
+ 0x30 => { #PH
4960
5027
  Name => 'LensID',
4961
5028
  Condition => '$$self{NewLensData}',
4962
5029
  Notes => 'tags from here onward used for Nikkor Z lenses only',
@@ -4982,9 +5049,23 @@ my %nikonFocalConversions = (
4982
5049
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4983
5050
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4984
5051
  29 => 'Nikkor Z 28mm f/2.8', #IB
5052
+ 30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
5053
+ 31 => 'Nikkor Z 24-120 f/4', #28
5054
+ 32 => 'Nikkor Z 800mm f/6.3 VR S', #28
5055
+ 36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
4985
5056
  },
4986
5057
  },
4987
- 0x36 => {
5058
+ 0x35 => { #28
5059
+ Name => 'LensMountType',
5060
+ RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
5061
+ Format => 'int8u',
5062
+ Unknown => 1,
5063
+ PrintConv => {
5064
+ 0 => 'F-mount Lens',
5065
+ 1 => 'Z-mount Lens',
5066
+ },
5067
+ },
5068
+ 0x36 => { #PH
4988
5069
  Name => 'MaxAperture',
4989
5070
  Condition => '$$self{NewLensData}',
4990
5071
  Format => 'int16u',
@@ -4994,7 +5075,7 @@ my %nikonFocalConversions = (
4994
5075
  PrintConv => 'sprintf("%.1f",$val)',
4995
5076
  PrintConvInv => '$val',
4996
5077
  },
4997
- 0x38 => {
5078
+ 0x38 => { #PH
4998
5079
  Name => 'FNumber',
4999
5080
  Condition => '$$self{NewLensData}',
5000
5081
  Format => 'int16u',
@@ -5004,7 +5085,7 @@ my %nikonFocalConversions = (
5004
5085
  PrintConv => 'sprintf("%.1f",$val)',
5005
5086
  PrintConvInv => '$val',
5006
5087
  },
5007
- 0x3c => {
5088
+ 0x3c => { #PH
5008
5089
  Name => 'FocalLength',
5009
5090
  Condition => '$$self{NewLensData}',
5010
5091
  Format => 'int16u',
@@ -5012,14 +5093,36 @@ my %nikonFocalConversions = (
5012
5093
  PrintConv => '"$val mm"',
5013
5094
  PrintConvInv => '$val=~s/\s*mm$//;$val',
5014
5095
  },
5015
- 0x4f => {
5096
+ 0x4c => { #28
5097
+ Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity.
5098
+ Format => 'int8u',
5099
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5100
+ RawConv => '$$self{FocusDistanceRangeWidth} = $val',
5101
+ Unknown => 1,
5102
+ },
5103
+ 0x4e => { #28
5016
5104
  Name => 'FocusDistance',
5017
- Condition => '$$self{NewLensData}',
5018
- # (perhaps int16u Format? -- although upper byte would always be zero)
5105
+ Format => 'int16u',
5106
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5107
+ RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter
5019
5108
  ValueConv => '0.01 * 10**($val/40)', # in m
5020
5109
  ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
5021
- PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"',
5022
- PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val',
5110
+ PrintConv => q{
5111
+ (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
5112
+ },
5113
+ },
5114
+ 0x56 => { #28
5115
+ Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
5116
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5117
+ Format => 'int8u',
5118
+ RawConv => 'unless (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
5119
+ Unknown => 1,
5120
+ },
5121
+ 0x5a => { #28
5122
+ Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
5123
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5124
+ Format => 'int32s',
5125
+ Unknown => 1,
5023
5126
  },
5024
5127
  );
5025
5128
 
@@ -5422,14 +5525,14 @@ my %nikonFocalConversions = (
5422
5525
  },
5423
5526
  0x27d => {
5424
5527
  Name => 'ShutterCount',
5425
- Condition => '$$self{FirmwareVersion} =~ /^1.01/',
5528
+ Condition => '$$self{FirmwareVersion} =~ /^1\.01/',
5426
5529
  Notes => 'firmware 1.10',
5427
5530
  Format => 'int32u',
5428
5531
  Priority => 0,
5429
5532
  },
5430
5533
  0x27f => {
5431
5534
  Name => 'ShutterCount',
5432
- Condition => '$$self{FirmwareVersion} =~ /^2.0/',
5535
+ Condition => '$$self{FirmwareVersion} =~ /^2\.0/',
5433
5536
  Notes => 'firmware 2.00, 2.01 and 2.02',
5434
5537
  Format => 'int32u',
5435
5538
  Priority => 0,
@@ -7323,7 +7426,7 @@ my %nikonFocalConversions = (
7323
7426
  # (moves around too much and doesn't fit cleanly in the offset table)
7324
7427
  #0x38be => {
7325
7428
  # Name => 'Rotation',
7326
- # Condition => '$$self{FirmwareVersion} =~ /^1.0/',
7429
+ # Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
7327
7430
  # Mask => 0x30,
7328
7431
  # PrintConv => {
7329
7432
  # 0 => 'Horizontal',
@@ -7629,7 +7732,7 @@ my %nikonFocalConversions = (
7629
7732
  },
7630
7733
  0x189d => { #PH (NC)
7631
7734
  Name => 'CustomSettingsD4S',
7632
- Condition => '$$self{FirmwareVersion} =~ /^1.00/',
7735
+ Condition => '$$self{FirmwareVersion} =~ /^1\.00/',
7633
7736
  Notes => 'firmware version 1.00',
7634
7737
  Format => 'undef[56]',
7635
7738
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7637,7 +7740,7 @@ my %nikonFocalConversions = (
7637
7740
  0x18c2 => { # CSf1-c (no idea why it is so far away from the rest of the settings)
7638
7741
  Name => 'MultiSelectorLiveViewMode',
7639
7742
  Groups => { 1 => 'NikonCustom' },
7640
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
7743
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7641
7744
  Mask => 0xc0,
7642
7745
  PrintConv => {
7643
7746
  0 => 'Reset',
@@ -7738,7 +7841,7 @@ my %nikonFocalConversions = (
7738
7841
  },
7739
7842
  0x193d => {
7740
7843
  Name => 'CustomSettingsD4S',
7741
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
7844
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7742
7845
  Notes => 'firmware version 1.01',
7743
7846
  Format => 'undef[56]',
7744
7847
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7991,8 +8094,8 @@ my %nikonFocalConversions = (
7991
8094
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7992
8095
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7993
8096
  VARS => { ID_LABEL => 'Index' },
7994
- DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7995
- 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
8097
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
8098
+ 0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
7996
8099
  IS_SUBDIR => [ 0xec4b ],
7997
8100
  WRITABLE => 1,
7998
8101
  FIRST_ENTRY => 0,
@@ -8069,6 +8172,15 @@ my %nikonFocalConversions = (
8069
8172
  # account for variable location of Offset3 data
8070
8173
  Hook => '$varSize = $$self{Offset3} - 0x6c70',
8071
8174
  },
8175
+ 0x6c90 => {
8176
+ Name => 'FocusShiftShooting',
8177
+ RawConv => '$$self{FocusShiftShooting} = $val',
8178
+ PrintConv => q{
8179
+ return 'Off' if $val == 0 ;
8180
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8181
+ return "On: $i"
8182
+ },
8183
+ },
8072
8184
  0x6c98 => {
8073
8185
  Name => 'IntervalShooting',
8074
8186
  RawConv => '$$self{IntervalShooting} = $val',
@@ -8088,23 +8200,6 @@ my %nikonFocalConversions = (
8088
8200
  Format => 'int16u',
8089
8201
  Hidden => 1,
8090
8202
  },
8091
- ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8092
- 0x7717 => {
8093
- Name => 'Offsset5Hook',
8094
- Hidden => 1,
8095
- RawConv => 'undef',
8096
- # account for variable location of Offset5 data
8097
- Hook => '$varSize = $$self{Offset5} - 0x7718',
8098
- },
8099
- 0x7844 => {
8100
- Name => 'FocusShiftShooting',
8101
- RawConv => '$$self{FocusShiftShooting} = $val',
8102
- PrintConv => q{
8103
- return 'Off' if $val == 0 ;
8104
- my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8105
- return "On: $i"
8106
- },
8107
- },
8108
8203
  ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8109
8204
  0xeaea => {
8110
8205
  Name => 'OrientationHook',
@@ -8158,6 +8253,7 @@ my %nikonFocalConversions = (
8158
8253
  0xec4b => {
8159
8254
  Name => 'MenuSettingsZ9',
8160
8255
  Format => 'undef[1646]',
8256
+ Condition => '$$self{FirmwareVersion} lt "03.00"',
8161
8257
  SubDirectory => {
8162
8258
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8163
8259
  },
@@ -8744,13 +8840,18 @@ my %nikonFocalConversions = (
8744
8840
  6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8745
8841
  10 => '+05:45 (Kathmandu)',
8746
8842
  11 => '+05:30 (New Dehli)',
8843
+ 12 => '+05:00 (Islamabad)',
8844
+ 13 => '+04:30 (Kabul)',
8845
+ 14 => '+04:00 (Abu Dhabi)',
8846
+ 15 => '+03:30 (Tehran)',
8747
8847
  16 => '+03:00 (Moscow, Nairobi)',
8748
- 15 => '+02:00 (Athens)',
8749
- 16 => '+01:00 (Madrid, Paris, Berlin)',
8750
8848
  17 => '+02:00 (Athens, Helsinki)',
8751
- 18 => '+00:00 (London)',
8752
- 19 => '+00:00', #PH (unknown city)
8849
+ 18 => '+01:00 (Madrid, Paris, Berlin)',
8850
+ 19 => '+00:00 (London)',
8851
+ 20 => '-01:00 (Azores)',
8852
+ 21 => '-02:00 (Fernando de Noronha)',
8753
8853
  22 => '-03:00 (Buenos Aires, Sao Paulo)',
8854
+ 23 => '-03:30 (Newfoundland)',
8754
8855
  24 => '-04:00 (Manaus, Caracas)',
8755
8856
  25 => '-05:00 (New York, Toronto, Lima)',
8756
8857
  26 => '-06:00 (Chicago, Mexico City)',
@@ -10076,6 +10177,36 @@ my %nikonFocalConversions = (
10076
10177
  },
10077
10178
  );
10078
10179
 
10180
+ # Multi exposure2 / image overlay information (ref 39)
10181
+ %Image::ExifTool::Nikon::MultiExposure2 = (
10182
+ %binaryDataAttrs,
10183
+ FORMAT => 'int32u',
10184
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
10185
+ 0 => {
10186
+ Name => 'MultiExposureVersion',
10187
+ Format => 'string[4]',
10188
+ Writable => 0,
10189
+ },
10190
+ 1 => {
10191
+ Name => 'MultiExposureMode',
10192
+ PrintConv => {
10193
+ 0 => 'Off',
10194
+ 1 => 'Multiple Exposure',
10195
+ 3 => 'HDR',
10196
+ },
10197
+ },
10198
+ 2 => 'MultiExposureShots',
10199
+ 3 => {
10200
+ Name => 'MultiExposureOverlayMode',
10201
+ PrintConv => {
10202
+ 0 => 'Add',
10203
+ 1 => 'Average',
10204
+ 2 => 'Light',
10205
+ 3 => 'Dark',
10206
+ },
10207
+ },
10208
+ );
10209
+
10079
10210
  # HDR information (ref 32)
10080
10211
  %Image::ExifTool::Nikon::HDRInfo = (
10081
10212
  %binaryDataAttrs,
@@ -10084,12 +10215,13 @@ my %nikonFocalConversions = (
10084
10215
  0 => {
10085
10216
  Name => 'HDRInfoVersion',
10086
10217
  Format => 'string[4]',
10218
+ Writable => 0,
10087
10219
  },
10088
10220
  4 => {
10089
10221
  Name => 'HDR',
10090
10222
  PrintConv => {
10091
10223
  0 => 'Off',
10092
- 1 => 'On',
10224
+ 1 => 'On (normal)',
10093
10225
  48 => 'Auto', #PH (NC)
10094
10226
  },
10095
10227
  },
@@ -10127,6 +10259,35 @@ my %nikonFocalConversions = (
10127
10259
  },
10128
10260
  );
10129
10261
 
10262
+ # ref 39 (Z9)
10263
+ %Image::ExifTool::Nikon::HDRInfo2 = (
10264
+ %binaryDataAttrs,
10265
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
10266
+ 0 => {
10267
+ Name => 'HDRInfoVersion', # 0200
10268
+ Format => 'string[4]',
10269
+ Writable => 0,
10270
+ },
10271
+ 4 => {
10272
+ Name => 'HDR',
10273
+ PrintConv => {
10274
+ 0 => 'Off',
10275
+ 1 => 'On (normal)',
10276
+ },
10277
+ },
10278
+ 5 => {
10279
+ Name => 'HDRLevel',
10280
+ PrintConv => {
10281
+ 0 => 'n/a',
10282
+ 1 => 'Normal',
10283
+ 2 => 'Low',
10284
+ 3 => 'High',
10285
+ 4 => 'High+',
10286
+ 5 => 'Auto',
10287
+ },
10288
+ },
10289
+ );
10290
+
10130
10291
  # location information (ref PH)
10131
10292
  %Image::ExifTool::Nikon::LocationInfo = (
10132
10293
  %binaryDataAttrs,
@@ -10847,9 +11008,14 @@ my %nikonFocalConversions = (
10847
11008
  Name => 'LocationInfo',
10848
11009
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
10849
11010
  },
11011
+ 0x200003f => 'WhiteBalanceFineTune',
10850
11012
  # 0x200003f - rational64s[2]: "0 0"
10851
11013
  # 0x2000042 - undef[6]: "0100\x03\0"
10852
11014
  # 0x2000043 - undef[12]: all zeros
11015
+ 0x200004e => {
11016
+ Name => 'NikonSettings',
11017
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
11018
+ },
10853
11019
  0x2000083 => {
10854
11020
  Name => 'LensType',
10855
11021
  # credit to Tom Christiansen (ref 7) for figuring this out...
@@ -11316,7 +11482,7 @@ sub PrintAFPointsGridInv($$$)
11316
11482
  #------------------------------------------------------------------------------
11317
11483
  # Print conversion for relative Left/Right AF points (ref 28)
11318
11484
  # Inputs: 0) column, 1) number of columns
11319
- # Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
11485
+ # Returns: AF point data as a string (e.g. '2L of Center' or 'C' or '3R of Center')
11320
11486
  sub PrintAFPointsLeftRight($$)
11321
11487
  {
11322
11488
  my ($col, $ncol) = @_;
@@ -11329,7 +11495,7 @@ sub PrintAFPointsLeftRight($$)
11329
11495
  #------------------------------------------------------------------------------
11330
11496
  # Print conversion for relative Up/Down AF points (ref 28)
11331
11497
  # Inputs: 0) row, 1) number of rows
11332
- # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
11498
+ # Returns: AF point data as a string (e.g. '2U from Center' or 'C' or '3D from Center')
11333
11499
  sub PrintAFPointsUpDown($$)
11334
11500
  {
11335
11501
  my ($row, $nrow) = @_;