exiftool_vendored 12.42.0 → 12.52.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +226 -6
  3. data/bin/MANIFEST +14 -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 +116 -97
  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/Casio.pm +3 -3
  19. data/bin/lib/Image/ExifTool/DJI.pm +2 -1
  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 +17 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +9 -7
  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 +31 -5
  28. data/bin/lib/Image/ExifTool/Geotag.pm +36 -8
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +6 -6
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/JPEG.pm +1 -0
  34. data/bin/lib/Image/ExifTool/Jpeg2000.pm +24 -3
  35. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  36. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  37. data/bin/lib/Image/ExifTool/Lang/fr.pm +6015 -759
  38. data/bin/lib/Image/ExifTool/Lang/sk.pm +1927 -0
  39. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  40. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  41. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  42. data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  43. data/bin/lib/Image/ExifTool/Matroska.pm +272 -48
  44. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  45. data/bin/lib/Image/ExifTool/Nikon.pm +746 -382
  46. data/bin/lib/Image/ExifTool/NikonCustom.pm +139 -106
  47. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  48. data/bin/lib/Image/ExifTool/Olympus.pm +6 -4
  49. data/bin/lib/Image/ExifTool/PNG.pm +8 -1
  50. data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  51. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  52. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  53. data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
  54. data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  55. data/bin/lib/Image/ExifTool/QuickTime.pm +166 -13
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +161 -22
  57. data/bin/lib/Image/ExifTool/README +15 -4
  58. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  59. data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  60. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  61. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  62. data/bin/lib/Image/ExifTool/Sony.pm +75 -47
  63. data/bin/lib/Image/ExifTool/TagInfoXML.pm +13 -6
  64. data/bin/lib/Image/ExifTool/TagLookup.pm +4791 -4519
  65. data/bin/lib/Image/ExifTool/TagNames.pod +2056 -1446
  66. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  67. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  68. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  69. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  70. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  71. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  72. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  73. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +12 -7
  74. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  75. data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -1
  76. data/bin/lib/Image/ExifTool/Writer.pl +46 -18
  77. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  78. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  79. data/bin/lib/Image/ExifTool/ZIP.pm +19 -7
  80. data/bin/lib/Image/ExifTool.pm +146 -38
  81. data/bin/lib/Image/ExifTool.pod +83 -69
  82. data/bin/perl-Image-ExifTool.spec +43 -43
  83. data/lib/exiftool_vendored/version.rb +1 -1
  84. metadata +10 -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.15';
67
68
 
68
69
  sub LensIDConv($$$);
69
70
  sub ProcessNikonAVI($$$);
@@ -363,10 +364,12 @@ 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
369
371
  '91 54 44 44 0C 0C 4B 06' => 'Sigma 35mm F1.4 DG HSM', #30
372
+ 'BD 54 48 48 0C 0C 4B 46' => 'Sigma 40mm F1.4 DG HSM | A', #30
370
373
  'DE 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 EX DG HSM',
371
374
  '88 54 50 50 0C 0C 4B 06' => 'Sigma 50mm F1.4 DG HSM | A',
372
375
  '02 48 50 50 24 24 02 00' => 'Sigma Macro 50mm F2.8', #https://exiftool.org/forum/index.php/topic,4027.0.html
@@ -380,6 +383,7 @@ sub GetAFPointGrid($$;$);
380
383
  '32 54 6A 6A 24 24 35 02.2' => 'Sigma Macro 105mm F2.8 EX DG', #JD
381
384
  'E5 54 6A 6A 24 24 35 02' => 'Sigma Macro 105mm F2.8 EX DG',
382
385
  '97 48 6A 6A 24 24 4B 0E' => 'Sigma Macro 105mm F2.8 EX DG OS HSM',
386
+ 'BE 54 6A 6A 0C 0C 4B 46' => 'Sigma 105mm F1.4 DG HSM | A', #30
383
387
  '48 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM',
384
388
  'F5 48 76 76 24 24 4B 06' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #24
385
389
  '99 48 76 76 24 24 4B 0E' => 'Sigma APO Macro 150mm F2.8 EX DG OS HSM', #(Christian Hesse)
@@ -435,7 +439,7 @@ sub GetAFPointGrid($$;$);
435
439
  '90 40 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 II DC OS HSM', #JohnHelour
436
440
  '89 30 2D 80 2C 40 4B 0E' => 'Sigma 18-200mm F3.5-6.3 DC Macro OS HS | C', #JoeSchonberg
437
441
  'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM',
438
- # LensFStops varies with FocalLength for this lens (ref 2):
442
+ # LensFStops varies with FocalLength for this lens (ref 2):
439
443
  '92 2C 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', #2
440
444
  '87 2C 2D 8E 2C 40 4B 0E' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM', #30
441
445
  # '92 2C 2D 88 2C 40 4B 0E' (250mm)
@@ -606,6 +610,7 @@ sub GetAFPointGrid($$;$);
606
610
  'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
607
611
  'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
608
612
  'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
613
+ 'E3 40 76 A6 38 40 DF 0E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)', #forum3833
609
614
  '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
610
615
  '00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)',
611
616
  '00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)',
@@ -668,6 +673,7 @@ sub GetAFPointGrid($$;$);
668
673
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
669
674
  '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
670
675
  '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
676
+ 'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
671
677
  #
672
678
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
673
679
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -825,6 +831,53 @@ my %activeDLightingZ7 = (
825
831
  5 => 'Extra High',
826
832
  );
827
833
 
