exiftool_vendored 12.41.0 → 12.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +209 -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 +115 -96
  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 +71 -33
  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 +60 -1
  19. data/bin/lib/Image/ExifTool/DNG.pm +8 -2
  20. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  21. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  22. data/bin/lib/Image/ExifTool/Exif.pm +26 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  25. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  26. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  27. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  28. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +11 -11
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  34. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  35. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  36. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  37. data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
  38. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  39. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  40. data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
  41. data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  42. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  43. data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
  44. data/bin/lib/Image/ExifTool/PDF.pm +2 -1
  45. data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
  46. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  47. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  48. data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
  49. data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
  50. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  51. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  52. data/bin/lib/Image/ExifTool/README +13 -3
  53. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  54. data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
  55. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  56. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  57. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  58. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  59. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  60. data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
  61. data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
  62. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  63. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  64. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  65. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  68. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  69. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  70. data/bin/lib/Image/ExifTool/Writer.pl +14 -6
  71. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  72. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  73. data/bin/lib/Image/ExifTool.pm +120 -33
  74. data/bin/lib/Image/ExifTool.pod +83 -69
  75. data/bin/perl-Image-ExifTool.spec +43 -43
  76. data/lib/exiftool_vendored/version.rb +1 -1
  77. 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.05';
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)',
@@ -667,6 +670,8 @@ sub GetAFPointGrid($$;$);
667
670
  '00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
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
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
670
675
  #