834
+ my %aFAreaModeZ9 = (
835
+ 0 => 'Pinpoint',
836
+ 1 => 'Single',
837
+ 2 => 'Dynamic',
838
+ 3 => 'Wide (S)',
839
+ 4 => 'Wide (L)',
840
+ 5 => '3D',
841
+ 6 => 'Auto',
842
+ 11 => 'Subject Tracking',
843
+ 12 => 'Wide (C1)',
844
+ 13 => 'Wide (C2)',
845
+ );
846
+
847
+ my %banksZ9 = (
848
+ 0 => 'A',
849
+ 1 => 'B',
850
+ 2 => 'C',
851
+ 3 => 'D',
852
+ );
853
+
854
+ my %bracketIncrementZ9 = (
855
+ 0 => '0.3',
856
+ #1 => '0.5',
857
+ 2 => '0.7',
858
+ 3 => '1.0',
859
+ 4 => '2.0',
860
+ 5 => '3.0',
861
+ );
862
+
863
+ my %bracketSetZ9 = (
864
+ 0 => 'AE/Flash',
865
+ 1 => 'AE',
866
+ 2 => 'Flash',
867
+ 3 => 'White Balance',
868
+ 4 => 'Active-D Lighting',
869
+ );
870
+
871
+ my %bracketProgramZ9 = (
872
+ 0 => 'Disabled',
873
+ 2 => '2F',
874
+ 3 => '3F',
875
+ 4 => '4F',
876
+ 5 => '5F',
877
+ 7 => '7F',
878
+ 9 => '9F',
879
+ );
880
+
828
881
  my %flashControlModeZ7 = (
829
882
  0 => 'TTL',
830
883
  1 => 'Auto External Flash',
@@ -853,9 +906,32 @@ my %focusModeZ7 = (
853
906
  4 => 'AF-F', # full frame
854
907
  );
855
908
 
909
+ my %hDMIOutputResolutionZ9 = (
910
+ 0 => 'Auto',
911
+ 1 => '4320p',
912
+ 2 => '2160p',
913
+ 3 => '1080p',
914
+ #4 => '1080i',
915
+ 5 => '720p',
916
+ #6 => '576p',
917
+ #7 => '480p',
918
+ );
919
+
920
+ my %imageAreaZ9 = (
921
+ 0 => 'FX',
922
+ 1 => 'DX',
923
+ 4 => '16:9',
924
+ 8 => '1:1',
925
+ );
926
+
927
+ my %imageAreaZ9b = (
928
+ 0 => 'FX',
929
+ 1 => 'DX',
930
+ );
931
+
856
932
  my %infoZSeries = (
857
933
  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',
934
+ Notes => 'Z Series cameras thru December 2021',
859
935
  );
860
936
  my %iSOAutoHiLimitZ7 = (
861
937
  0 => 'ISO 64',
@@ -891,6 +967,66 @@ my %iSOAutoHiLimitZ7 = (
891
967
  32 => 'ISO Hi 2.0',
892
968
  );
893
969
 
970
+ my %iSOAutoShutterTimeZ9 = (
971
+ -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15
972
+ -12 => '15 s',
973
+ -9 => '8 s',
974
+ -6 => '4 s',
975
+ -3 => '2 s',
976
+ 0 => '1 s',
977
+ 1 => '1/1.3 s',
978
+ 2 => '1/1.6 s',
979
+ 3 => '1/2 s',
980
+ 4 => '1/2.5 s',
981
+ 5 => '1/3 s',
982
+ 6 => '1/4 s',
983
+ 7 => '1/5 s',
984
+ 8 => '1/6 s',
985
+ 9 => '1/8 s',
986
+ 10 => '1/10 s',
987
+ 11 => '1/13 s',
988
+ 12 => '1/15 s',
989
+ 13 => '1/20 s',
990
+ 14 => '1/25 s',
991
+ 15 => '1/30 s',
992
+ 16 => '1/40 s',
993
+ 17 => '1/50 s',
994
+ 18 => '1/60 s',
995
+ 19 => '1/80 s',
996
+ 20 => '1/100 s',
997
+ 21 => '1/120 s',
998
+ 22 => '1/160 s',
999
+ 23 => '1/200 s',
1000
+ 24 => '1/250 s',
1001
+ 25 => '1/320 s',
1002
+ 26 => '1/400 s',
1003
+ 27 => '1/500 s',
1004
+ 28 => '1/640 s',
1005
+ 29 => '1/800 s',
1006
+ 30 => '1/1000 s',
1007
+ 31 => '1/1250 s',
1008
+ 32 => '1/1600 s',
1009
+ 33 => '1/2000 s',
1010
+ 34 => '1/2500 s',
1011
+ 35 => '1/3200 s',
1012
+ 36 => '1/4000 s',
1013
+ 37 => '1/5000 s',
1014
+ 37.5 => '1/6000 s',
1015
+ 38 => '1/6400 s',
1016
+ 39 => '1/8000 s',
1017
+ 40 => '1/10000 s',
1018
+ 40.5 => '1/12000 s',
1019
+ 41 => '1/13000 s',
1020
+ 42 => '1/16000 s',
1021
+ );
1022
+
1023
+ my %languageZ9 = (
1024
+ 4 => 'English',
1025
+ 5 => 'Spanish',
1026
+ 7 => 'French',
1027
+ 15 => 'Portuguese'
1028
+ );
1029
+
894
1030
  my %meteringModeZ7 = (
895
1031
  0 => 'Matrix',
896
1032
  1 => 'Center',
@@ -898,6 +1034,30 @@ my %meteringModeZ7 = (
898
1034
  3 => 'Highlight'
899
1035
  );
900
1036
 
1037
+ my %monitorBrightnessZ9 = (
1038
+ 0 => '-5',
1039
+ 1 => '-4',
1040
+ 2 => '-3',
1041
+ 3 => '-2',
1042
+ 4 => '-1',
1043
+ 5 => '0',
1044
+ 6 => '1',
1045
+ 7 => '2',
1046
+ 8 => '3',
1047
+ 9 => '4',
1048
+ 10 => '5',
1049
+ 14 => 'Hi1',
1050
+ 15 => 'Hi2',
1051
+ 16 => 'Lo2',
1052
+ 17 => 'Lo1',
1053
+ );
1054
+
1055
+ my %movieFlickerReductionZ9 = (
1056
+ 0 => 'Auto',
1057
+ 1 => '50Hz',
1058
+ 2 => '60Hz',
1059
+ );
1060
+
901
1061
  my %movieFrameRateZ7 = (
902
1062
  0 => '120p',
903
1063
  1 => '100p',
@@ -908,6 +1068,33 @@ my %movieFrameRateZ7 = (
908
1068
  6 => '24p',
909
1069
  );
910
1070
 
1071
+ my %movieFrameSizeZ9 = (
1072
+ 1 => '1920x1080',
1073
+ 2 => '3840x2160',
1074
+ 3 => '7680x4320',
1075
+ );
1076
+
1077
+ my %movieToneMapZ9 = (
1078
+ 0 => 'SDR',
1079
+ 1 => 'HLG',
1080
+ 2 => 'N-Log',
1081
+ );
1082
+
1083
+ my %movieTypeZ9 = (
1084
+ 1 => 'H.265 8-bit (MP4)',
1085
+ 2 => 'H.265 8-bit (MOV)',
1086
+ 3 => 'H.265 10-bit (MOV)',
1087
+ 4 => 'ProRes 422 HQ 10-bit (MOV)',
1088
+ 5 => 'ProRes RAW HQ 12-bit (MOV)',
1089
+ 6 => 'NRAW 12-bit (NEV)'
1090
+ );
1091
+
1092
+ my %multipleExposureModeZ9 = (
1093
+ 0 => 'Off',
1094
+ 1 => 'On',
1095
+ 2 => 'On (Series)',
1096
+ );
1097
+
911
1098
  my %offLowNormalHighZ7 = (
912
1099
  0 => 'Off',
913
1100
  1 => 'Low',
@@ -915,10 +1102,11 @@ my %offLowNormalHighZ7 = (
915
1102
  3 => 'High',
916
1103
  );
917
1104
 
918
- my %movieFrameSizeZ9 = (
919
- 1 => '1920x1080',
920
- 2 => '3840x2160',
921
- 3 => '7680x4320',
1105
+ my %secondarySlotFunctionZ9 = (
1106
+ 0 => 'Overflow',
1107
+ 1 => 'Backup',
1108
+ 2 => 'NEF Primary + JPG Secondary',
1109
+ 3 => 'JPG Primary + JPG Secondary',
922
1110
  );
923
1111
 
924
1112
  my %subjectDetectionZ9 = (
@@ -929,6 +1117,34 @@ my %subjectDetectionZ9 = (
929
1117
  4 => 'Vehicles',
930
1118
  );
931
1119
 
1120
+ my %timeZoneZ9 = (
1121
+ 3 => '+10:00 (Sydney)',
1122
+ 5 => '+09:00 (Tokyo)',
1123
+ 6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
1124
+ 10 => '+05:45 (Kathmandu)',
1125
+ 11 => '+05:30 (New Dehli)',
1126
+ 12 => '+05:00 (Islamabad)',
1127
+ 13 => '+04:30 (Kabul)',
1128
+ 14 => '+04:00 (Abu Dhabi)',
1129
+ 15 => '+03:30 (Tehran)',
1130
+ 16 => '+03:00 (Moscow, Nairobi)',
1131
+ 17 => '+02:00 (Athens, Helsinki)',
1132
+ 18 => '+01:00 (Madrid, Paris, Berlin)',
1133
+ 19 => '+00:00 (London)',
1134
+ 20 => '-01:00 (Azores)',
1135
+ 21 => '-02:00 (Fernando de Noronha)',
1136
+ 22 => '-03:00 (Buenos Aires, Sao Paulo)',
1137
+ 23 => '-03:30 (Newfoundland)',
1138
+ 24 => '-04:00 (Manaus, Caracas)',
1139
+ 25 => '-05:00 (New York, Toronto, Lima)',
1140
+ 26 => '-06:00 (Chicago, Mexico City)',
1141
+ 27 => '-07:00 (Denver)',
1142
+ 28 => '-08:00 (Los Angeles, Vancouver)',
1143
+ 29 => '-09:00 (Anchorage)',
1144
+ 30 => '-10:00 (Hawaii)',
1145
+ );
1146
+
1147
+
932
1148
  my %vRModeZ9 = (
933
1149
  0 => 'Off',
934
1150
  1 => 'Normal',
@@ -1124,8 +1340,6 @@ my %afPoints153 = (
1124
1340
 
1125
1341
  # AF point indices for models with 81 focus points, eg. Z6/Z7/Z50 (ref 38)
1126
1342
  # - 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
1343
  #
1130
1344
  # 7 6 5 4 3 2 1 0
1131
1345
  # 00 : [H5][G5][F5][A5][B5][C5][D5][E5]
@@ -1140,23 +1354,23 @@ my %afPoints153 = (
1140
1354
  # 09 : [H1][G1][F1][A1][B1][C1][D1][E1]
1141
1355
  # 0a : [ ][ ][ ][ ][ ][ ][ ][I1]
1142
1356
  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',
1357
+ 1 => 'E5', 18 => 'I6', 35 => 'H7', 52 => 'G8', 69 => 'F9',
1358
+ 2 => 'D5', 19 => 'E4', 36 => 'I7', 53 => 'H8', 70 => 'G9',
1359
+ 3 => 'C5', 20 => 'D4', 37 => 'E3', 54 => 'I8', 71 => 'H9',
1360
+ 4 => 'B5', 21 => 'C4', 38 => 'D3', 55 => 'E2', 72 => 'I9',
1361
+ 5 => 'A5', 22 => 'B4', 39 => 'C3', 56 => 'D2', 73 => 'E1',
1362
+ 6 => 'F5', 23 => 'A4', 40 => 'B3', 57 => 'C2', 74 => 'D1',
1363
+ 7 => 'G5', 24 => 'F4', 41 => 'A3', 58 => 'B2', 75 => 'C1',
1364
+ 8 => 'H5', 25 => 'G4', 42 => 'F3', 59 => 'A2', 76 => 'B1',
1365
+ 9 => 'I5', 26 => 'H4', 43 => 'G3', 60 => 'F2', 77 => 'A1',
1366
+ 10 => 'E6', 27 => 'I4', 44 => 'H3', 61 => 'G2', 78 => 'F1',
1367
+ 11 => 'D6', 28 => 'E7', 45 => 'I3', 62 => 'H2', 79 => 'G1',
1368
+ 12 => 'C6', 29 => 'D7', 46 => 'E8', 63 => 'I2', 80 => 'H1',
1369
+ 13 => 'B6', 30 => 'C7', 47 => 'D8', 64 => 'E9', 81 => 'I1',
1370
+ 14 => 'A6', 31 => 'B7', 48 => 'C8', 65 => 'D9',
1371
+ 15 => 'F6', 32 => 'A7', 49 => 'B8', 66 => 'C9',
1372
+ 16 => 'G6', 33 => 'F7', 50 => 'A8', 67 => 'B9',
1373
+ 17 => 'H6', 34 => 'G7', 51 => 'F8', 68 => 'A9',
1160
1374
  );
1161
1375
 
1162
1376
  my %cropHiSpeed = ( #IB
@@ -1597,10 +1811,14 @@ my %base64coord = (
1597
1811
  81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II)
1598
1812
  },
1599
1813
  },
1600
- 0x0035 => { #32
1814
+ 0x0035 => [{ #32
1601
1815
  Name => 'HDRInfo',
1816
+ Condition => '$count != 6',
1602
1817
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo' },
1603
- },
1818
+ },{
1819
+ Name => 'HDRInfo2',
1820
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::HDRInfo2' },
1821
+ }],
1604
1822
  0x0037 => { #XavierJubier
1605
1823
  Name => 'MechanicalShutterCount',
1606
1824
  Writable => 'int32u',
@@ -1623,6 +1841,11 @@ my %base64coord = (
1623
1841
  3 => 'Small',
1624
1842
  },
1625
1843
  },
1844
+ 0x003f => { #https://github.com/darktable-org/darktable/issues/12282
1845
+ Name => 'WhiteBalanceFineTune',
1846
+ Writable => 'rational64s',
1847
+ Count => 2,
1848
+ },
1626
1849
  0x0045 => { #IB
1627
1850
  Name => 'CropArea',
1628
1851
  Notes => 'left, top, width, height',
@@ -2080,7 +2303,7 @@ my %base64coord = (
2080
2303
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
2081
2304
  DecryptStart => 4,
2082
2305
  # TODO: eventually set the length dynamically according to actual offsets!
2083
- DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
2306
+ DecryptLen => 0xec4b + 2196, # decoded thru end of Offset26
2084
2307
  ByteOrder => 'LittleEndian',
2085
2308
  },
2086
2309
  },
@@ -2481,6 +2704,12 @@ my %base64coord = (
2481
2704
  TagTable => 'Image::ExifTool::Nikon::MultiExposure',
2482
2705
  ByteOrder => 'LittleEndian',
2483
2706
  },
2707
+ },{
2708
+ Name => 'MultiExposure2',
2709
+ Condition => '$$valPt =~ /^010[23]/', # 0102 is NC (PH)
2710
+ SubDirectory => {
2711
+ TagTable => 'Image::ExifTool::Nikon::MultiExposure2',
2712
+ },
2484
2713
  }],
2485
2714
  0x00b1 => { #14/PH/JD (D80)
2486
2715
  Name => 'HighISONoiseReduction',
@@ -2797,10 +3026,10 @@ my %base64coord = (
2797
3026
  Name => 'VRMode',
2798
3027
  PrintConv => {
2799
3028
  0 => 'Off',
2800
- 1 => 'Sport',
2801
- 3 => 'Normal',
3029
+ 1 => 'Normal', #39 (was 'Sport')
3030
+ 3 => 'Sport', #39 (was 'Normal')
2802
3031
  },
2803
- %infoZSeries
3032
+ %infoZSeries,
2804
3033
  },{
2805
3034
  Name => 'VRMode',
2806
3035
  PrintConv => {
@@ -2811,6 +3040,13 @@ my %base64coord = (
2811
3040
  },
2812
3041
  }],
2813
3042
  # 7 - values: 0, 1
3043
+ 8 => { #39
3044
+ Name => 'VRType',
3045
+ PrintConv => {
3046
+ 2 => 'In-body', # (IBIS)
3047
+ 3 => 'In-body + Lens', # (IBIS + VR)
3048
+ },
3049
+ },
2814
3050
  );
2815
3051
 
2816
3052
  # Face detection information - PH (S8100)
@@ -3343,8 +3579,10 @@ my %base64coord = (
3343
3579
  sprintf("%s%.2d:%.2d", $sign, $h, abs($val)-60*$h);
3344
3580
  },
3345
3581
  PrintConvInv => q{
3346
- $val =~ /([-+]?)(\d+):(\d+)/ or return undef;
3347
- return $1 . ($2 * 60 + $3);
3582
+ $val =~ /Z$/ and return 0;
3583
+ $val =~ /([-+])(\d{1,2}):?(\d{2})$/ and return $1 . ($2 * 60 + $3);
3584
+ $val =~ /^(\d{2})(\d{2})$/ and return $1 * 60 + $2;
3585
+ return undef;
3348
3586
  },
3349
3587
  },
3350
3588
  2 => {
@@ -3561,7 +3799,6 @@ my %base64coord = (
3561
3799
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3562
3800
  DATAMEMBER => [ 0, 4, 6 ],
3563
3801
  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
3802
  0 => {
3566
3803
  Name => 'AFInfo2Version',
3567
3804
  Format => 'undef[4]',
@@ -3672,7 +3909,7 @@ my %base64coord = (
3672
3909
  { #PH/JD
3673
3910
  Name => 'PrimaryAFPoint',
3674
3911
  # 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"',
3912
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3676
3913
  Notes => q{
3677
3914
  models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
3678
3915
  D4, D4S, D300, D300S, D700, D800, D800e and D810
@@ -3778,22 +4015,6 @@ my %base64coord = (
3778
4015
  1 => 'E9 (Center)',
3779
4016
  },
3780
4017
  },
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
4018
  {
3798
4019
  Name => 'PrimaryAFPoint',
3799
4020
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -3807,7 +4028,7 @@ my %base64coord = (
3807
4028
  8 => [
3808
4029
  { #JD/PH
3809
4030
  Name => 'AFPointsUsed',
3810
- Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
4031
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} !~ /^03/',
3811
4032
  Notes => q{
3812
4033
  models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
3813
4034
  point is C6
@@ -3911,33 +4132,78 @@ my %base64coord = (
3911
4132
  PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
3912
4133
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
3913
4134
  },
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
4135
  { #PH
3928
4136
  Name => 'AFPointsUsed',
3929
4137
  # version 301 uses a separate field at offset 0x0a for this tag (ref 28)
3930
- Condition => '$$self{AFInfo2Version} ne "0301"',
4138
+ Condition => '$$self{AFInfo2Version} !~ /^03/',
3931
4139
  Format => 'undef[7]',
3932
4140
  ValueConv => 'join(" ", unpack("H2"x7, $val))',
3933
4141
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3934
4142
  PrintConv => '"Unknown ($val)"',
3935
4143
  PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
3936
4144
  },
4145
+ { #PH
4146
+ Name => 'PrimaryAFPoint',
4147
+ Condition => '$$self{PhaseDetectAF} == 1 and $$self{AFInfo2Version} =~ /^03/',
4148
+ Notes => 'newer models with 51-point AF',
4149
+ PrintConvColumns => 5,
4150
+ PrintConv => {
4151
+ 0 => '(none)',
4152
+ %afPoints51,
4153
+ 1 => 'C6 (Center)', # (add " (Center)" to central point)
4154
+ },
4155
+ },
4156
+ { #PH (Z7)
4157
+ Name => 'PrimaryAFPoint',
4158
+ Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
4159
+ PrintConv => {
4160
+ 0 => '(none)',
4161
+ %afPoints81,
4162
+ 1 => 'E5 (Center)', # (add " (Center)" to central point)
4163
+ },
4164
+ },
4165
+ # this was wrong, but keep the code as a comment in case it may be useful later
4166
+ #{ #PH (Z7) (NC)
4167
+ # Name => 'PrimaryAFPoint',
4168
+ # Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
4169
+ # Notes => q{
4170
+ # Nikon models with 493-point AF -- 17 rows (A-Q) and 29 columns (1-29), I15
4171
+ # at the center
4172
+ # },
4173
+ # PrintConv => {
4174
+ # 0 => '(none)',
4175
+ # 246 => 'I15 (Center)',
4176
+ # OTHER => sub {
4177
+ # my ($val, $inv) = @_;
4178
+ # return GetAFPointGrid($val, 29, $inv);
4179
+ # },
4180
+ # },
4181
+ #},
3937
4182
  ],
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',
4183
+ 0x0a => [{ #PH (D780)
4184
+ Name => 'AFPointsUsed',
4185
+ Condition => '$$self{PhaseDetectAF} == 1 and $$self{AFInfo2Version} =~ /^03/',
4186
+ Notes => 'newer models with 51-point AF',
4187
+ Format => 'undef[7]',
4188
+ ValueConv => 'join(" ", unpack("H2"x7, $val))',
4189
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
4190
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints51); },
4191
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints51); },
4192
+ },{ #38 (Z6/Z7/Z50)
4193
+ Name => 'AFPointsUsed',
4194
+ Condition => '$$self{PhaseDetectAF} == 8 and $$self{AFInfo2Version} =~ /^03/',
4195
+ Notes => q{
4196
+ models with 81-selectable point AF -- 9 rows (A-I) and 9 columns (1-9) for
4197
+ phase detect AF points. Center point is E5
4198
+ },
4199
+ Format => 'undef[11]',
4200
+ ValueConv => 'join(" ", unpack("H2"x11, $val))',
4201
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
4202
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints81); },
4203
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints81); },
4204
+ },{ #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
4205
+ Name => 'AFPointsUsed',
4206
+ Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/',
3941
4207
  Notes => q{
3942
4208
  models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
3943
4209
  point is D8
@@ -3947,7 +4213,7 @@ my %base64coord = (
3947
4213
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3948
4214
  PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
3949
4215
  PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
3950
- },
4216
+ }],
3951
4217
  0x10 => { #PH (D90 and D5000)
3952
4218
  Name => 'AFImageWidth',
3953
4219
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -4026,7 +4292,7 @@ my %base64coord = (
4026
4292
  },
4027
4293
  Format => 'int16u',
4028
4294
  },
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).
4295
+ 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
4296
  Name => 'AFFocusPointXPosition',
4031
4297
  Condition => q{
4032
4298
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
@@ -4174,7 +4440,7 @@ my %base64coord = (
4174
4440
  },
4175
4441
  );
4176
4442
 
4177
- %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4443
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' (Z9)
4178
4444
  %binaryDataAttrs,
4179
4445
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4180
4446
  DATAMEMBER => [ 0 ],
@@ -4194,11 +4460,19 @@ my %base64coord = (
4194
4460
  },
4195
4461
  0x43 => {
4196
4462
  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)
4463
+ Notes => q{
4464
+ the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1
4465
+ to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U
4466
+ (4) and 2D (12) are not used for some reason
4467
+ },
4468
+ # 493 focus points for Z9 fall in a 30x19 grid
4469
+ # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
4470
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
4198
4471
  },
4199
4472
  0x45 => {
4200
4473
  Name => 'FocusPositionVertical',
4201
- PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4474
+ # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
4475
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17); },
4202
4476
  },
4203
4477
  0x46 => {
4204
4478
  Name => 'AFAreaWidth',
@@ -4210,9 +4484,13 @@ my %base64coord = (
4210
4484
  Name => 'AFAreaHeight',
4211
4485
  Format => 'int16u',
4212
4486
  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).
4487
+ },
4488
+ 0x4a => {
4489
+ Name => 'FocusResult',
4490
+ # in Manual Foucs mode, reflects the state of viewfinder focus indicator.
4491
+ # In AF-C or AF-S, reflects the result of the last AF operation.
4492
+ PrintConv => { 0=> "Out of Focus", 1=>"Focus"},
4493
+ },
4216
4494
  );
4217
4495
 
4218
4496
  # Nikon AF fine-tune information (ref 28)
@@ -4858,7 +5136,7 @@ my %nikonFocalConversions = (
4858
5136
  %binaryDataAttrs,
4859
5137
  NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
4860
5138
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4861
- DATAMEMBER => [ 0x03, 0x2f ],
5139
+ DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
4862
5140
  0x00 => {
4863
5141
  Name => 'LensDataVersion',
4864
5142
  Format => 'string[4]',
@@ -4884,12 +5162,12 @@ my %nikonFocalConversions = (
4884
5162
  %nikonApertureConversions,
4885
5163
  },
4886
5164
  # --> 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
- },
5165
+ #0x09 => {
5166
+ # 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
5167
+ # Condition => '$$self{OldLensData}',
5168
+ # PrintConv => 'sprintf("0x%02x", $val)',
5169
+ # PrintConvInv => '$val',
5170
+ #},
4893
5171
  0x0b => {
4894
5172
  Notes => 'this focus distance is approximate, and not very accurate for some lenses',
4895
5173
  Name => 'FocusDistance',
@@ -4948,7 +5226,8 @@ my %nikonFocalConversions = (
4948
5226
  %nikonApertureConversions,
4949
5227
  },
4950
5228
  #
4951
- # ---- new LensData tags used by Nikkor Z lenses ---- (ref PH)
5229
+ # ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ----
5230
+ # (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28)
4952
5231
  #
4953
5232
  0x2f => { # look forward to see if new lens data exists...
4954
5233
  Name => 'NewLensData',
@@ -4956,7 +5235,7 @@ my %nikonFocalConversions = (
4956
5235
  RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
4957
5236
  Hidden => 1,
4958
5237
  },
4959
- 0x30 => {
5238
+ 0x30 => { #PH
4960
5239
  Name => 'LensID',
4961
5240
  Condition => '$$self{NewLensData}',
4962
5241
  Notes => 'tags from here onward used for Nikkor Z lenses only',
@@ -4982,9 +5261,24 @@ my %nikonFocalConversions = (
4982
5261
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4983
5262
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4984
5263
  29 => 'Nikkor Z 28mm f/2.8', #IB
5264
+ 30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
5265
+ 31 => 'Nikkor Z 24-120 f/4', #28
5266
+ 32 => 'Nikkor Z 800mm f/6.3 VR S', #28
5267
+ 36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
5268
+ 39 => 'Nikkor Z 17-28mm f/2.8', #IB
4985
5269
  },
4986
5270
  },
4987
- 0x36 => {
5271
+ 0x35 => { #28
5272
+ Name => 'LensMountType',
5273
+ RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
5274
+ Format => 'int8u',
5275
+ Unknown => 1,
5276
+ PrintConv => {
5277
+ 0 => 'F-mount Lens',
5278
+ 1 => 'Z-mount Lens',
5279
+ },
5280
+ },
5281
+ 0x36 => { #PH
4988
5282
  Name => 'MaxAperture',
4989
5283
  Condition => '$$self{NewLensData}',
4990
5284
  Format => 'int16u',
@@ -4994,7 +5288,7 @@ my %nikonFocalConversions = (
4994
5288
  PrintConv => 'sprintf("%.1f",$val)',
4995
5289
  PrintConvInv => '$val',
4996
5290
  },
4997
- 0x38 => {
5291
+ 0x38 => { #PH
4998
5292
  Name => 'FNumber',
4999
5293
  Condition => '$$self{NewLensData}',
5000
5294
  Format => 'int16u',
@@ -5004,7 +5298,7 @@ my %nikonFocalConversions = (
5004
5298
  PrintConv => 'sprintf("%.1f",$val)',
5005
5299
  PrintConvInv => '$val',
5006
5300
  },
5007
- 0x3c => {
5301
+ 0x3c => { #PH
5008
5302
  Name => 'FocalLength',
5009
5303
  Condition => '$$self{NewLensData}',
5010
5304
  Format => 'int16u',
@@ -5012,14 +5306,36 @@ my %nikonFocalConversions = (
5012
5306
  PrintConv => '"$val mm"',
5013
5307
  PrintConvInv => '$val=~s/\s*mm$//;$val',
5014
5308
  },
5015
- 0x4f => {
5309
+ 0x4c => { #28
5310
+ 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.
5311
+ Format => 'int8u',
5312
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5313
+ RawConv => '$$self{FocusDistanceRangeWidth} = $val',
5314
+ Unknown => 1,
5315
+ },
5316
+ 0x4e => { #28
5016
5317
  Name => 'FocusDistance',
5017
- Condition => '$$self{NewLensData}',
5018
- # (perhaps int16u Format? -- although upper byte would always be zero)
5318
+ Format => 'int16u',
5319
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5320
+ 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
5321
  ValueConv => '0.01 * 10**($val/40)', # in m
5020
5322
  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',
5323
+ PrintConv => q{
5324
+ (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
5325
+ },
5326
+ },
5327
+ 0x56 => { #28
5328
+ Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
5329
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5330
+ Format => 'int8u',
5331
+ RawConv => 'unless (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
5332
+ Unknown => 1,
5333
+ },
5334
+ 0x5a => { #28
5335
+ Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
5336
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5337
+ Format => 'int32s',
5338
+ Unknown => 1,
5023
5339
  },
5024
5340
  );
5025
5341
 
@@ -5422,14 +5738,14 @@ my %nikonFocalConversions = (
5422
5738
  },
5423
5739
  0x27d => {
5424
5740
  Name => 'ShutterCount',
5425
- Condition => '$$self{FirmwareVersion} =~ /^1.01/',
5741
+ Condition => '$$self{FirmwareVersion} =~ /^1\.01/',
5426
5742
  Notes => 'firmware 1.10',
5427
5743
  Format => 'int32u',
5428
5744
  Priority => 0,
5429
5745
  },
5430
5746
  0x27f => {
5431
5747
  Name => 'ShutterCount',
5432
- Condition => '$$self{FirmwareVersion} =~ /^2.0/',
5748
+ Condition => '$$self{FirmwareVersion} =~ /^2\.0/',
5433
5749
  Notes => 'firmware 2.00, 2.01 and 2.02',
5434
5750
  Format => 'int32u',
5435
5751
  Priority => 0,
@@ -7323,7 +7639,7 @@ my %nikonFocalConversions = (
7323
7639
  # (moves around too much and doesn't fit cleanly in the offset table)
7324
7640
  #0x38be => {
7325
7641
  # Name => 'Rotation',
7326
- # Condition => '$$self{FirmwareVersion} =~ /^1.0/',
7642
+ # Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
7327
7643
  # Mask => 0x30,
7328
7644
  # PrintConv => {
7329
7645
  # 0 => 'Horizontal',
@@ -7629,7 +7945,7 @@ my %nikonFocalConversions = (
7629
7945
  },
7630
7946
  0x189d => { #PH (NC)
7631
7947
  Name => 'CustomSettingsD4S',
7632
- Condition => '$$self{FirmwareVersion} =~ /^1.00/',
7948
+ Condition => '$$self{FirmwareVersion} =~ /^1\.00/',
7633
7949
  Notes => 'firmware version 1.00',
7634
7950
  Format => 'undef[56]',
7635
7951
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7637,7 +7953,7 @@ my %nikonFocalConversions = (
7637
7953
  0x18c2 => { # CSf1-c (no idea why it is so far away from the rest of the settings)
7638
7954
  Name => 'MultiSelectorLiveViewMode',
7639
7955
  Groups => { 1 => 'NikonCustom' },
7640
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
7956
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7641
7957
  Mask => 0xc0,
7642
7958
  PrintConv => {
7643
7959
  0 => 'Reset',
@@ -7738,7 +8054,7 @@ my %nikonFocalConversions = (
7738
8054
  },
7739
8055
  0x193d => {
7740
8056
  Name => 'CustomSettingsD4S',
7741
- Condition => '$$self{FirmwareVersion} !~ /^1.00/',
8057
+ Condition => '$$self{FirmwareVersion} !~ /^1\.00/',
7742
8058
  Notes => 'firmware version 1.01',
7743
8059
  Format => 'undef[56]',
7744
8060
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
@@ -7991,8 +8307,8 @@ my %nikonFocalConversions = (
7991
8307
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7992
8308
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7993
8309
  VARS => { ID_LABEL => 'Index' },
7994
- DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7995
- 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
8310
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
8311
+ 0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
7996
8312
  IS_SUBDIR => [ 0xec4b ],
7997
8313
  WRITABLE => 1,
7998
8314
  FIRST_ENTRY => 0,
@@ -8069,6 +8385,15 @@ my %nikonFocalConversions = (
8069
8385
  # account for variable location of Offset3 data
8070
8386
  Hook => '$varSize = $$self{Offset3} - 0x6c70',
8071
8387
  },
8388
+ 0x6c90 => {
8389
+ Name => 'FocusShiftShooting',
8390
+ RawConv => '$$self{FocusShiftShooting} = $val',
8391
+ PrintConv => q{
8392
+ return 'Off' if $val == 0 ;
8393
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8394
+ return "On: $i"
8395
+ },
8396
+ },
8072
8397
  0x6c98 => {
8073
8398
  Name => 'IntervalShooting',
8074
8399
  RawConv => '$$self{IntervalShooting} = $val',
@@ -8088,23 +8413,6 @@ my %nikonFocalConversions = (
8088
8413
  Format => 'int16u',
8089
8414
  Hidden => 1,
8090
8415
  },
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
8416
  ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8109
8417
  0xeaea => {
8110
8418
  Name => 'OrientationHook',
@@ -8155,14 +8463,26 @@ my %nikonFocalConversions = (
8155
8463
  # account for variable location of menu settings data
8156
8464
  Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b',
8157
8465
  },
8158
- 0xec4b => {
8159
- Name => 'MenuSettingsZ9',
8160
- Format => 'undef[1646]',
8161
- SubDirectory => {
8162
- TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8466
+ 0xec4b => [
8467
+ {
8468
+ Name => 'MenuSettingsZ9',
8469
+ Condition => '$$self{FirmwareVersion} lt "03.00"',
8470
+ Format => 'undef[1646]',
8471
+ Notes => 'Firmware versions 2.11 and earlier',
8472
+ SubDirectory => {
8473
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8474
+ },
8163
8475
  },
8164
- },
8165
- # note: DecryptLen currently set to 0xec4b + 1646
8476
+ {
8477
+ Name => 'MenuSettingsZ9',
8478
+ Notes => 'Firmware versions 3.0 and later',
8479
+ Format => 'undef[1948]',
8480
+ SubDirectory => {
8481
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9Firmware3',
8482
+ },
8483
+ },
8484
+ ],
8485
+ # note: DecryptLen currently set to 0xec4b + 2196
8166
8486
  );
8167
8487
 
8168
8488
  %Image::ExifTool::Nikon::MenuSettingsZ7II = (
@@ -8270,8 +8590,8 @@ my %nikonFocalConversions = (
8270
8590
  PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8271
8591
  PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8272
8592
  },
8273
- 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8274
- 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8593
+ 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1 },
8594
+ 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1 },
8275
8595
  352 => {
8276
8596
  Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
8277
8597
  RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
@@ -8296,12 +8616,12 @@ my %nikonFocalConversions = (
8296
8616
  PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8297
8617
  PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8298
8618
  },
8299
- #360 => {Name => 'FlashGroupAControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupACompensation at 362 and FlashGroupAOutput at 368
8300
- #368 => {Name => 'FlashGroupBControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupBCompensation at 370 and FlashGroupBOutput at 374
8301
- #376 => {Name => 'FlashGroupCControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupCCompensation at 378 and FlashGroupCOutput at 382
8302
- #384 => {Name => 'FlashGroupDControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupDCompensation at 386 and FlashGroupDOutput at 390
8303
- #392 => {Name => 'FlashGroupEControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupECompensation at 394 and FlashGroupEOutput at 398
8304
- #400 => {Name => 'FlashGroupFControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupFCompensation at 402 and FlashGroupFOutput at 406
8619
+ #360 => { Name => 'FlashGroupAControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupACompensation at 362 and FlashGroupAOutput at 368
8620
+ #368 => { Name => 'FlashGroupBControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupBCompensation at 370 and FlashGroupBOutput at 374
8621
+ #376 => { Name => 'FlashGroupCControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupCCompensation at 378 and FlashGroupCOutput at 382
8622
+ #384 => { Name => 'FlashGroupDControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupDCompensation at 386 and FlashGroupDOutput at 390
8623
+ #392 => { Name => 'FlashGroupEControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupECompensation at 394 and FlashGroupEOutput at 398
8624
+ #400 => { Name => 'FlashGroupFControlMode' }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupFCompensation at 402 and FlashGroupFOutput at 406
8305
8625
  #434 => FocusMode
8306
8626
  #436 => AFAreaMode
8307
8627
  #438 => VibrationReduction
@@ -8309,8 +8629,8 @@ my %nikonFocalConversions = (
8309
8629
  #444 => BracketProgram
8310
8630
  #446 => BracketIncrement
8311
8631
  #463 => SilentPhotography
8312
- 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8313
- 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8632
+ 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
8633
+ 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
8314
8634
  506 => {
8315
8635
  Name => 'MovieSlowMotion',
8316
8636
  Unknown => 1,
@@ -8339,9 +8659,9 @@ my %nikonFocalConversions = (
8339
8659
  PrintConv => \%iSOAutoHiLimitZ7,
8340
8660
  },
8341
8661
  #520 => MovieWhiteBalanceSameAsPhoto
8342
- 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8343
- 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8344
- 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8662
+ 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
8663
+ 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
8664
+ 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
8345
8665
  576 => {
8346
8666
  Name => 'MovieVignetteControlSameAsPhoto',
8347
8667
  Unknown => 1,
@@ -8357,7 +8677,7 @@ my %nikonFocalConversions = (
8357
8677
  Unknown => 1,
8358
8678
  PrintConv => \%offOn
8359
8679
  },
8360
- 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8680
+ 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
8361
8681
  #586 => MovieAFAreaMode
8362
8682
  590 => {
8363
8683
  Name => 'MovieVibrationReduction',
@@ -8397,11 +8717,7 @@ my %nikonFocalConversions = (
8397
8717
  140 => {
8398
8718
  Name => 'MultipleExposureMode',
8399
8719
  RawConv => '$$self{MultipleExposureMode} = $val',
8400
- PrintConv => {
8401
- 0 => 'Off',
8402
- 1 => 'On (Series)',
8403
- 2 => 'On',
8404
- },
8720
+ PrintConv => \%multipleExposureModeZ9,
8405
8721
  },
8406
8722
  142 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0' }, #range 2-9
8407
8723
  188 => {
@@ -8437,27 +8753,11 @@ my %nikonFocalConversions = (
8437
8753
  PrintConv => \%offOn,
8438
8754
  Condition => '$$self{FocusShiftShooting} > 0',
8439
8755
  },
8440
- 274 => {
8441
- Name => 'PhotoShootingMenuBank',
8442
- PrintConv => {
8443
- 0 => 'A',
8444
- 1 => 'B',
8445
- 2 => 'C',
8446
- 3 => 'D',
8447
- },
8448
- },
8449
- 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn, }, #single tag from both Photo & Video menus
8450
- 308 => {
8451
- Name => 'PhotoShootingMenuBankImageArea',
8452
- PrintConv => {
8453
- 0 => 'FX',
8454
- 1 => 'DX',
8455
- 4 => '16:9',
8456
- 8 => '1:1',
8457
- },
8458
- },
8756
+ 274 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
8757
+ 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, #single tag from both Photo & Video menus
8758
+ 308 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
8459
8759
  #310 ImageQuality
8460
- 322 => { Name => 'AutoISO', PrintConv => \%offOn, },
8760
+ 322 => { Name => 'AutoISO', PrintConv => \%offOn },
8461
8761
  324 => {
8462
8762
  Name => 'ISOAutoHiLimit',
8463
8763
  Format => 'int16u',
@@ -8479,58 +8779,7 @@ my %nikonFocalConversions = (
8479
8779
  Name => 'ISOAutoShutterTime', #shutter speed is 2 ** (-$val/24)
8480
8780
  ValueConv => '$val / 8',
8481
8781
  Format => 'int16s',
8482
- PrintConv => {
8483
- -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15
8484
- -12 => '15 s',
8485
- -9 => '8 s',
8486
- -6 => '4 s',
8487
- -3 => '2 s',
8488
- 0 => '1 s',
8489
- 1 => '1/1.3 s',
8490
- 2 => '1/1.6 s',
8491
- 3 => '1/2 s',
8492
- 4 => '1/2.5 s',
8493
- 5 => '1/3 s',
8494
- 6 => '1/4 s',
8495
- 7 => '1/5 s',
8496
- 8 => '1/6 s',
8497
- 9 => '1/8 s',
8498
- 10 => '1/10 s',
8499
- 11 => '1/13 s',
8500
- 12 => '1/15 s',
8501
- 13 => '1/20 s',
8502
- 14 => '1/25 s',
8503
- 15 => '1/30 s',
8504
- 16 => '1/40 s',
8505
- 17 => '1/50 s',
8506
- 18 => '1/60 s',
8507
- 19 => '1/80 s',
8508
- 20 => '1/100 s',
8509
- 21 => '1/120 s',
8510
- 22 => '1/160 s',
8511
- 23 => '1/200 s',
8512
- 24 => '1/250 s',
8513
- 25 => '1/320 s',
8514
- 26 => '1/400 s',
8515
- 27 => '1/500 s',
8516
- 28 => '1/640 s',
8517
- 29 => '1/800 s',
8518
- 30 => '1/1000 s',
8519
- 31 => '1/1250 s',
8520
- 32 => '1/1600 s',
8521
- 33 => '1/2000 s',
8522
- 34 => '1/2500 s',
8523
- 35 => '1/3200 s',
8524
- 36 => '1/4000 s',
8525
- 37 => '1/5000 s',
8526
- 37.5 => '1/6000 s',
8527
- 38 => '1/6400 s',
8528
- 39 => '1/8000 s',
8529
- 40 => '1/10000 s',
8530
- 40.5 => '1/12000 s',
8531
- 41 => '1/13000 s',
8532
- 42 => '1/16000 s',
8533
- },
8782
+ PrintConv => \%iSOAutoShutterTimeZ9,
8534
8783
  },
8535
8784
  #336 WhiteBalance
8536
8785
  #406 PictureControl
@@ -8539,8 +8788,8 @@ my %nikonFocalConversions = (
8539
8788
  #412 => { Name => 'NoiseReduction', PrintConv => \%offOn }, #Long Exposure Noise Reduction
8540
8789
  #414 HighISONoiseReduction
8541
8790
  #414 VignetteControl
8542
- 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8543
- 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8791
+ 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
8792
+ 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8544
8793
  #419 AutoDistortionControl #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8545
8794
  420 => { Name => 'FlickerReductionShooting', PrintConv => \%offOn },
8546
8795
  #422 MeteringMode
@@ -8575,94 +8824,39 @@ my %nikonFocalConversions = (
8575
8824
  PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8576
8825
  },
8577
8826
  #442 flash wirelss control 0=> 'Off' 1=> 'CMD'
8578
- 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8579
- 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8827
+ 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1 },
8828
+ 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1 },
8580
8829
  #526 FocusMode
8581
- 528 => {
8582
- Name => 'AFAreaMode',
8583
- PrintConv => {
8584
- 1 => 'Single',
8585
- 2 => 'Dynamic',
8586
- 3 => 'Wide (S)',
8587
- 4 => 'Wide (L)',
8588
- 5 => '3D',
8589
- 6 => 'Auto',
8590
- 12 => 'Wide (C1)',
8591
- 13 => 'Wide (C2)',
8592
- },
8593
- },
8594
- 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8830
+ 528 => { Name => 'AFAreaMode',PrintConv => \%aFAreaModeZ9 },
8831
+ 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9 },
8595
8832
  534 => {
8596
8833
  Name => 'BracketSet',
8597
8834
  RawConv => '$$self{BracketSet} = $val',
8598
- PrintConv => {
8599
- 0 => 'AE/Flash',
8600
- 1 => 'AE',
8601
- 2 => 'Flash',
8602
- 3 => 'White Balance',
8603
- 4 => 'Active-D Lighting',
8604
- },
8835
+ PrintConv => \%bracketSetZ9,
8605
8836
  },
8606
8837
  536 => {
8607
8838
  Name => 'BracketProgram',
8608
8839
  Condition => '$$self{BracketSet} < 3',
8609
8840
  Notes => 'AE and/or Flash Bracketing',
8610
- PrintConv => {
8611
- 0 => 'Disabled',
8612
- 2 => '2F',
8613
- 3 => '3F',
8614
- 4 => '4F',
8615
- 5 => '5F',
8616
- 7 => '7F',
8617
- 9 => '9F',
8618
- },
8841
+ PrintConv => \%bracketProgramZ9,
8619
8842
  },
8620
8843
  538 => {
8621
8844
  Name => 'BracketIncrement',
8622
8845
  Condition => '$$self{BracketSet} < 3',
8623
8846
  Notes => 'AE and/or Flash Bracketing',
8624
- PrintConv => {
8625
- 0 => '0.3',
8626
- #1 => '0.5',
8627
- 2 => '0.7',
8628
- 3 => '1.0',
8629
- 4 => '2.0',
8630
- 5 => '3.0',
8631
- },
8847
+ PrintConv => \%bracketIncrementZ9,
8632
8848
  },
8633
8849
  #544 BracketProgram for ADL
8634
- 556 => {
8635
- Name => 'SecondarySlotFunction',
8636
- PrintConv => {
8637
- 0 => 'Overflow',
8638
- 1 => 'Backup',
8639
- 2 => 'NEF Primary + JPG Secondary',
8640
- 3 => 'JPG Primary + JPG Secondary',
8641
- },
8642
- },
8643
- 572 => { Name => 'DXCropAlert', PrintConv => \%offOn, },
8644
- 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9},
8850
+ 556 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
8851
+ 572 => { Name => 'DXCropAlert', PrintConv => \%offOn },
8852
+ 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
8645
8853
  604 => {
8646
8854
  Name => 'MovieImageArea',
8647
8855
  Unknown => 1,
8648
- Mask => 0x01, #without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
8649
- PrintConv => {
8650
- 0 => 'FX',
8651
- 1 => 'DX',
8652
- },
8653
- },
8654
- 614 => {
8655
- Name => 'MovieType',
8656
- Unknown => 1,
8657
- PrintConv => {
8658
- 1 => 'H.265 8-bit (MP4)',
8659
- 2 => 'H.265 8-bit (MOV)',
8660
- 3 => 'H.265 10-bit (MOV)',
8661
- 4 => 'ProRes 422 HQ 10-bit (MOV)',
8662
- 5 => 'ProRes RAW HQ 12-bit (MOV)',
8663
- 6 => 'NRAW 12-bit (NEV)'
8664
- },
8856
+ Mask => 0x01, # without the mask 4 => 'FX', 5 => DX. only the 2nd Z-series field encountered with a mask
8857
+ PrintConv => \%imageAreaZ9b,
8665
8858
  },
8859
+ 614 => { Name => 'MovieType', PrintConv => \%movieTypeZ9, Unknown => 1 },
8666
8860
  616 => {
8667
8861
  Name => 'MovieISOAutoHiLimit',
8668
8862
  Format => 'int16u',
@@ -8671,110 +8865,44 @@ my %nikonFocalConversions = (
8671
8865
  ValueConvInv => '8 * ($val + 104)',
8672
8866
  PrintConv => \%iSOAutoHiLimitZ7,
8673
8867
  },
8674
- 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1},
8868
+ 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1 },
8675
8869
  620 => {
8676
8870
  Name => 'MovieISOAutoManualMode',
8677
8871
  Format => 'int16u',
8678
8872
  Unknown => 1,
8679
8873
  ValueConv => '($val-104)/8',
8680
- ValueConvInv => '8 * ($val + 104)',
8874
+ ValueConvInv => '8 * ($val + 104)',
8681
8875
  PrintConv => \%iSOAutoHiLimitZ7,
8682
8876
  },
8683
- 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8684
- 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8685
- 704 => {
8686
- Name => 'MovieFlickerReduction',
8687
- PrintConv => {
8688
- 0 => 'Auto',
8689
- 1 => '50Hz',
8690
- 2 => '60Hz',
8691
- },
8692
- },
8693
- 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, , Unknown => 1},
8694
- 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8695
- 710 => {
8696
- Name => 'MovieAFAreaMode',
8697
- PrintConv => {
8698
- 1 => 'Single',
8699
- 3 => 'Wide (S)',
8700
- 4 => 'Wide (L)',
8701
- 6 => 'Auto',
8702
- 11 => 'Subject Tracking',
8703
- },
8704
- },
8705
- 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1},
8706
- 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8707
- 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'On', 2 => 'On' }, Unknown => 1 }, #not sure why the unusal mapping with 2 => 'On'
8708
- 720 => { Name => 'MicrophoneSensitivity', Unknown => 1}, #1-20
8709
- 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8877
+ 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
8878
+ 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
8879
+ 704 => { Name => 'MovieFlickerReduction', PrintConv => \%movieFlickerReductionZ9 },
8880
+ 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, Unknown => 1 },
8881
+ 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
8882
+ 710 => { Name => 'MovieAFAreaMode', PrintConv => \%aFAreaModeZ9 },
8883
+ 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1 },
8884
+ 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8885
+ 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'Auto', 2 => 'Manual' }, Unknown => 1 },
8886
+ 720 => { Name => 'MicrophoneSensitivity', Unknown => 1 }, #1-20
8887
+ 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8710
8888
  724 => { Name => 'MicrophoneFrequencyResponse', PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
8711
- 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
8712
- 748 => {
8713
- Name => 'MovieToneMap',
8714
- Unknown => 1,
8715
- PrintConv => {
8716
- 0 => 'SDR',
8717
- 1 => 'HLG',
8718
- 2 => 'N-Log',
8719
- },
8720
- },
8721
- 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8722
- 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8723
- 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
8724
- 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
8725
- 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1},
8889
+ 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
8890
+ 748 => { Name => 'MovieToneMap', PrintConv => \%movieToneMapZ9, Unknown => 1 },
8891
+ 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
8892
+ 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
8893
+ 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
8894
+ 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
8895
+ 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1 },
8726
8896
  799 => {
8727
8897
  Name => 'CustomSettingsZ9',
8728
8898
  Format => 'undef[608]',
8729
8899
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' },
8730
8900
  },
8731
- 1426 => {
8732
- Name => 'Language',
8733
- Unknown => 1,
8734
- PrintConv => {
8735
- 4 => 'English',
8736
- 5 => 'Spanish',
8737
- 7 => 'French',
8738
- },
8739
- },
8740
- 1428 => {
8741
- Name => 'TimeZone',
8742
- PrintConv => {
8743
- 5 => '+09:00 (Tokyo)',
8744
- 6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8745
- 10 => '+05:45 (Kathmandu)',
8746
- 11 => '+05:30 (New Dehli)',
8747
- 16 => '+03:00 (Moscow, Nairobi)',
8748
- 15 => '+02:00 (Athens)',
8749
- 16 => '+01:00 (Madrid, Paris, Berlin)',
8750
- 17 => '+02:00 (Athens, Helsinki)',
8751
- 18 => '+00:00 (London)',
8752
- 19 => '+00:00', #PH (unknown city)
8753
- 22 => '-03:00 (Buenos Aires, Sao Paulo)',
8754
- 24 => '-04:00 (Manaus, Caracas)',
8755
- 25 => '-05:00 (New York, Toronto, Lima)',
8756
- 26 => '-06:00 (Chicago, Mexico City)',
8757
- 27 => '-07:00 (Denver)',
8758
- 28 => '-08:00 (Los Angeles, Vancouver)',
8759
- 29 => '-09:00 (Anchorage)',
8760
- 30 => '-10:00 (Hawaii)',
8761
- },
8762
- },
8763
- 1434 => {Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1}, # settings: -5 to +5
8764
- 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
8765
- 1552 => {
8766
- Name => 'HDMIOutputResolution',
8767
- PrintConv => {
8768
- 0 => 'Auto',
8769
- 1 => '4320p',
8770
- 2 => '2160p',
8771
- 3 => '1080p',
8772
- #4 => '1080i',
8773
- 5 => '720p',
8774
- #6 => '576p',
8775
- #7 => '480p',
8776
- },
8777
- },
8901
+ 1426 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
8902
+ 1428 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
8903
+ 1434 => { Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1 }, # settings: -5 to +5
8904
+ 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
8905
+ 1552 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
8778
8906
  1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
8779
8907
  1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
8780
8908
  1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
@@ -8783,6 +8911,177 @@ my %nikonFocalConversions = (
8783
8911
  1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
8784
8912
  1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
8785
8913
  );
8914
+ %Image::ExifTool::Nikon::MenuSettingsZ9Firmware3 = ( #starts at Offset26 + 248
8915
+ %binaryDataAttrs,
8916
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8917
+ DATAMEMBER => [ 154, 204, 208, 248, 554 ],
8918
+ IS_SUBDIR => [ 847 ],
8919
+ NOTES => 'These tags are used by the Z9 firmware 3.00.',
8920
+ 154 => {
8921
+ Name => 'MultipleExposureMode',
8922
+ RawConv => '$$self{MultipleExposureMode} = $val',
8923
+ PrintConv => \%multipleExposureModeZ9,
8924
+ },
8925
+ 156 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
8926
+ 204 => {
8927
+ Name => 'Intervals',
8928
+ Format => 'int32u',
8929
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
8930
+ Condition => '$$self{IntervalShooting} > 0',
8931
+ },
8932
+ 208 => {
8933
+ Name => 'ShotsPerInterval',
8934
+ Format => 'int32u',
8935
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8936
+ Condition => '$$self{IntervalShooting} > 0',
8937
+ },
8938
+ 248 => {
8939
+ Name => 'FocusShiftNumberShots', #1-300
8940
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
8941
+ Condition => '$$self{FocusShiftShooting} > 0',
8942
+ },
8943
+ 252 => {
8944
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8945
+ Condition => '$$self{FocusShiftShooting} > 0',
8946
+ },
8947
+ 256 => {
8948
+ Name => 'FocusShiftInterval',
8949
+ Condition => '$$self{FocusShiftShooting} > 0',
8950
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8951
+ },
8952
+ 260 => {
8953
+ Name => 'FocusShiftExposureLock',
8954
+ Unknown => 1,
8955
+ PrintConv => \%offOn,
8956
+ Condition => '$$self{FocusShiftShooting} > 0',
8957
+ },
8958
+ 290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
8959
+ 292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
8960
+ 328 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
8961
+ 342 => { Name => 'AutoISO', PrintConv => \%offOn },
8962
+ 344 => {
8963
+ Name => 'ISOAutoHiLimit',
8964
+ Format => 'int16u',
8965
+ Unknown => 1,
8966
+ ValueConv => '($val-104)/8',
8967
+ ValueConvInv => '8 * ($val + 104)',
8968
+ PrintConv => \%iSOAutoHiLimitZ7,
8969
+ },
8970
+ 346 => {
8971
+ Name => 'ISOAutoFlashLimit',
8972
+ Format => 'int16u',
8973
+ Unknown => 1,
8974
+ ValueConv => '($val-104)/8',
8975
+ ValueConvInv => '8 * ($val + 104)',
8976
+ PrintConv => \%iSOAutoHiLimitZ7,
8977
+ },
8978
+ 354 => {
8979
+ Name => 'ISOAutoShutterTime', # shutter speed is 2 ** (-$val/24)
8980
+ ValueConv => '$val / 8',
8981
+ Format => 'int16s',
8982
+ PrintConv => \%iSOAutoShutterTimeZ9,
8983
+ },
8984
+ 436 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
8985
+ 438 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, # value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8986
+ 440 => { Name => 'FlickerReductionShooting',PrintConv => \%offOn },
8987
+ 548 => { Name => 'AFAreaMode', PrintConv => \%aFAreaModeZ9},
8988
+ 550 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8989
+ 554 => {
8990
+ Name => 'BracketSet',
8991
+ RawConv => '$$self{BracketSet} = $val',
8992
+ PrintConv => \%bracketSetZ9,
8993
+ },
8994
+ 556 => {
8995
+ Name => 'BracketProgram',
8996
+ Condition => '$$self{BracketSet} < 3',
8997
+ Notes => 'AE and/or Flash Bracketing',
8998
+ PrintConv => \%bracketProgramZ9,
8999
+ },
9000
+ 558 => {
9001
+ Name => 'BracketIncrement',
9002
+ Condition => '$$self{BracketSet} < 3',
9003
+ Notes => 'AE and/or Flash Bracketing',
9004
+ PrintConv => \%bracketIncrementZ9,
9005
+ },
9006
+ 576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
9007
+ 592 => { Name => 'DXCropAlert', PrintConv => \%offOn },
9008
+ 594 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
9009
+ 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9010
+ 646 => {
9011
+ Name => 'MovieImageArea',
9012
+ Unknown => 1,
9013
+ Mask => 0x01, # without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
9014
+ PrintConv => \%imageAreaZ9b,
9015
+ },
9016
+ 656 => { Name => 'MovieType', PrintConv => \%movieTypeZ9, Unknown => 1 },
9017
+ 658 => {
9018
+ Name => 'MovieISOAutoHiLimit',
9019
+ Format => 'int16u',
9020
+ Unknown => 1,
9021
+ ValueConv => '($val-104)/8',
9022
+ ValueConvInv => '8 * ($val + 104)',
9023
+ PrintConv => \%iSOAutoHiLimitZ7,
9024
+ },
9025
+ 660 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1 },
9026
+ 662 => {
9027
+ Name => 'MovieISOAutoManualMode',
9028
+ Format => 'int16u',
9029
+ Unknown => 1,
9030
+ ValueConv => '($val-104)/8',
9031
+ ValueConvInv => '8 * ($val + 104)',
9032
+ PrintConv => \%iSOAutoHiLimitZ7,
9033
+ },
9034
+ 736 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
9035
+ 738 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
9036
+ 744 => { Name => 'MovieFlickerReduction', PrintConv => \%movieFlickerReductionZ9 },
9037
+ 746 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, Unknown => 1 },
9038
+ 748 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
9039
+ 750 => { Name => 'MovieAFAreaMode', PrintConv => \%aFAreaModeZ9 },
9040
+ 752 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1 },
9041
+ 756 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9042
+ 758 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'Auto', 2 => 'Manual' }, Unknown => 1 },
9043
+ 760 => { Name => 'MicrophoneSensitivity', Unknown => 1 }, # 1-20
9044
+ 762 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9045
+ 764 => { Name => 'MicrophoneFrequencyResponse',PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
9046
+ 766 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
9047
+ 788 => { Name => 'MovieToneMap', PrintConv => \%movieToneMapZ9, Unknown => 1 },
9048
+ 794 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
9049
+ 796 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
9050
+ 802 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
9051
+ 803 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
9052
+ 804 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1 },
9053
+ 812 => { Name => 'MovieHighResZoom', PrintConv => \%offOn, Unknown => 1 },
9054
+ 847 => {
9055
+ Name => 'CustomSettingsZ9',
9056
+ Format => 'undef[608]',
9057
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' },
9058
+ },
9059
+ 1474 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9060
+ 1476 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
9061
+ 1482 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
9062
+ 1504 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
9063
+ 1600 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
9064
+ 1613 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
9065
+ 1620 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
9066
+ 1621 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
9067
+ 1656 => { Name => 'EnergySavingMode', PrintConv =>\%offOn, Unknown => 1 },
9068
+ 1680 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
9069
+ 1684 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
9070
+ 1693 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
9071
+ 1754 => {
9072
+ Name => 'FocusShiftAutoReset',
9073
+ Unknown => 1,
9074
+ PrintConv => \%offOn,
9075
+ Condition => '$$self{FocusShiftShooting} > 0',
9076
+ },
9077
+ #1824 ReleaseTimingIndicatorTypeADelay CSd14-b 0 => '1/200' ... 15 => '1/6'
9078
+ #1826 VerticalISOButton CSf2
9079
+ #1828 ExposureCompensationButton CSf2
9080
+ #1830 ISOButton CSf2
9081
+ #1890 ViewModeShowEffectsOfSettings CSd9-a 0=>'Always', 1=> 'Only When Flash Not Used'
9082
+ #1892 DispButton CSf2
9083
+ #1936 FocusPointDisplayOption3DTrackingColor CSa11-d 0=> 'White', 1= => 'Red'
9084
+ );
8786
9085
 
8787
9086
  # Flash information (ref JD)
8788
9087
  %Image::ExifTool::Nikon::FlashInfo0100 = (
@@ -10076,6 +10375,36 @@ my %nikonFocalConversions = (
10076
10375
  },
10077
10376
  );
10078
10377
 
10378
+ # Multi exposure2 / image overlay information (ref 39)
10379
+ %Image::ExifTool::Nikon::MultiExposure2 = (
10380
+ %binaryDataAttrs,
10381
+ FORMAT => 'int32u',
10382
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
10383
+ 0 => {
10384
+ Name => 'MultiExposureVersion',
10385
+ Format => 'string[4]',
10386
+ Writable => 0,
10387
+ },
10388
+ 1 => {
10389
+ Name => 'MultiExposureMode',
10390
+ PrintConv => {
10391
+ 0 => 'Off',
10392
+ 1 => 'Multiple Exposure',
10393
+ 3 => 'HDR',
10394
+ },
10395
+ },
10396
+ 2 => 'MultiExposureShots',
10397
+ 3 => {
10398
+ Name => 'MultiExposureOverlayMode',
10399
+ PrintConv => {
10400
+ 0 => 'Add',
10401
+ 1 => 'Average',
10402
+ 2 => 'Light',
10403
+ 3 => 'Dark',
10404
+ },
10405
+ },
10406
+ );
10407
+
10079
10408
  # HDR information (ref 32)
10080
10409
  %Image::ExifTool::Nikon::HDRInfo = (
10081
10410
  %binaryDataAttrs,
@@ -10084,12 +10413,13 @@ my %nikonFocalConversions = (
10084
10413
  0 => {
10085
10414
  Name => 'HDRInfoVersion',
10086
10415
  Format => 'string[4]',
10416
+ Writable => 0,
10087
10417
  },
10088
10418
  4 => {
10089
10419
  Name => 'HDR',
10090
10420
  PrintConv => {
10091
10421
  0 => 'Off',
10092
- 1 => 'On',
10422
+ 1 => 'On (normal)',
10093
10423
  48 => 'Auto', #PH (NC)
10094
10424
  },
10095
10425
  },
@@ -10127,6 +10457,35 @@ my %nikonFocalConversions = (
10127
10457
  },
10128
10458
  );
10129
10459
 
10460
+ # ref 39 (Z9)
10461
+ %Image::ExifTool::Nikon::HDRInfo2 = (
10462
+ %binaryDataAttrs,
10463
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
10464
+ 0 => {
10465
+ Name => 'HDRInfoVersion', # 0200
10466
+ Format => 'string[4]',
10467
+ Writable => 0,
10468
+ },
10469
+ 4 => {
10470
+ Name => 'HDR',
10471
+ PrintConv => {
10472
+ 0 => 'Off',
10473
+ 1 => 'On (normal)',
10474
+ },
10475
+ },
10476
+ 5 => {
10477
+ Name => 'HDRLevel',
10478
+ PrintConv => {
10479
+ 0 => 'n/a',
10480
+ 1 => 'Normal',
10481
+ 2 => 'Low',
10482
+ 3 => 'High',
10483
+ 4 => 'High+',
10484
+ 5 => 'Auto',
10485
+ },
10486
+ },
10487
+ );
10488
+
10130
10489
  # location information (ref PH)
10131
10490
  %Image::ExifTool::Nikon::LocationInfo = (
10132
10491
  %binaryDataAttrs,
@@ -10847,9 +11206,14 @@ my %nikonFocalConversions = (
10847
11206
  Name => 'LocationInfo',
10848
11207
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
10849
11208
  },
11209
+ 0x200003f => 'WhiteBalanceFineTune',
10850
11210
  # 0x200003f - rational64s[2]: "0 0"
10851
11211
  # 0x2000042 - undef[6]: "0100\x03\0"
10852
11212
  # 0x2000043 - undef[12]: all zeros
11213
+ 0x200004e => {
11214
+ Name => 'NikonSettings',
11215
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
11216
+ },
10853
11217
  0x2000083 => {
10854
11218
  Name => 'LensType',
10855
11219
  # credit to Tom Christiansen (ref 7) for figuring this out...
@@ -11316,7 +11680,7 @@ sub PrintAFPointsGridInv($$$)
11316
11680
  #------------------------------------------------------------------------------
11317
11681
  # Print conversion for relative Left/Right AF points (ref 28)
11318
11682
  # Inputs: 0) column, 1) number of columns
11319
- # Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
11683
+ # Returns: AF point data as a string (e.g. '2L of Center' or 'C' or '3R of Center')
11320
11684
  sub PrintAFPointsLeftRight($$)
11321
11685
  {
11322
11686
  my ($col, $ncol) = @_;
@@ -11329,7 +11693,7 @@ sub PrintAFPointsLeftRight($$)
11329
11693
  #------------------------------------------------------------------------------
11330
11694
  # Print conversion for relative Up/Down AF points (ref 28)
11331
11695
  # Inputs: 0) row, 1) number of rows
11332
- # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
11696
+ # Returns: AF point data as a string (e.g. '2U from Center' or 'C' or '3D from Center')
11333
11697
  sub PrintAFPointsUpDown($$)
11334
11698
  {
11335
11699
  my ($row, $nrow) = @_;