671
676
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
672
677
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -854,7 +859,7 @@ my %focusModeZ7 = (
854
859
 
855
860
  my %infoZSeries = (
856
861
  Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i',
857
- Notes => 'Z Series cameras thru Decemeber 2021',
862
+ Notes => 'Z Series cameras thru December 2021',
858
863
  );
859
864
  my %iSOAutoHiLimitZ7 = (
860
865
  0 => 'ISO 64',
@@ -1123,8 +1128,6 @@ my %afPoints153 = (
1123
1128
 
1124
1129
  # AF point indices for models with 81 focus points, eg. Z6/Z7/Z50 (ref 38)
1125
1130
  # - 9 rows (A-I) with 9 columns (1-9), center is E5
1126
- # NOTE: the AF points start 2 bytes into the data, so the map starts
1127
- # at 17 instead of 1
1128
1131
  #
1129
1132
  # 7 6 5 4 3 2 1 0
1130
1133
  # 00 : [H5][G5][F5][A5][B5][C5][D5][E5]
@@ -1139,23 +1142,23 @@ my %afPoints153 = (
1139
1142
  # 09 : [H1][G1][F1][A1][B1][C1][D1][E1]
1140
1143
  # 0a : [ ][ ][ ][ ][ ][ ][ ][I1]
1141
1144
  my %afPoints81 = (
1142
- 17 => 'E5', 34 => 'I6', 51 => 'H7', 68 => 'G8', 85 => 'F9',
1143
- 18 => 'D5', 35 => 'E4', 52 => 'I7', 69 => 'H8', 86 => 'G9',
1144
- 19 => 'C5', 36 => 'D4', 53 => 'E3', 70 => 'I8', 87 => 'H9',
1145
- 20 => 'B5', 37 => 'C4', 54 => 'D3', 71 => 'E2', 88 => 'I9',
1146
- 21 => 'A5', 38 => 'B4', 55 => 'C3', 72 => 'D2', 89 => 'E1',
1147
- 22 => 'F5', 39 => 'A4', 56 => 'B3', 73 => 'C2', 90 => 'D1',
1148
- 23 => 'G5', 40 => 'F4', 57 => 'A3', 74 => 'B2', 91 => 'C1',
1149
- 24 => 'H5', 41 => 'G4', 58 => 'F3', 75 => 'A2', 92 => 'B1',
1150
- 25 => 'I5', 42 => 'H4', 59 => 'G3', 76 => 'F2', 93 => 'A1',
1151
- 26 => 'E6', 43 => 'I4', 60 => 'H3', 77 => 'G2', 94 => 'F1',
1152
- 27 => 'D6', 44 => 'E7', 61 => 'I3', 78 => 'H2', 95 => 'G1',
1153
- 28 => 'C6', 45 => 'D7', 62 => 'E8', 79 => 'I2', 96 => 'H1',
1154
- 29 => 'B6', 46 => 'C7', 63 => 'D8', 80 => 'E9', 97 => 'I1',
1155
- 30 => 'A6', 47 => 'B7', 64 => 'C8', 81 => 'D9',
1156
- 31 => 'F6', 48 => 'A7', 65 => 'B8', 82 => 'C9',
1157
- 32 => 'G6', 49 => 'F7', 66 => 'A8', 83 => 'B9',
1158
- 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',
1159
1162
  );
1160
1163
 
1161
1164
  my %cropHiSpeed = ( #IB
@@ -1596,10 +1599,14 @@ my %base64coord = (
1596
1599
  81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II)
1597
1600
  },
1598
1601
  },
1599
- 0x0035 => { #32
1602
+ 0x0035 => [{ #32
1600
1603
  Name => 'HDRInfo',
1604
+ Condition => '$count != 6',
1601
1605
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo' },
1602
- },
1606
+ },{
1607
+ Name => 'HDRInfo2',
1608
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo2' },
1609
+ }],
1603
1610
  0x0037 => { #XavierJubier
1604
1611
  Name => 'MechanicalShutterCount',
1605
1612
  Writable => 'int32u',
@@ -1622,6 +1629,11 @@ my %base64coord = (
1622
1629
  3 => 'Small',
1623
1630
  },
1624
1631
  },
1632
+ 0x003f => { #https://github.com/darktable-org/darktable/issues/12282
1633
+ Name => 'WhiteBalanceFineTune',
1634
+ Writable => 'rational64s',
1635
+ Count => 2,
1636
+ },
1625
1637
  0x0045 => { #IB
1626
1638
  Name => 'CropArea',
1627
1639
  Notes => 'left, top, width, height',
@@ -2079,7 +2091,7 @@ my %base64coord = (
2079
2091
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
2080
2092
  DecryptStart => 4,
2081
2093
  # TODO: eventually set the length dynamically according to actual offsets!
2082
- DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
2094
+ DecryptLen => 0xec4b + 2105, # decoded thru end of Offset26
2083
2095
  ByteOrder => 'LittleEndian',
2084
2096
  },
2085
2097
  },
@@ -2480,6 +2492,12 @@ my %base64coord = (
2480
2492
  TagTable => 'Image::ExifTool::Nikon::MultiExposure',
2481
2493
  ByteOrder => 'LittleEndian',
2482
2494
  },
2495
+ },{
2496
+ Name => 'MultiExposure2',
2497
+ Condition => '$$valPt =~ /^010[23]/', # 0102 is NC (PH)
2498
+ SubDirectory => {
2499
+ TagTable => 'Image::ExifTool::Nikon::MultiExposure2',
2500
+ },
2483
2501
  }],
2484
2502
  0x00b1 => { #14/PH/JD (D80)
2485
2503
  Name => 'HighISONoiseReduction',
@@ -2796,10 +2814,10 @@ my %base64coord = (
2796
2814
  Name => 'VRMode',
2797
2815
  PrintConv => {
2798
2816
  0 => 'Off',
2799
- 1 => 'Sport',
2800
- 3 => 'Normal',
2817
+ 1 => 'Normal', #39 (was 'Sport')
2818
+ 3 => 'Sport', #39 (was 'Normal')
2801
2819
  },
2802
- %infoZSeries
2820
+ %infoZSeries,
2803
2821
  },{
2804
2822
  Name => 'VRMode',
2805
2823
  PrintConv => {
@@ -2810,6 +2828,13 @@ my %base64coord = (
2810
2828
  },
2811
2829
  }],
2812
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
+ },
2813
2838
  );
2814
2839
 
2815
2840
  # Face detection information - PH (S8100)
@@ -3342,8 +3367,10 @@ my %base64coord = (
3342
3367
  sprintf("%s%.2d:%.2d", $sign, $h, abs($val)-60*$h);
3343
3368
  },
3344
3369
  PrintConvInv => q{
3345
- $val =~ /([-+]?)(\d+):(\d+)/ or return undef;
3346
- 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;
3347
3374
  },
3348
3375
  },
3349
3376
  2 => {
@@ -3560,7 +3587,6 @@ my %base64coord = (
3560
3587
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3561
3588
  DATAMEMBER => [ 0, 4, 6 ],
3562
3589
  NOTES => "These tags are written by Nikon DSLR's which have the live view feature.",
3563
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
3564
3590
  0 => {
3565
3591
  Name => 'AFInfo2Version',
3566
3592
  Format => 'undef[4]',
@@ -3671,7 +3697,7 @@ my %base64coord = (
3671
3697
  { #PH/JD
3672
3698
  Name => 'PrimaryAFPoint',
3673
3699
  # PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28)
3674
- Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3700
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3675
3701
  Notes => q{
3676
3702
  models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
3677
3703
  D4, D4S, D300, D300S, D700, D800, D800e and D810
@@ -3777,22 +3803,6 @@ my %base64coord = (
3777
3803
  1 => 'E9 (Center)',
3778
3804
  },
3779
3805
  },
3780
- { #PH (Z7) (NC)
3781
- Name => 'PrimaryAFPoint',
3782
- Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
3783
- Notes => q{
3784
- Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15
3785
- at the center
3786
- },
3787
- PrintConv => {
3788
- 0 => '(none)',
3789
- 246 => 'I15 (Center)',
3790
- OTHER => sub {
3791
- my ($val, $inv) = @_;
3792
- return GetAFPointGrid($val, 29, $inv);
3793
- },
3794
- },
3795
- },
3796
3806
  {
3797
3807
  Name => 'PrimaryAFPoint',
3798
3808
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -3806,7 +3816,7 @@ my %base64coord = (
3806
3816
  8 => [
3807
3817
  { #JD/PH
3808
3818
  Name => 'AFPointsUsed',
3809
- Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3819
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3810
3820
  Notes => q{
3811
3821
  models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
3812
3822
  point is C6
@@ -3910,33 +3920,78 @@ my %base64coord = (
3910
3920
  PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
3911
3921
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
3912
3922
  },
3913
- { #38 (Z6/Z7/Z50)
3914
- Name => 'AFPointsUsed',
3915
- Condition => '$$self{PhaseDetectAF} == 8 and $$self{Model} =~ /^NIKON Z/',
3916
- Notes => q{
3917
- models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for
3918
- phase detect AF points. Center point is E5
3919
- },
3920
- Format => 'undef[13]',
3921
- ValueConv => 'join(" ", unpack("H2"x13, $val))',
3922
- ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3923
- PrintConv => sub { PrintAFPoints(shift, \%afPoints81); },
3924
- PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints81); },
3925
- },
3926
3923
  { #PH
3927
3924
  Name => 'AFPointsUsed',
3928
3925
  # version 301 uses a separate field at offset 0x0a for this tag (ref 28)
3929
- Condition => '$$self{AFInfo2Version} ne "0301"',
3926
+ Condition => '$$self{AFInfo2Version} !~ /^03/',
3930
3927
  Format => 'undef[7]',
3931
3928
  ValueConv => 'join(" ", unpack("H2"x7, $val))',
3932
3929
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3933
3930
  PrintConv => '"Unknown ($val)"',
3934
3931
  PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
3935
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
+ #},
3936
3970
  ],
3937
- 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
3938
- Name => 'AFPointsUsed',
3939
- 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/',
3940
3995
  Notes => q{
3941
3996
  models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
3942
3997
  point is D8
@@ -3946,7 +4001,7 @@ my %base64coord = (
3946
4001
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3947
4002
  PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
3948
4003
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
3949
- },
4004
+ }],
3950
4005
  0x10 => { #PH (D90 and D5000)
3951
4006
  Name => 'AFImageWidth',
3952
4007
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -4025,7 +4080,7 @@ my %base64coord = (
4025
4080
  },
4026
4081
  Format => 'int16u',
4027
4082
  },
4028
- 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).
4029
4084
  Name => 'AFFocusPointXPosition',
4030
4085
  Condition => q{
4031
4086
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
@@ -4173,7 +4228,7 @@ my %base64coord = (
4173
4228
  },
4174
4229
  );
4175
4230
 
4176
- %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)
4177
4232
  %binaryDataAttrs,
4178
4233
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4179
4234
  DATAMEMBER => [ 0 ],
@@ -4193,11 +4248,19 @@ my %base64coord = (
4193
4248
  },
4194
4249
  0x43 => {
4195
4250
  Name => 'FocusPositionHorizontal',
4196
- 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); },
4197
4259
  },
4198
4260
  0x45 => {
4199
4261
  Name => 'FocusPositionVertical',
4200
- 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); },
4201
4264
  },
4202
4265
  0x46 => {
4203
4266
  Name => 'AFAreaWidth',
@@ -4209,9 +4272,13 @@ my %base64coord = (
4209
4272
  Name => 'AFAreaHeight',
4210
4273
  Format => 'int16u',
4211
4274
  RawConv => '$val ? $val : undef',
4212
- }
4213
- # 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)
4214
- #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
+ },
4215
4282
  );
4216
4283
 
4217
4284
  # Nikon AF fine-tune information (ref 28)
@@ -4857,7 +4924,7 @@ my %nikonFocalConversions = (
4857
4924
  %binaryDataAttrs,
4858
4925
  NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
4859
4926
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4860
- DATAMEMBER => [ 0x03, 0x2f ],
4927
+ DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
4861
4928
  0x00 => {
4862
4929
  Name => 'LensDataVersion',
4863
4930
  Format => 'string[4]',
@@ -4883,12 +4950,12 @@ my %nikonFocalConversions = (
4883
4950
  %nikonApertureConversions,
4884
4951
  },
4885
4952
  # --> another extra byte at position 0x08 in this version of LensData (PH)
4886
- 0x09 => {
4887
- Name => 'FocusPosition',
4888
- Condition => '$$self{OldLensData}',
4889
- PrintConv => 'sprintf("0x%02x", $val)',
4890
- PrintConvInv => '$val',
4891
- },
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
+ #},
4892
4959
  0x0b => {
4893
4960
  Notes => 'this focus distance is approximate, and not very accurate for some lenses',
4894
4961
  Name => 'FocusDistance',
@@ -4947,7 +5014,8 @@ my %nikonFocalConversions = (
4947
5014
  %nikonApertureConversions,
4948
5015
  },
4949
5016
  #
4950
- # ---- 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)
4951
5019
  #
4952
5020
  0x2f => { # look forward to see if new lens data exists...
4953
5021
  Name => 'NewLensData',
@@ -4955,7 +5023,7 @@ my %nikonFocalConversions = (
4955
5023
  RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
4956
5024
  Hidden => 1,
4957
5025
  },
4958
- 0x30 => {
5026
+ 0x30 => { #PH
4959
5027
  Name => 'LensID',
4960
5028
  Condition => '$$self{NewLensData}',
4961
5029
  Notes => 'tags from here onward used for Nikkor Z lenses only',
@@ -4981,9 +5049,23 @@ my %nikonFocalConversions = (
4981
5049
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4982
5050
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4983
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
4984
5056
  },
4985
5057
  },
4986
- 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
4987
5069
  Name => 'MaxAperture',
4988
5070
  Condition => '$$self{NewLensData}',
4989
5071
  Format => 'int16u',
@@ -4993,7 +5075,7 @@ my %nikonFocalConversions = (
4993
5075
  PrintConv => 'sprintf("%.1f",$val)',
4994
5076
  PrintConvInv => '$val',
4995
5077
  },
4996
- 0x38 => {
5078
+ 0x38 => { #PH
4997
5079
  Name => 'FNumber',
4998
5080
  Condition => '$$self{NewLensData}',
4999
5081
  Format => 'int16u',
@@ -5003,7 +5085,7 @@ my %nikonFocalConversions = (
5003
5085
  PrintConv => 'sprintf("%.1f",$val)',
5004
5086
  PrintConvInv => '$val',
5005
5087
  },
5006
- 0x3c => {
5088
+ 0x3c => { #PH
5007
5089
  Name => 'FocalLength',
5008
5090
  Condition => '$$self{NewLensData}',
5009
5091
  Format => 'int16u',
@@ -5011,14 +5093,36 @@ my %nikonFocalConversions = (
5011
5093
  PrintConv => '"$val mm"',
5012
5094
  PrintConvInv => '$val=~s/\s*mm$//;$val',
5013
5095
  },
5014
- 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
5015
5104
  Name => 'FocusDistance',
5016
- Condition => '$$self{NewLensData}',
5017
- # (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
5018
5108
  ValueConv => '0.01 * 10**($val/40)', # in m
5019
5109
  ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
5020
- PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"',
5021
- 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,
5022
5126
  },
5023
5127
  );
5024
5128
 
@@ -5421,14 +5525,14 @@ my %nikonFocalConversions = (
5421
5525
  },
5422
5526
  0x27d => {
5423
5527
  Name => 'ShutterCount',
5424
- Condition => '$$self{FirmwareVersion} =~ /^1.01/',
5528
+ Condition => '$$self{FirmwareVersion} =~ /^1\.01/',
5425
5529
  Notes => 'firmware 1.10',
5426
5530
  Format => 'int32u',
5427
5531
  Priority => 0,
5428
5532
  },
5429
5533
  0x27f => {
5430
5534
  Name => 'ShutterCount',
5431
- Condition => '$$self{FirmwareVersion} =~ /^2.0/',
5535
+ Condition => '$$self{FirmwareVersion} =~ /^2\.0/',
5432
5536
  Notes => 'firmware 2.00, 2.01 and 2.02',
5433
5537
  Format => 'int32u',
5434
5538
  Priority => 0,
@@ -7322,7 +7426,7 @@ my %nikonFocalConversions = (
7322
7426
  # (moves around too much and doesn't fit cleanly in the offset table)
7323
7427
  #0x38be => {
7324
7428
  # Name => 'Rotation',
7325
- # Condition => '$$self{FirmwareVersion} =~ /^1.0/',
7429
+ # Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
7326
7430
  # Mask => 0x30,
7327
7431
  # PrintConv => {
7328
7432
  # 0 => 'Horizontal',
@@ -7628,7 +7732,7 @@ my %nikonFocalConversions = (
7628
7732
  },
7629
7733
  0x189d => { #PH (NC)
7630
7734
  Name => 'CustomSettingsD4S',
7631
- Condition => '$$self{FirmwareVersion} =~ /^1.00/',
7735
+ Condition => '$$self{FirmwareVersion} =~ /^1\.00/',
7632
7736
  Notes => 'firmware version 1.00',
7633
7737
  Format => 'undef[56]',
7634
7738
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7636,7 +7740,7 @@ my %nikonFocalConversions = (
7636
7740
  0x18c2 => { # CSf1-c (no idea why it is so far away from the rest of the settings)
7637
7741
  Name => 'MultiSelectorLiveViewMode',
7638
7742
  Groups => { 1 => 'NikonCustom' },
7639
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
7743
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7640
7744
  Mask => 0xc0,
7641
7745
  PrintConv => {
7642
7746
  0 => 'Reset',
@@ -7737,7 +7841,7 @@ my %nikonFocalConversions = (
7737
7841
  },
7738
7842
  0x193d => {
7739
7843
  Name => 'CustomSettingsD4S',
7740
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
7844
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7741
7845
  Notes => 'firmware version 1.01',
7742
7846
  Format => 'undef[56]',
7743
7847
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7990,8 +8094,8 @@ my %nikonFocalConversions = (
7990
8094
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7991
8095
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7992
8096
  VARS => { ID_LABEL => 'Index' },
7993
- DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7994
- 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
8097
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
8098
+ 0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
7995
8099
  IS_SUBDIR => [ 0xec4b ],
7996
8100
  WRITABLE => 1,
7997
8101
  FIRST_ENTRY => 0,
@@ -8068,6 +8172,15 @@ my %nikonFocalConversions = (
8068
8172
  # account for variable location of Offset3 data
8069
8173
  Hook => '$varSize = $$self{Offset3} - 0x6c70',
8070
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
+ },
8071
8184
  0x6c98 => {
8072
8185
  Name => 'IntervalShooting',
8073
8186
  RawConv => '$$self{IntervalShooting} = $val',
@@ -8087,23 +8200,6 @@ my %nikonFocalConversions = (
8087
8200
  Format => 'int16u',
8088
8201
  Hidden => 1,
8089
8202
  },
8090
- ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8091
- 0x7717 => {
8092
- Name => 'Offsset5Hook',
8093
- Hidden => 1,
8094
- RawConv => 'undef',
8095
- # account for variable location of Offset5 data
8096
- Hook => '$varSize = $$self{Offset5} - 0x7718',
8097
- },
8098
- 0x7844 => {
8099
- Name => 'FocusShiftShooting',
8100
- RawConv => '$$self{FocusShiftShooting} = $val',
8101
- PrintConv => q{
8102
- return 'Off' if $val == 0 ;
8103
- my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8104
- return "On: $i"
8105
- },
8106
- },
8107
8203
  ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8108
8204
  0xeaea => {
8109
8205
  Name => 'OrientationHook',
@@ -8157,6 +8253,7 @@ my %nikonFocalConversions = (
8157
8253
  0xec4b => {
8158
8254
  Name => 'MenuSettingsZ9',
8159
8255
  Format => 'undef[1646]',
8256
+ Condition => '$$self{FirmwareVersion} lt "03.00"',
8160
8257
  SubDirectory => {
8161
8258
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8162
8259
  },
@@ -8586,6 +8683,8 @@ my %nikonFocalConversions = (
8586
8683
  4 => 'Wide (L)',
8587
8684
  5 => '3D',
8588
8685
  6 => 'Auto',
8686
+ 12 => 'Wide (C1)',
8687
+ 13 => 'Wide (C2)',
8589
8688
  },
8590
8689
  },
8591
8690
  530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
@@ -8656,6 +8755,8 @@ my %nikonFocalConversions = (
8656
8755
  2 => 'H.265 8-bit (MOV)',
8657
8756
  3 => 'H.265 10-bit (MOV)',
8658
8757
  4 => 'ProRes 422 HQ 10-bit (MOV)',
8758
+ 5 => 'ProRes RAW HQ 12-bit (MOV)',
8759
+ 6 => 'NRAW 12-bit (NEV)'
8659
8760
  },
8660
8761
  },
8661
8762
  616 => {
@@ -8739,13 +8840,18 @@ my %nikonFocalConversions = (
8739
8840
  6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8740
8841
  10 => '+05:45 (Kathmandu)',
8741
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)',
8742
8847
  16 => '+03:00 (Moscow, Nairobi)',
8743
- 15 => '+02:00 (Athens)',
8744
- 16 => '+01:00 (Madrid, Paris, Berlin)',
8745
8848
  17 => '+02:00 (Athens, Helsinki)',
8746
- 18 => '+00:00 (London)',
8747
- 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)',
8748
8853
  22 => '-03:00 (Buenos Aires, Sao Paulo)',
8854
+ 23 => '-03:30 (Newfoundland)',
8749
8855
  24 => '-04:00 (Manaus, Caracas)',
8750
8856
  25 => '-05:00 (New York, Toronto, Lima)',
8751
8857
  26 => '-06:00 (Chicago, Mexico City)',
@@ -10071,6 +10177,36 @@ my %nikonFocalConversions = (
10071
10177
  },
10072
10178
  );
10073
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
+
10074
10210
  # HDR information (ref 32)
10075
10211
  %Image::ExifTool::Nikon::HDRInfo = (
10076
10212
  %binaryDataAttrs,
@@ -10079,12 +10215,13 @@ my %nikonFocalConversions = (
10079
10215
  0 => {
10080
10216
  Name => 'HDRInfoVersion',
10081
10217
  Format => 'string[4]',
10218
+ Writable => 0,
10082
10219
  },
10083
10220
  4 => {
10084
10221
  Name => 'HDR',
10085
10222
  PrintConv => {
10086
10223
  0 => 'Off',
10087
- 1 => 'On',
10224
+ 1 => 'On (normal)',
10088
10225
  48 => 'Auto', #PH (NC)
10089
10226
  },
10090
10227
  },
@@ -10122,6 +10259,35 @@ my %nikonFocalConversions = (
10122
10259
  },
10123
10260
  );
10124
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
+
10125
10291
  # location information (ref PH)
10126
10292
  %Image::ExifTool::Nikon::LocationInfo = (
10127
10293
  %binaryDataAttrs,
@@ -10842,9 +11008,14 @@ my %nikonFocalConversions = (
10842
11008
  Name => 'LocationInfo',
10843
11009
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
10844
11010
  },
11011
+ 0x200003f => 'WhiteBalanceFineTune',
10845
11012
  # 0x200003f - rational64s[2]: "0 0"
10846
11013
  # 0x2000042 - undef[6]: "0100\x03\0"
10847
11014
  # 0x2000043 - undef[12]: all zeros
11015
+ 0x200004e => {
11016
+ Name => 'NikonSettings',
11017
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
11018
+ },
10848
11019
  0x2000083 => {
10849
11020
  Name => 'LensType',
10850
11021
  # credit to Tom Christiansen (ref 7) for figuring this out...
@@ -11311,7 +11482,7 @@ sub PrintAFPointsGridInv($$$)
11311
11482
  #------------------------------------------------------------------------------
11312
11483
  # Print conversion for relative Left/Right AF points (ref 28)
11313
11484
  # Inputs: 0) column, 1) number of columns
11314
- # 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')
11315
11486
  sub PrintAFPointsLeftRight($$)
11316
11487
  {
11317
11488
  my ($col, $ncol) = @_;
@@ -11324,7 +11495,7 @@ sub PrintAFPointsLeftRight($$)
11324
11495
  #------------------------------------------------------------------------------
11325
11496
  # Print conversion for relative Up/Down AF points (ref 28)
11326
11497
  # Inputs: 0) row, 1) number of rows
11327
- # 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')
11328
11499
  sub PrintAFPointsUpDown($$)
11329
11500
  {
11330
11501
  my ($row, $nrow) = @_;