exiftool_vendored 12.38.0 → 12.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +17 -0
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -45
  7. data/bin/exiftool +46 -46
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  11. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  12. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  13. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  14. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  15. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  16. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  17. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  18. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  19. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -4
  23. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  24. data/bin/lib/Image/ExifTool/Canon.pm +1 -1
  25. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  26. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  28. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  29. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  31. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  34. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  37. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  38. data/bin/lib/Image/ExifTool/EXE.pm +1 -1
  39. data/bin/lib/Image/ExifTool/Exif.pm +9 -1
  40. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  41. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIR.pm +16 -4
  44. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  46. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  47. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  48. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  50. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  52. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  55. data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  56. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  57. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  58. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  59. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  60. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  61. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  62. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  63. data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  64. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  66. data/bin/lib/Image/ExifTool/Import.pm +1 -1
  67. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  68. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  69. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  70. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  71. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  72. data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  73. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  74. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  75. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  76. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  77. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  79. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  81. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  96. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  97. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  98. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  99. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  100. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  101. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  102. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  103. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  104. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  106. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  110. data/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  111. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  112. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  114. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  115. data/bin/lib/Image/ExifTool/Nikon.pm +897 -184
  116. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  117. data/bin/lib/Image/ExifTool/NikonCustom.pm +519 -6
  118. data/bin/lib/Image/ExifTool/NikonSettings.pm +17 -18
  119. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  120. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  121. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  123. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  124. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  125. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  126. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  127. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  128. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  129. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  130. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  131. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  132. data/bin/lib/Image/ExifTool/PNG.pm +28 -8
  133. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  135. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  136. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  138. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  139. data/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  140. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  144. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  145. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  147. data/bin/lib/Image/ExifTool/QuickTime.pm +1 -1
  148. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +14 -3
  149. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  150. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  151. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  152. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  153. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  155. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  156. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  158. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  159. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  160. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  161. data/bin/lib/Image/ExifTool/Shift.pl +3 -1
  162. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  164. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  166. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  168. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  169. data/bin/lib/Image/ExifTool/TagLookup.pm +4560 -4474
  170. data/bin/lib/Image/ExifTool/TagNames.pod +320 -21
  171. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  172. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  175. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  176. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  177. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  178. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  179. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  180. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  181. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  182. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  183. data/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  184. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  185. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  186. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +2 -1
  187. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  188. data/bin/lib/Image/ExifTool/Writer.pl +6 -5
  189. data/bin/lib/Image/ExifTool/XMP.pm +40 -22
  190. data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
  191. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  192. data/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  193. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  194. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  195. data/bin/lib/Image/ExifTool.pm +11 -3
  196. data/bin/lib/Image/ExifTool.pod +64 -63
  197. data/bin/perl-Image-ExifTool.spec +43 -43
  198. data/lib/exiftool_vendored/version.rb +1 -1
  199. metadata +2 -2
@@ -61,8 +61,9 @@ use vars qw($VERSION %nikonLensIDs %nikonTextEncoding);
61
61
  use Image::ExifTool qw(:DataAccess :Utils);
62
62
  use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
+ use Image::ExifTool::XMP;
64
65
 
65
- $VERSION = '4.03';
66
+ $VERSION = '4.04';
66
67
 
67
68
  sub LensIDConv($$$);
68
69
  sub ProcessNikonAVI($$$);
@@ -508,6 +509,7 @@ sub GetAFPointGrid($$;$);
508
509
  '77 44 60 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 APO DG D OS',
509
510
  '48 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
510
511
  'F3 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
512
+ '26 45 68 8E 34 42 1C 02' => 'Sigma 100-300mm F4.5-6.7 DL', #30
511
513
  '48 54 6F 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
512
514
  '7A 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
513
515
  'FA 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM', #https://exiftool.org/forum/index.php/topic,2787.0.html
@@ -702,6 +704,7 @@ sub GetAFPointGrid($$;$);
702
704
  #
703
705
  '9A 4C 50 50 14 14 9C 06' => 'Yongnuo YN50mm F1.8N',
704
706
  '9F 48 48 48 24 24 A1 06' => 'Yongnuo YN40mm F2.8N', #30
707
+ '9F 54 68 68 18 18 A2 06' => 'Yongnuo YN100mm F2N', #30
705
708
  #
706
709
  '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC',
707
710
  #
@@ -754,6 +757,7 @@ my %flashFirmware = (
754
757
  '5 2' => '5.02 (SB-900)',
755
758
  '6 1' => '6.01 (SB-700)', #https://exiftool.org/forum/index.php/topic,5034.0.html
756
759
  '7 1' => '7.01 (SB-910)', #PH
760
+ '14 3' => '14.03 (SB-5000)', #28
757
761
  OTHER => sub {
758
762
  my ($val, $inv) = @_;
759
763
  return sprintf('%d.%.2d (Unknown model)', split(' ', $val)) unless $inv;
@@ -810,6 +814,124 @@ my %flashControlMode = (
810
814
  0x07 => 'Repeating Flash',
811
815
  );
812
816
 
817
+ my %activeDLightingZ7 = (
818
+ 0 => 'Off',
819
+ 2 => 'Low',
820
+ 3 => 'Normal',
821
+ 4 => 'High',
822
+ 5 => 'Extra High',
823
+ );
824
+
825
+ my %flashControlModeZ7 = (
826
+ 0 => 'TTL',
827
+ 1 => 'Auto External Flash',
828
+ 2 => 'GN (distance priority)',
829
+ 3 => 'Manual',
830
+ 4 => 'Repeating Flash',
831
+ );
832
+
833
+ my %flashRemoteControlZ7 = (
834
+ 0 => 'Group',
835
+ 1 => 'Quick Wireless',
836
+ 2 => 'Remote Repeating',
837
+ );
838
+
839
+ my %flashWirelessOptionZ7 = (
840
+ 0 => 'Off',
841
+ 1 => 'Optical AWL',
842
+ 2 => 'Optical/Radio AWL',
843
+ 3 => 'Radio AWL',
844
+ );
845
+
846
+ my %focusModeZ7 = (
847
+ 0 => 'Manual',
848
+ 1 => 'AF-S',
849
+ 2 => 'AF-C',
850
+ 4 => 'AF-F', # full frame
851
+ );
852
+
853
+ my %infoZSeries = (
854
+ Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i',
855
+ Notes => 'Z Series cameras thru Decemeber 2021',
856
+ );
857
+ my %iSOAutoHiLimitZ7 = (
858
+ 0 => 'ISO 64',
859
+ 1 => 'ISO 80',
860
+ 2 => 'ISO 100',
861
+ 3 => 'ISO 125',
862
+ 4 => 'ISO 160',
863
+ 5 => 'ISO 200',
864
+ 6 => 'ISO 250',
865
+ 7 => 'ISO 320',
866
+ 8 => 'ISO 400',
867
+ 9 => 'ISO 500',
868
+ 10 => 'ISO 640',
869
+ 11 => 'ISO 800',
870
+ 12 => 'ISO 1000',
871
+ 13 => 'ISO 1250',
872
+ 14 => 'ISO 1600',
873
+ 15 => 'ISO 2000',
874
+ 16 => 'ISO 2500',
875
+ 17 => 'ISO 3200',
876
+ 18 => 'ISO 4000',
877
+ 19 => 'ISO 5000',
878
+ 20 => 'ISO 6400',
879
+ 21 => 'ISO 8000',
880
+ 22 => 'ISO 10000',
881
+ 23 => 'ISO 12800',
882
+ 24 => 'ISO 16000',
883
+ 25 => 'ISO 20000',
884
+ 26 => 'ISO 25600',
885
+ 27 => 'ISO Hi 0.3',
886
+ 28 => 'ISO Hi 0.7',
887
+ 29 => 'ISO Hi 1.0',
888
+ 32 => 'ISO Hi 2.0',
889
+ );
890
+
891
+ my %meteringModeZ7 = (
892
+ 0 => 'Matrix',
893
+ 1 => 'Center',
894
+ 2 => 'Spot',
895
+ 3 => 'Highlight'
896
+ );
897
+
898
+ my %movieFrameRateZ7 = (
899
+ 0 => '120p',
900
+ 1 => '100p',
901
+ 2 => '60p',
902
+ 3 => '50p',
903
+ 4 => '30p',
904
+ 5 => '25p',
905
+ 6 => '24p',
906
+ );
907
+
908
+ my %offLowNormalHighZ7 = (
909
+ 0 => 'Off',
910
+ 1 => 'Low',
911
+ 2 => 'Normal',
912
+ 3 => 'High',
913
+ );
914
+
915
+ my %movieFrameSizeZ9 = (
916
+ 1 => '1920x1080',
917
+ 2 => '3840x2160',
918
+ 3 => '7680x4320',
919
+ );
920
+
921
+ my %subjectDetectionZ9 = (
922
+ 0 => 'Off',
923
+ 1 => 'Auto',
924
+ 2 => 'People',
925
+ 3 => 'Animals',
926
+ 4 => 'Vehicles',
927
+ );
928
+
929
+ my %vRModeZ9 = (
930
+ 0 => 'Off',
931
+ 1 => 'Normal',
932
+ 2 => 'Sport',
933
+ );
934
+
813
935
  my %retouchValues = ( #PH
814
936
  0 => 'None',
815
937
  3 => 'B & W',
@@ -1095,6 +1217,20 @@ my %binaryDataAttrs = (
1095
1217
  FIRST_ENTRY => 0,
1096
1218
  );
1097
1219
 
1220
+ my %base64bin = ( ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' );
1221
+ my %base64int32u = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); unpack("V",$$val)' );
1222
+ my %base64bytes = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); join(".",unpack("C*",$$val))' );
1223
+ my %base64coord = (
1224
+ ValueConv => q{
1225
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1226
+ my $saveOrder = GetByteOrder();
1227
+ SetByteOrder('II');
1228
+ $val = GetDouble($val,0) + GetDouble($val,8)/60 + GetDouble($val,16)/3600;
1229
+ SetByteOrder($saveOrder);
1230
+ return $val;
1231
+ },
1232
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
1233
+ );
1098
1234
  # Nikon maker note tags
1099
1235
  %Image::ExifTool::Nikon::Main = (
1100
1236
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikon,
@@ -1912,14 +2048,15 @@ my %binaryDataAttrs = (
1912
2048
  ByteOrder => 'BigEndian',
1913
2049
  },
1914
2050
  },
1915
- { # (Z6_2 firmware version 1.00 and Z7_2 firmware versions 1.00 & 1.01, ref 28)
2051
+ { # (Z6_2 firmware version 1.00 and Z7II firmware versions 1.00 & 1.01, ref 28)
1916
2052
  # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc
1917
2053
  Condition => '$$valPt =~ /^080[01234]/',
1918
- Name => 'ShotInfoZ7_2',
2054
+ Name => 'ShotInfoZ7II',
1919
2055
  SubDirectory => {
1920
- TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7_2',
2056
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',
1921
2057
  DecryptStart => 4,
1922
- DecryptLen => 0xcea6 + 1050, # thru decoded parts of Offset31
2058
+ # TODO: eventually set the length dynamically according to actual offsets!
2059
+ DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II
1923
2060
  ByteOrder => 'LittleEndian',
1924
2061
  },
1925
2062
  },
@@ -1929,11 +2066,12 @@ my %binaryDataAttrs = (
1929
2066
  SubDirectory => {
1930
2067
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
1931
2068
  DecryptStart => 4,
1932
- DecryptLen => 0xeb5b + 1050, # thru decoded parts of Offset27
2069
+ # TODO: eventually set the length dynamically according to actual offsets!
2070
+ DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
1933
2071
  ByteOrder => 'LittleEndian',
1934
2072
  },
1935
2073
  },
1936
- { # D7100=0227, Z6/Z7=0800
2074
+ { # D7100=0227
1937
2075
  Condition => '$$valPt =~ /^0[28]/',
1938
2076
  Name => 'ShotInfo02xx',
1939
2077
  SubDirectory => {
@@ -2164,7 +2302,7 @@ my %binaryDataAttrs = (
2164
2302
  },
2165
2303
  },
2166
2304
  {
2167
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
2305
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
2168
2306
  Name => 'LensData0800',
2169
2307
  SubDirectory => {
2170
2308
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -2299,8 +2437,8 @@ my %binaryDataAttrs = (
2299
2437
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' },
2300
2438
  },
2301
2439
  {
2302
- Name => 'FlashInfo0300', # (Z7_2)
2303
- Condition => '$$valPt =~ /^0300/',
2440
+ Name => 'FlashInfo0300', # (Z7II)
2441
+ Condition => '$$valPt =~ /^030[01]/',
2304
2442
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0300' },
2305
2443
  },
2306
2444
  {
@@ -2373,11 +2511,15 @@ my %binaryDataAttrs = (
2373
2511
  PrintConv => '$self->ConvertDateTime($val)',
2374
2512
  PrintConvInv => '$self->InverseDateTime($val,0)',
2375
2513
  },
2376
- 0x00b7 => { #JD
2514
+ 0x00b7 => [{
2515
+ Name => 'AFInfo2',
2516
+ Condition => '$$self{Model} =~ /^NIKON Z 9\b/i', #AFInfo2Version 0400
2517
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2V0400' },
2518
+ },{ #JD
2377
2519
  Name => 'AFInfo2',
2378
2520
  # (this structure may be byte swapped when rewritten by CaptureNX)
2379
2521
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' },
2380
- },
2522
+ }],
2381
2523
  0x00b8 => [{ #PH
2382
2524
  Name => 'FileInfo',
2383
2525
  # unfortunately, some newer models write this as little-endian
@@ -2638,15 +2780,23 @@ my %binaryDataAttrs = (
2638
2780
  },
2639
2781
  },
2640
2782
  # 5 - values: 0, 1 (VR On), 2 (VR Off)
2641
- 6 => {
2783
+ 6 => [{
2642
2784
  Name => 'VRMode',
2643
2785
  PrintConv => {
2644
- 0 => 'Normal', # (Z7 gives this value for "off" - PH)
2786
+ 0 => 'Off',
2787
+ 1 => 'Sport',
2788
+ 3 => 'Normal',
2789
+ },
2790
+ %infoZSeries
2791
+ },{
2792
+ Name => 'VRMode',
2793
+ PrintConv => {
2794
+ 0 => 'Normal',
2645
2795
  1 => 'On (1)', #PH (NC)
2646
2796
  2 => 'Active', # (1J1)
2647
2797
  3 => 'Sport', #PH (Z7)
2648
2798
  },
2649
- },
2799
+ }],
2650
2800
  # 7 - values: 0, 1
2651
2801
  );
2652
2802
 
@@ -3480,6 +3630,10 @@ my %binaryDataAttrs = (
3480
3630
  201 => 'Wide-area AF', #28 (D6)
3481
3631
  202 => 'Face-priority AF', #28 (D6)
3482
3632
  203 => 'Subject-tracking AF', #28 (D6)
3633
+ 204 => 'Dynamic Area (S)', #28 (Z9)
3634
+ 205 => 'Dynamic Area (M)', #28 (Z9)
3635
+ 206 => 'Dynamic Area (L)', #28 (Z9)
3636
+ 207 => '3D-tracking', #28 (Z9)
3483
3637
  },
3484
3638
  },
3485
3639
  ],
@@ -4007,6 +4161,47 @@ my %binaryDataAttrs = (
4007
4161
  },
4008
4162
  );
4009
4163
 
4164
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4165
+ %binaryDataAttrs,
4166
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4167
+ DATAMEMBER => [ 0 ],
4168
+ 0 => {
4169
+ Name => 'AFInfo2Version',
4170
+ Format => 'undef[4]',
4171
+ Writable => 0,
4172
+ RawConv => '$$self{AFInfo2Version} = $val',
4173
+ },
4174
+ 0x3e => {
4175
+ Name => 'AFImageWidth',
4176
+ Format => 'int16u',
4177
+ },
4178
+ 0x40 => {
4179
+ Name => 'AFImageHeight',
4180
+ Format => 'int16u',
4181
+ },
4182
+ 0x43 => {
4183
+ Name => 'FocusPositionHoriontal',
4184
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4185
+ },
4186
+ 0x45 => {
4187
+ Name => 'FocusPositionVertical',
4188
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4189
+ },
4190
+ 0x46 => {
4191
+ Name => 'AFAreaWidth',
4192
+ Format => 'int16u',
4193
+ Notes => 'size of AF area in AFImage pixels',
4194
+ RawConv => '$val ? $val : undef',
4195
+ },
4196
+ 0x48 => {
4197
+ Name => 'AFAreaHeight',
4198
+ Format => 'int16u',
4199
+ RawConv => '$val ? $val : undef',
4200
+ }
4201
+ # 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)
4202
+ #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).
4203
+ );
4204
+
4010
4205
  # Nikon AF fine-tune information (ref 28)
4011
4206
  %Image::ExifTool::Nikon::AFTune = (
4012
4207
  %binaryDataAttrs,
@@ -4772,6 +4967,7 @@ my %nikonFocalConversions = (
4772
4967
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4773
4968
  24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
4774
4969
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4970
+ 28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4775
4971
  29 => 'Nikkor Z 28mm f/2.8', #IB
4776
4972
  },
4777
4973
  },
@@ -7284,9 +7480,7 @@ my %nikonFocalConversions = (
7284
7480
  WRITABLE => 1,
7285
7481
  FIRST_ENTRY => 0,
7286
7482
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7287
- NOTES => q{
7288
- These tags are extracted from encrypted data in images from the D4S.
7289
- },
7483
+ NOTES => 'These tags are extracted from encrypted data in images from the D4S.',
7290
7484
  0x00 => {
7291
7485
  Name => 'ShotInfoVersion',
7292
7486
  Format => 'string[4]',
@@ -7585,19 +7779,19 @@ my %nikonFocalConversions = (
7585
7779
  # note: DecryptLen currently set to 0x3697
7586
7780
  );
7587
7781
 
7588
- # shot information for the Z7_2 firmware 1.00 (encrypted) - ref 28
7589
- %Image::ExifTool::Nikon::ShotInfoZ7_2 = (
7782
+ # shot information for the Z7II firmware 1.00 (encrypted) - ref 28
7783
+ %Image::ExifTool::Nikon::ShotInfoZ7II = (
7590
7784
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7591
7785
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7592
7786
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7593
7787
  VARS => { ID_LABEL => 'Index' },
7594
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x30, 0x38, 0x98, 0xa0, 0x75e7,
7595
- 0x760c, 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7788
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x98, 0xa0, 0x75e7, 0x760c,
7789
+ 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7596
7790
  IS_SUBDIR => [ 0xceb8 ],
7597
7791
  WRITABLE => 1,
7598
7792
  FIRST_ENTRY => 0,
7599
7793
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7600
- NOTES => 'These tags are extracted from encrypted data in images from the Z7_2.',
7794
+ NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
7601
7795
  0x00 => {
7602
7796
  Name => 'ShotInfoVersion',
7603
7797
  Format => 'string[4]',
@@ -7614,14 +7808,12 @@ my %nikonFocalConversions = (
7614
7808
  Name => 'FirmwareVersion2',
7615
7809
  Format => 'string[8]',
7616
7810
  Writable => 0,
7617
- RawConv => '$$self{FirmwareVersion2} = $val',
7618
7811
  Hidden => 1,
7619
7812
  },
7620
7813
  0x18 => {
7621
7814
  Name => 'FirmwareVersion3',
7622
7815
  Format => 'string[8]',
7623
7816
  Writable => 0,
7624
- RawConv => '$$self{FirmwareVersion3} = $val',
7625
7817
  Hidden => 1,
7626
7818
  },
7627
7819
  0x24 => {
@@ -7663,12 +7855,12 @@ my %nikonFocalConversions = (
7663
7855
  Hidden => 1,
7664
7856
  RawConv => '$$self{Offset31} = $val || 0x10000000; undef', # (ignore if 0)
7665
7857
  },
7666
- ### 0x75e8 - Offset3 info start (Z7_2 firmware 1.30)
7858
+ ### 0x75e8 - Offset3 info start (Z7II firmware 1.30)
7667
7859
  0x75e7 => {
7668
7860
  Name => 'Hook1',
7669
7861
  Hidden => 1,
7670
7862
  RawConv => 'undef',
7671
- # account for variable location of Offset5 data
7863
+ # account for variable location of Offset3 data
7672
7864
  Hook => '$varSize = $$self{Offset3} - 0x75e8',
7673
7865
  },
7674
7866
  0x760c => {
@@ -7690,7 +7882,7 @@ my %nikonFocalConversions = (
7690
7882
  Format => 'int16u',
7691
7883
  Hidden => 1,
7692
7884
  },
7693
- ### 0x7f00 - Offset5 info start (Z7_2 firmware 1.30)
7885
+ ### 0x7f00 - Offset5 info start (Z7II firmware 1.30)
7694
7886
  0x7eff => {
7695
7887
  Name => 'Hook2',
7696
7888
  Hidden => 1,
@@ -7714,7 +7906,7 @@ my %nikonFocalConversions = (
7714
7906
  return "$color $brightness"
7715
7907
  },
7716
7908
  },
7717
- ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7909
+ ### 0xce32 - OrientationInfo start (Z7II firmware 1.00)
7718
7910
  0xce31 => {
7719
7911
  Name => 'Hook3',
7720
7912
  Hidden => 1,
@@ -7757,26 +7949,27 @@ my %nikonFocalConversions = (
7757
7949
  # account for variable location of Offset31 data
7758
7950
  Hook => '$varSize = $$self{Offset31} - 0xcea6',
7759
7951
  },
7760
- ### 0xcea6 - Offset31 info start (Z7_2 firmware 1.30)
7952
+ ### 0xcea6 - Offset31 info start (Z7II firmware 1.30)
7761
7953
  0xceb6 => {
7762
- Name => 'ZMenuSettingsOffset',
7763
- # offset to ZMenuSettings is relative to start of Offset31 block
7764
- RawConv => '$$self{ZMenuSettingsOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
7954
+ Name => 'MenuSettingsZ7IIOffset',
7955
+ # offset to MenuSettingsZ7II is relative to start of Offset31 block
7956
+ RawConv => '$$self{MenuSettingsZ7IIOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
7765
7957
  },
7766
7958
  0xceb7 => {
7767
7959
  Name => 'Hook5',
7768
7960
  Hidden => 1,
7769
7961
  RawConv => 'undef',
7770
7962
  # account for variable location of Offset5 data
7771
- Hook => '$varSize = $$self{ZMenuSettingsOffset} - 0xceb8',
7963
+ Hook => '$varSize = $$self{MenuSettingsZ7IIOffset} - 0xceb8',
7772
7964
  },
7773
- 0xceb8 => {
7774
- Name => 'ZMenuSettings',
7965
+ 0xceb8 => { # (this is 0xd04e for the Z50)
7966
+ Name => 'MenuSettingsZ7II',
7967
+ Format => 'undef[860]',
7775
7968
  SubDirectory => {
7776
- TagTable => 'Image::ExifTool::Nikon::ZMenuSettings',
7969
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II',
7777
7970
  },
7778
7971
  }
7779
- # note: DecryptLen currently set to 0xcea6 + 1050
7972
+ # note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e)
7780
7973
  );
7781
7974
 
7782
7975
  # shot information for the Z9 firmware 1.00 (encrypted) - ref 28
@@ -7785,7 +7978,9 @@ my %nikonFocalConversions = (
7785
7978
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7786
7979
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7787
7980
  VARS => { ID_LABEL => 'Index' },
7788
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x84, 0xeaea],
7981
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7982
+ 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
7983
+ IS_SUBDIR => [ 0xec4b ],
7789
7984
  WRITABLE => 1,
7790
7985
  FIRST_ENTRY => 0,
7791
7986
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7806,14 +8001,12 @@ my %nikonFocalConversions = (
7806
8001
  Name => 'FirmwareVersion2',
7807
8002
  Format => 'string[8]',
7808
8003
  Writable => 0,
7809
- RawConv => '$$self{FirmwareVersion2} = $val',
7810
8004
  Hidden => 1,
7811
8005
  },
7812
8006
  0x18 => {
7813
8007
  Name => 'FirmwareVersion3',
7814
8008
  Format => 'string[8]',
7815
8009
  Writable => 0,
7816
- RawConv => '$$self{FirmwareVersion3} = $val',
7817
8010
  Hidden => 1,
7818
8011
  },
7819
8012
  0x24 => {
@@ -7823,23 +8016,90 @@ my %nikonFocalConversions = (
7823
8016
  Writable => 0,
7824
8017
  Hidden => 1,
7825
8018
  },
8019
+ 0x30 => {
8020
+ Name => 'Offset3', #offset3 - length 2528 (Z9 firmware 1.0)
8021
+ DataMember => 'Offset3',
8022
+ Format => 'int32u',
8023
+ Writable => 0,
8024
+ Hidden => 1,
8025
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
8026
+ },
8027
+ 0x38 => {
8028
+ Name => 'Offset5', #offset5 - length 2488 (Z9 firmware 1.0)
8029
+ DataMember => 'Offset5',
8030
+ Format => 'int32u',
8031
+ Writable => 0,
8032
+ Hidden => 1,
8033
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
8034
+ },
7826
8035
  0x84 => {
7827
- Name => 'OrientationOffset', #offset24 - length 108
8036
+ Name => 'OrientationOffset', #offset24 - length 108 (Z9 firmware 1.0)
7828
8037
  DataMember => 'OrientationOffset',
7829
8038
  Format => 'int32u',
7830
8039
  Writable => 0,
7831
8040
  Hidden => 1,
7832
8041
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7833
8042
  },
7834
- ### 0xce32 - OrientationInfo start (Z9 firmware 1.00)
8043
+ 0x8c => {
8044
+ Name => 'Offset26', #offset26 - length 1895 (Z9 firmware 1.0)
8045
+ DataMember => 'Offset26',
8046
+ Format => 'int32u',
8047
+ Writable => 0,
8048
+ Hidden => 1,
8049
+ RawConv => '$$self{Offset26} = $val || 0x10000000; undef', # (ignore if 0)
8050
+ },
8051
+ ### 0x6c70 - Offset3 info start (Z9 firmware 1.00)
8052
+ 0x6c6f => {
8053
+ Name => 'Offset3Hook',
8054
+ Hidden => 1,
8055
+ RawConv => 'undef',
8056
+ # account for variable location of Offset3 data
8057
+ Hook => '$varSize = $$self{Offset3} - 0x6c70',
8058
+ },
8059
+ 0x6c98 => {
8060
+ Name => 'IntervalShooting',
8061
+ RawConv => '$$self{IntervalShooting} = $val',
8062
+ Format => 'int16u',
8063
+ PrintConv => q{
8064
+ return 'Off' if $val == 0 ;
8065
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
8066
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
8067
+ return "On: $i$f"
8068
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
8069
+ },
8070
+ },
8071
+ 0x6c9a => {
8072
+ Name => 'IntervalFrame',
8073
+ RawConv => '$$self{IntervalFrame} = $val',
8074
+ Condition => '$$self{IntervalShooting} > 0',
8075
+ Format => 'int16u',
8076
+ Hidden => 1,
8077
+ },
8078
+ ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8079
+ 0x7717 => {
8080
+ Name => 'Offsset5Hook',
8081
+ Hidden => 1,
8082
+ RawConv => 'undef',
8083
+ # account for variable location of Offset5 data
8084
+ Hook => '$varSize = $$self{Offset5} - 0x7718',
8085
+ },
8086
+ 0x7844 => {
8087
+ Name => 'FocusShiftShooting',
8088
+ RawConv => '$$self{FocusShiftShooting} = $val',
8089
+ PrintConv => q{
8090
+ return 'Off' if $val == 0 ;
8091
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8092
+ return "On: $i"
8093
+ },
8094
+ },
8095
+ ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
7835
8096
  0xeaea => {
7836
- Name => 'Hook1',
8097
+ Name => 'OrientationHook',
7837
8098
  Hidden => 1,
7838
8099
  RawConv => 'undef',
7839
8100
  # account for variable location of OrientationInfo data
7840
8101
  Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb',
7841
8102
  },
7842
-
7843
8103
  0xeaeb => {
7844
8104
  Name => 'RollAngle',
7845
8105
  Format => 'fixed32u',
@@ -7867,52 +8127,72 @@ my %nikonFocalConversions = (
7867
8127
  PrintConv => 'sprintf("%.1f", $val)',
7868
8128
  PrintConvInv => '$val',
7869
8129
  },
7870
- # note: DecryptLen currently set to 0xeb5b + 1050
8130
+ ### 0xeb5f - Offset26 info start (Z9 firmware 1.00)
8131
+ 0xeb6f => {
8132
+ Name => 'MenuSettingsZ9Offset',
8133
+ Writable => 0,
8134
+ Hidden => 1,
8135
+ # offset to MenuSettingsZ9 is relative to start of Offset26 block
8136
+ RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{Offset26}; undef', # (ignore if 0)
8137
+ },
8138
+ 0xeb70 => {
8139
+ Name => 'Hook5',
8140
+ Hidden => 1,
8141
+ RawConv => 'undef',
8142
+ # account for variable location of menu settings data
8143
+ Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b',
8144
+ },
8145
+ 0xec4b => {
8146
+ Name => 'MenuSettingsZ9',
8147
+ Format => 'undef[1646]',
8148
+ SubDirectory => {
8149
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8150
+ },
8151
+ },
8152
+ # note: DecryptLen currently set to 0xec4b + 1646
7871
8153
  );
7872
8154
 
7873
- %Image::ExifTool::Nikon::ZMenuSettings = (
8155
+ %Image::ExifTool::Nikon::MenuSettingsZ7II = (
7874
8156
  %binaryDataAttrs,
7875
8157
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7876
- NOTES => q{
7877
- These tags are used by the Z5 Z6 Z7 Z6II Z7II Z50 Zfc
7878
- },
7879
- DATAMEMBER => [ 0xb0, 0xb4, 0x148, 0x160, 0x35a ],
8158
+ DATAMEMBER => [ 176, 180, 328, 352, 858 ],
8159
+ NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.',
7880
8160
  160 => {
7881
8161
  Name => 'IntervalDurationHours',
7882
8162
  Format => 'int32u',
7883
- Condition => '$$self{IntervalShooting} > 0',
8163
+ #Condition => '$$self{IntervalShooting} > 0',
7884
8164
  },
7885
8165
  164 => {
7886
8166
  Name => 'IntervalDurationMinutes',
7887
8167
  Format => 'int32u',
7888
- Condition => '$$self{IntervalShooting} > 0',
8168
+ #Condition => '$$self{IntervalShooting} > 0',
7889
8169
  },
7890
8170
  168 => {
7891
8171
  Name => 'IntervalDurationSeconds',
7892
8172
  Format => 'int32u',
7893
- Condition => '$$self{IntervalShooting} > 0',
8173
+ #Condition => '$$self{IntervalShooting} > 0',
7894
8174
  },
7895
8175
  176 => {
7896
8176
  Name => 'Intervals',
7897
8177
  Format => 'int32u',
7898
8178
  RawConv => '$$self{IntervalShootingIntervals} = $val',
7899
- Condition => '$$self{IntervalShooting} > 0',
8179
+ #Condition => '$$self{IntervalShooting} > 0',
7900
8180
  },
7901
8181
  180 => {
7902
8182
  Name => 'ShotsPerInterval',
7903
8183
  Format => 'int32u',
7904
8184
  RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
7905
- Condition => '$$self{IntervalShooting} > 0',
8185
+ #Condition => '$$self{IntervalShooting} > 0',
7906
8186
  },
7907
8187
  184 => {
7908
8188
  Name => 'IntervalExposureSmoothing',
7909
- Condition => '$$self{IntervalShooting} > 0',
8189
+ #Condition => '$$self{IntervalShooting} > 0',
7910
8190
  Format => 'int8u',
7911
8191
  PrintConv => \%offOn,
7912
8192
  },
7913
8193
  186 => {
7914
8194
  Name => 'IntervalPriority',
7915
- Condition => '$$self{IntervalShooting} > 0',
8195
+ #Condition => '$$self{IntervalShooting} > 0',
7916
8196
  Format => 'int8u',
7917
8197
  PrintConv => \%offOn,
7918
8198
  },
@@ -7955,16 +8235,11 @@ my %nikonFocalConversions = (
7955
8235
  3 => 'Highlight'
7956
8236
  },
7957
8237
  },
8238
+ 326 => { Name => 'NikonMeteringMode', PrintConv => \%meteringModeZ7},
7958
8239
  328 => {
7959
8240
  Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
7960
8241
  RawConv => '$$self{FlashControlMode} = $val',
7961
- PrintConv => {
7962
- 0 => 'TTL',
7963
- 1 => 'Auto External Flash',
7964
- 2 => 'GN (distance priority)',
7965
- 3 => 'Manual',
7966
- 4 => 'Repeating Flash',
7967
- },
8242
+ PrintConv => \%flashControlModeZ7,
7968
8243
  },
7969
8244
  334 => {
7970
8245
  Name => 'FlashGNDistance',
@@ -7982,25 +8257,8 @@ my %nikonFocalConversions = (
7982
8257
  PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
7983
8258
  PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
7984
8259
  },
7985
- 346 => {
7986
- Name => 'FlashWirelessOption', # also found in FlashInfoUnknown at offset 0x23 (with different mappings)
7987
- Unknown => 1,
7988
- PrintConv => {
7989
- 0 => 'Off',
7990
- 1 => 'Optical AWL',
7991
- 2 => 'Optical/Radio AWL',
7992
- 3 => 'Radio AWL'
7993
- },
7994
- },
7995
- 348 => {
7996
- Name => 'FlashRemoteControl', # also found in FlashInfoUnknown at offset 0x1e (with different mappings)
7997
- Unknown => 1,
7998
- PrintConv => {
7999
- 0 => 'Group',
8000
- 1 => 'Quick Wireless',
8001
- 2 => 'Remote Repeating',
8002
- },
8003
- },
8260
+ 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8261
+ 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8004
8262
  352 => {
8005
8263
  Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
8006
8264
  RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
@@ -8038,27 +8296,8 @@ my %nikonFocalConversions = (
8038
8296
  #444 => BracketProgram
8039
8297
  #446 => BracketIncrement
8040
8298
  #463 => SilentPhotography
8041
- 502 => {
8042
- Name => 'MovieFrameSize', # may want to rename or suppress the movie menu settings - potentially confusing for still photographers
8043
- Unknown => 1,
8044
- PrintConv => {
8045
- 1 => '1920x1080',
8046
- 2 => '3840x2160',
8047
- },
8048
- },
8049
- 504 => {
8050
- Name => 'MovieFrameRate',
8051
- Unknown => 1,
8052
- PrintConv => {
8053
- 0 => '120p',
8054
- 1 => '100p',
8055
- 2 => '60p',
8056
- 3 => '50p',
8057
- 4 => '30p',
8058
- 5 => '25p',
8059
- 6 => '24p',
8060
- },
8061
- },
8299
+ 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8300
+ 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8062
8301
  506 => {
8063
8302
  Name => 'MovieSlowMotion',
8064
8303
  Unknown => 1,
@@ -8083,72 +8322,13 @@ my %nikonFocalConversions = (
8083
8322
  Format => 'int16u',
8084
8323
  Unknown => 1,
8085
8324
  ValueConv => '($val-104)/8',
8086
- PrintConv => {
8087
- 0 => 'ISO 64',
8088
- 1 => 'ISO 80',
8089
- 2 => 'ISO 100',
8090
- 3 => 'ISO 125',
8091
- 4 => 'ISO 160',
8092
- 5 => 'ISO 200',
8093
- 6 => 'ISO 250',
8094
- 7 => 'ISO 320',
8095
- 8 => 'ISO 400',
8096
- 9 => 'ISO 500',
8097
- 10 => 'ISO 640',
8098
- 11 => 'ISO 800',
8099
- 12 => 'ISO 1000',
8100
- 13 => 'ISO 1250',
8101
- 14 => 'ISO 1600',
8102
- 15 => 'ISO 2000',
8103
- 16 => 'ISO 2500',
8104
- 17 => 'ISO 3200',
8105
- 18 => 'ISO 4000',
8106
- 19 => 'ISO 5000',
8107
- 20 => 'ISO 6400',
8108
- 21 => 'ISO 8000',
8109
- 22 => 'ISO 10000',
8110
- 23 => 'ISO 12800',
8111
- 24 => 'ISO 16000',
8112
- 25 => 'ISO 20000',
8113
- 26 => 'ISO 25600',
8114
- 27 => 'ISO Hi 0.3',
8115
- 28 => 'ISO Hi 0.7',
8116
- 29 => 'ISO Hi 1.0',
8117
- 32 => 'ISO Hi 2.0',
8118
- },
8325
+ ValueConvInv => '8 * ($val + 104)',
8326
+ PrintConv => \%iSOAutoHiLimitZ7,
8119
8327
  },
8120
8328
  #520 => MovieWhiteBalanceSameAsPhoto
8121
- 568 => {
8122
- Name => 'MovieActiveD-Lighting',
8123
- Unknown => 1,
8124
- PrintConv => {
8125
- 0 => 'Off',
8126
- 2 => 'Low',
8127
- 3 => 'Normal',
8128
- 4 => 'High',
8129
- 5 => 'Extra High',
8130
- },
8131
- },
8132
- 572 => {
8133
- Name => 'MovieHighISONoiseReduction',
8134
- Unknown => 1,
8135
- PrintConv => {
8136
- 0 => 'Off',
8137
- 1 => 'Low',
8138
- 2 => 'Normal',
8139
- 3 => 'High',
8140
- },
8141
- },
8142
- 574=> {
8143
- Name => 'MovieVignetteControl',
8144
- Unknown => 1,
8145
- PrintConv => {
8146
- 0 => 'Off',
8147
- 1 => 'Low',
8148
- 2 => 'Normal',
8149
- 3 => 'High',
8150
- },
8151
- },
8329
+ 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8330
+ 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8331
+ 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8152
8332
  576 => {
8153
8333
  Name => 'MovieVignetteControlSameAsPhoto',
8154
8334
  Unknown => 1,
@@ -8164,16 +8344,7 @@ my %nikonFocalConversions = (
8164
8344
  Unknown => 1,
8165
8345
  PrintConv => \%offOn
8166
8346
  },
8167
- 584 => {
8168
- Name => 'MovieFocusMode',
8169
- Unknown => 1,
8170
- PrintConv => {
8171
- 0 => 'Manual',
8172
- 1 => 'AF-S',
8173
- 2 => 'AF-C',
8174
- 4 => 'AF-F', # full frame
8175
- },
8176
- },
8347
+ 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8177
8348
  #586 => MovieAFAreaMode
8178
8349
  590 => {
8179
8350
  Name => 'MovieVibrationReduction',
@@ -8202,6 +8373,390 @@ my %nikonFocalConversions = (
8202
8373
  },
8203
8374
  #859 => HDMIViewAssist
8204
8375
  );
8376
+
8377
+ %Image::ExifTool::Nikon::MenuSettingsZ9 = (
8378
+ %binaryDataAttrs,
8379
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8380
+ DATAMEMBER => [ 140, 188, 192, 232, 424, 534 ],
8381
+ IS_SUBDIR => [ 799 ],
8382
+ NOTES => 'These tags are used by the Z9.',
8383
+ #90 ISO
8384
+ 140 => {
8385
+ Name => 'MultipleExposureMode',
8386
+ RawConv => '$$self{MultipleExposureMode} = $val',
8387
+ PrintConv => {
8388
+ 0 => 'Off',
8389
+ 1 => 'On (Series)',
8390
+ 2 => 'On',
8391
+ },
8392
+ },
8393
+ 142 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0' }, #range 2-9
8394
+ 188 => {
8395
+ Name => 'Intervals',
8396
+ Format => 'int32u',
8397
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
8398
+ Condition => '$$self{IntervalShooting} > 0',
8399
+ },
8400
+ 192 => {
8401
+ Name => 'ShotsPerInterval',
8402
+ Format => 'int32u',
8403
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8404
+ Condition => '$$self{IntervalShooting} > 0',
8405
+ },
8406
+ #220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
8407
+ 232 => {
8408
+ Name => 'FocusShiftNumberShots', #1-300
8409
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
8410
+ Condition => '$$self{FocusShiftShooting} > 0',
8411
+ },
8412
+ 236 => {
8413
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8414
+ Condition => '$$self{FocusShiftShooting} > 0',
8415
+ },
8416
+ 240 => {
8417
+ Name => 'FocusShiftInterval',
8418
+ Condition => '$$self{FocusShiftShooting} > 0',
8419
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8420
+ },
8421
+ 244 => {
8422
+ Name => 'FocusShiftExposureLock',
8423
+ Unknown => 1,
8424
+ PrintConv => \%offOn,
8425
+ Condition => '$$self{FocusShiftShooting} > 0',
8426
+ },
8427
+ 274 => {
8428
+ Name => 'PhotoShootingMenuBank',
8429
+ PrintConv => {
8430
+ 0 => 'A',
8431
+ 1 => 'B',
8432
+ 2 => 'C',
8433
+ 3 => 'D',
8434
+ },
8435
+ },
8436
+ 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn, }, #single tag from both Photo & Video menus
8437
+ 308 => {
8438
+ Name => 'PhotoShootingMenuBankImageArea',
8439
+ PrintConv => {
8440
+ 0 => 'FX',
8441
+ 1 => 'DX',
8442
+ 4 => '16:9',
8443
+ 8 => '1:1',
8444
+ },
8445
+ },
8446
+ #310 ImageQuality
8447
+ 322 => { Name => 'AutoISO', PrintConv => \%offOn, },
8448
+ 324 => {
8449
+ Name => 'ISOAutoHiLimit',
8450
+ Format => 'int16u',
8451
+ Unknown => 1,
8452
+ ValueConv => '($val-104)/8',
8453
+ ValueConvInv => '8 * ($val + 104)',
8454
+ PrintConv => \%iSOAutoHiLimitZ7,
8455
+ },
8456
+ 326 => {
8457
+ Name => 'ISOAutoFlashLimit',
8458
+ Format => 'int16u',
8459
+ Unknown => 1,
8460
+ ValueConv => '($val-104)/8',
8461
+ ValueConvInv => '8 * ($val + 104)',
8462
+ PrintConv => \%iSOAutoHiLimitZ7,
8463
+ },
8464
+ #332 ISOAutoShutterTime - Auto setting 0=> 'Auto (Slowest)', 1 => 'Auto (Slower)', 2=> 'Auto', 3=> 'Auto (Faster)', 4=> 'Auto (Fastest)'
8465
+ 334 => {
8466
+ Name => 'ISOAutoShutterTime', #shutter speed is 2 ** (-$val/24)
8467
+ ValueConv => '$val / 8',
8468
+ Format => 'int16s',
8469
+ PrintConv => {
8470
+ -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15
8471
+ -12 => '15 s',
8472
+ -9 => '8 s',
8473
+ -6 => '4 s',
8474
+ -3 => '2 s',
8475
+ 0 => '1 s',
8476
+ 1 => '1/1.3 s',
8477
+ 2 => '1/1.6 s',
8478
+ 3 => '1/2 s',
8479
+ 4 => '1/2.5 s',
8480
+ 5 => '1/3 s',
8481
+ 6 => '1/4 s',
8482
+ 7 => '1/5 s',
8483
+ 8 => '1/6 s',
8484
+ 9 => '1/8 s',
8485
+ 10 => '1/10 s',
8486
+ 11 => '1/13 s',
8487
+ 12 => '1/15 s',
8488
+ 13 => '1/20 s',
8489
+ 14 => '1/25 s',
8490
+ 15 => '1/30 s',
8491
+ 16 => '1/40 s',
8492
+ 17 => '1/50 s',
8493
+ 18 => '1/60 s',
8494
+ 19 => '1/80 s',
8495
+ 20 => '1/100 s',
8496
+ 21 => '1/120 s',
8497
+ 22 => '1/160 s',
8498
+ 23 => '1/200 s',
8499
+ 24 => '1/250 s',
8500
+ 25 => '1/320 s',
8501
+ 26 => '1/400 s',
8502
+ 27 => '1/500 s',
8503
+ 28 => '1/640 s',
8504
+ 29 => '1/800 s',
8505
+ 30 => '1/1000 s',
8506
+ 31 => '1/1250 s',
8507
+ 32 => '1/1600 s',
8508
+ 33 => '1/2000 s',
8509
+ 34 => '1/2500 s',
8510
+ 35 => '1/3200 s',
8511
+ 36 => '1/4000 s',
8512
+ 37 => '1/5000 s',
8513
+ 37.5 => '1/6000 s',
8514
+ 38 => '1/6400 s',
8515
+ 39 => '1/8000 s',
8516
+ 40 => '1/10000 s',
8517
+ 40.5 => '1/12000 s',
8518
+ 41 => '1/13000 s',
8519
+ 42 => '1/16000 s',
8520
+ },
8521
+ },
8522
+ #336 WhiteBalance
8523
+ #406 PictureControl
8524
+ #408 ColorSpace
8525
+ #410 ActiveD-Lighting
8526
+ #412 => { Name => 'NoiseReduction', PrintConv => \%offOn }, #Long Exposure Noise Reduction
8527
+ #414 HighISONoiseReduction
8528
+ #414 VignetteControl
8529
+ 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8530
+ 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8531
+ #419 AutoDistortionControl #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8532
+ 420 => { Name => 'FlickerReductionShooting', PrintConv => \%offOn },
8533
+ #422 MeteringMode
8534
+ 424 => {
8535
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
8536
+ RawConv => '$$self{FlashControlMode} = $val',
8537
+ PrintConv => \%flashControlModeZ7,
8538
+ },
8539
+ 426 => {
8540
+ Name => 'FlashMasterCompensation',
8541
+ Format => 'int8s',
8542
+ Unknown => 1,
8543
+ ValueConv => '$val/6',
8544
+ ValueConvInv => '6 * $val',
8545
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8546
+ PrintConvInv => '$val',
8547
+ },
8548
+ 430 => {
8549
+ Name => 'FlashGNDistance',
8550
+ Condition => '$$self{FlashControlMode} == 2',
8551
+ Unknown => 1,
8552
+ ValueConv => '$val + 3',
8553
+ PrintConv => \%flashGNDistance,
8554
+ },
8555
+ 434 => {
8556
+ Name => 'FlashOutput', # range[0,24] with 0=>Full; 1=>50%; then decreasing flash power in 1/3 stops to 0.39% (1/256 full power). also found in FlashInfoUnknown at offset 0x0a (with different mappings)
8557
+ Condition => '$$self{FlashControlMode} >= 3',
8558
+ Unknown => 1,
8559
+ ValueConv => '2 ** (-$val/3)',
8560
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8561
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8562
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8563
+ },
8564
+ #442 flash wirelss control 0=> 'Off' 1=> 'CMD'
8565
+ 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8566
+ 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8567
+ #526 FocusMode
8568
+ #528 AFAreaMode
8569
+ 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8570
+ 534 => {
8571
+ Name => 'BracketSet',
8572
+ RawConv => '$$self{BracketSet} = $val',
8573
+ PrintConv => {
8574
+ 0 => 'AE/Flash',
8575
+ 1 => 'AE',
8576
+ 2 => 'Flash',
8577
+ 3 => 'White Balance',
8578
+ 4 => 'Active-D Lighting',
8579
+ },
8580
+ },
8581
+ 536 => {
8582
+ Name => 'BracketProgram',
8583
+ Condition => '$$self{BracketSet} < 3',
8584
+ Notes => 'AE and/or Flash Bracketing',
8585
+ PrintConv => {
8586
+ 0 => 'Disabled',
8587
+ 2 => '2F',
8588
+ 3 => '3F',
8589
+ 4 => '4F',
8590
+ 5 => '5F',
8591
+ 7 => '7F',
8592
+ 9 => '9F',
8593
+ },
8594
+ },
8595
+ 538 => {
8596
+ Name => 'BracketIncrement',
8597
+ Condition => '$$self{BracketSet} < 3',
8598
+ Notes => 'AE and/or Flash Bracketing',
8599
+ PrintConv => {
8600
+ 0 => '0.3',
8601
+ #1 => '0.5',
8602
+ 2 => '0.7',
8603
+ 3 => '1.0',
8604
+ 4 => '2.0',
8605
+ 5 => '3.0',
8606
+ },
8607
+ },
8608
+ #544 BracketProgram for ADL
8609
+ 556 => {
8610
+ Name => 'SecondarySlotFunction',
8611
+ PrintConv => {
8612
+ 0 => 'Overflow',
8613
+ 1 => 'Backup',
8614
+ 2 => 'NEF Primary + JPG Secondary',
8615
+ 3 => 'JPG Primary + JPG Secondary',
8616
+ },
8617
+ },
8618
+ 572 => { Name => 'DXCropAlert', PrintConv => \%offOn, },
8619
+ 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9},
8620
+ 604 => {
8621
+ Name => 'MovieImageArea',
8622
+ Unknown => 1,
8623
+ Mask => 0x01, #without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
8624
+ PrintConv => {
8625
+ 0 => 'FX',
8626
+ 1 => 'DX',
8627
+ },
8628
+ },
8629
+ 614 => {
8630
+ Name => 'MovieType',
8631
+ Unknown => 1,
8632
+ PrintConv => {
8633
+ 1 => 'H.265 8-bit (MP4)',
8634
+ 2 => 'H.265 8-bit (MOV)',
8635
+ 3 => 'H.265 10-bit (MOV)',
8636
+ 4 => 'ProRes 422 HQ 10-bit (MOV)',
8637
+ },
8638
+ },
8639
+ 616 => {
8640
+ Name => 'MovieISOAutoHiLimit',
8641
+ Format => 'int16u',
8642
+ Unknown => 1,
8643
+ ValueConv => '($val-104)/8',
8644
+ ValueConvInv => '8 * ($val + 104)',
8645
+ PrintConv => \%iSOAutoHiLimitZ7,
8646
+ },
8647
+ 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1},
8648
+ 620 => {
8649
+ Name => 'MovieISOAutoManualMode',
8650
+ Format => 'int16u',
8651
+ Unknown => 1,
8652
+ ValueConv => '($val-104)/8',
8653
+ ValueConvInv => '8 * ($val + 104)',
8654
+ PrintConv => \%iSOAutoHiLimitZ7,
8655
+ },
8656
+ 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8657
+ 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8658
+ 704 => {
8659
+ Name => 'MovieFlickerReduction',
8660
+ PrintConv => {
8661
+ 0 => 'Auto',
8662
+ 1 => '50Hz',
8663
+ 2 => '60Hz',
8664
+ },
8665
+ },
8666
+ 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, , Unknown => 1},
8667
+ 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8668
+ 710 => {
8669
+ Name => 'MovieAFAreaMode',
8670
+ PrintConv => {
8671
+ 1 => 'Single',
8672
+ 3 => 'Wide (S)',
8673
+ 4 => 'Wide (L)',
8674
+ 6 => 'Auto',
8675
+ 11 => 'Subject Tracking',
8676
+ },
8677
+ },
8678
+ 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1},
8679
+ 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8680
+ 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'On', 2 => 'On' }, Unknown => 1 }, #not sure why the unusal mapping with 2 => 'On'
8681
+ 720 => { Name => 'MicrophoneSensitivity', Unknown => 1}, #1-20
8682
+ 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8683
+ 724 => { Name => 'MicrophoneFrequencyResponse', PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
8684
+ 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
8685
+ 748 => {
8686
+ Name => 'MovieToneMap',
8687
+ Unknown => 1,
8688
+ PrintConv => {
8689
+ 0 => 'SDR',
8690
+ 1 => 'HLG',
8691
+ 2 => 'N-Log',
8692
+ },
8693
+ },
8694
+ 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8695
+ 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8696
+ 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
8697
+ 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
8698
+ 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1},
8699
+ 799 => {
8700
+ Name => 'CustomSettingsZ9',
8701
+ Format => 'undef[608]',
8702
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' },
8703
+ },
8704
+ 1426 => {
8705
+ Name => 'Language',
8706
+ Unknown => 1,
8707
+ PrintConv => {
8708
+ 4 => 'English',
8709
+ 5 => 'Spanish',
8710
+ 7 => 'French',
8711
+ },
8712
+ },
8713
+ 1428 => {
8714
+ Name => 'TimeZone',
8715
+ PrintConv => {
8716
+ 5 => '+09:00 (Tokyo)',
8717
+ 6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8718
+ 10 => '+05:45 (Kathmandu)',
8719
+ 11 => '+05:30 (New Dehli)',
8720
+ 16 => '+03:00 (Moscow, Nairobi)',
8721
+ 15 => '+02:00 (Athens)',
8722
+ 16 => '+01:00 (Madrid, Paris, Berlin)',
8723
+ 17 => '+02:00 (Athens, Helsinki)',
8724
+ 18 => '+00:00 (London)',
8725
+ 19 => '+00:00', #PH (unknown city)
8726
+ 22 => '-03:00 (Buenos Aires, Sao Paulo)',
8727
+ 24 => '-04:00 (Manaus, Caracas)',
8728
+ 25 => '-05:00 (New York, Toronto, Lima)',
8729
+ 26 => '-06:00 (Chicago, Mexico City)',
8730
+ 27 => '-07:00 (Denver)',
8731
+ 28 => '-08:00 (Los Angeles, Vancouver)',
8732
+ 29 => '-09:00 (Anchorage)',
8733
+ 30 => '-10:00 (Hawaii)',
8734
+ },
8735
+ },
8736
+ 1434 => {Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1}, # settings: -5 to +5
8737
+ 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
8738
+ 1552 => {
8739
+ Name => 'HDMIOutputResolution',
8740
+ PrintConv => {
8741
+ 0 => 'Auto',
8742
+ 1 => '4320p',
8743
+ 2 => '2160p',
8744
+ 3 => '1080p',
8745
+ #4 => '1080i',
8746
+ 5 => '720p',
8747
+ #6 => '576p',
8748
+ #7 => '480p',
8749
+ },
8750
+ },
8751
+ 1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
8752
+ 1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
8753
+ 1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
8754
+ 1608 => { Name => 'EnergySavingMode', PrintConv =>\%offOn, Unknown => 1 },
8755
+ 1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
8756
+ 1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
8757
+ 1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
8758
+ );
8759
+
8205
8760
  # Flash information (ref JD)
8206
8761
  %Image::ExifTool::Nikon::FlashInfo0100 = (
8207
8762
  %binaryDataAttrs,
@@ -9421,7 +9976,7 @@ my %nikonFocalConversions = (
9421
9976
  ],
9422
9977
  );
9423
9978
 
9424
- # Flash information for the Z7_2 (ref 28)
9979
+ # Flash information for the Z7II (ref 28)
9425
9980
  # (likey similar to FlashInfo010 and FlashInfo0108 with addition of support for radio controlled units such as the SB-5000?
9426
9981
  %Image::ExifTool::Nikon::FlashInfo0300 = (
9427
9982
  %binaryDataAttrs,
@@ -9445,7 +10000,7 @@ my %nikonFocalConversions = (
9445
10000
  SeparateTable => 'FlashFirmware',
9446
10001
  PrintConv => \%flashFirmware,
9447
10002
  },
9448
- 27 => {
10003
+ 10 => {
9449
10004
  Name => 'FlashCompensation',
9450
10005
  # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
9451
10006
  # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
@@ -10373,7 +10928,7 @@ my %nikonFocalConversions = (
10373
10928
  },
10374
10929
  },
10375
10930
  {
10376
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
10931
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
10377
10932
  Name => 'LensData0800',
10378
10933
  SubDirectory => {
10379
10934
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -10458,6 +11013,98 @@ my %nikonFocalConversions = (
10458
11013
  },
10459
11014
  );
10460
11015
 
11016
+ # Nikon XMP tags written in NKSC metadata
11017
+ %Image::ExifTool::Nikon::ast = (
11018
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-ast', 2 => 'Image' },
11019
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11020
+ NAMESPACE => 'ast',
11021
+ VARS => { NO_ID => 1 },
11022
+ NOTES => 'Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers.',
11023
+ about => { },
11024
+ version => { },
11025
+ XMLPackets => {
11026
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
11027
+ Encoding => 'Base64',
11028
+ Binary => 1,
11029
+ },
11030
+ IPTC => {
11031
+ SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' },
11032
+ Encoding => 'Base64',
11033
+ Binary => 1,
11034
+ },
11035
+ GPSVersionID => { Groups => { 2 => 'Location' }, %base64bytes },
11036
+ GPSLatitudeRef => {
11037
+ Groups => { 2 => 'Location' },
11038
+ %base64int32u,
11039
+ PrintConv => { 0 => 'North', 1 => 'South' }, #PH (NC)
11040
+ },
11041
+ GPSLatitude => { Groups => { 2 => 'Location' }, %base64coord },
11042
+ GPSLongitudeRef => {
11043
+ Groups => { 2 => 'Location' },
11044
+ %base64int32u,
11045
+ PrintConv => { 2 => 'East', 3 => 'West' }, #PH (NC)
11046
+ },
11047
+ GPSLongitude => { Groups => { 2 => 'Location' }, %base64coord },
11048
+ GPSAltitudeRef => {
11049
+ Groups => { 2 => 'Location' },
11050
+ %base64bytes,
11051
+ PrintConv => {
11052
+ 0 => 'Above Sea Level',
11053
+ 1 => 'Below Sea Level',
11054
+ },
11055
+ },
11056
+ GPSAltitude => {
11057
+ Groups => { 2 => 'Location' },
11058
+ ValueConv => q{
11059
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
11060
+ my $saveOrder = GetByteOrder();
11061
+ SetByteOrder('II');
11062
+ $val = GetDouble($val,0);
11063
+ SetByteOrder($saveOrder);
11064
+ return $val;
11065
+ },
11066
+ PrintConv => '"$val m"',
11067
+ },
11068
+ GPSMapDatum => { },
11069
+ );
11070
+ %Image::ExifTool::Nikon::sdc = (
11071
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' },
11072
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11073
+ NAMESPACE => 'sdc',
11074
+ VARS => { NO_ID => 1 },
11075
+ about => { },
11076
+ version => { },
11077
+ appversion => { Name => 'AppVersion' },
11078
+ appname => { Name => 'AppName' },
11079
+ );
11080
+ %Image::ExifTool::Nikon::nine = (
11081
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-nine', 2 => 'Image' },
11082
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11083
+ NAMESPACE => 'nine',
11084
+ VARS => { NO_ID => 1 },
11085
+ about => { },
11086
+ version => { },
11087
+ Label => { },
11088
+ Rating => { },
11089
+ Trim => { %base64bin },
11090
+ NineEdits => {
11091
+ SubDirectory => {
11092
+ TagTable => 'Image::ExifTool::Nikon::NineEdits',
11093
+ IgnoreProp => { userData => 1 }, # remove "UserData" from already overly long tag names
11094
+ },
11095
+ Binary => 1,
11096
+ },
11097
+ );
11098
+ %Image::ExifTool::Nikon::NineEdits = (
11099
+ GROUPS => { 0 => 'XML', 1 => 'NineEdits', 2 => 'Image' },
11100
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11101
+ VARS => { NO_ID => 1 },
11102
+ NOTES => 'XML-based tags used to store editing information.',
11103
+ filterParametersBinary => { %base64bin },
11104
+ filterParametersExportExportData => { %base64bin },
11105
+ filterParametersCustomCustomData => { %base64bin },
11106
+ );
11107
+
10461
11108
  # Nikon composite tags
10462
11109
  %Image::ExifTool::Nikon::Composite = (
10463
11110
  GROUPS => { 2 => 'Camera' },
@@ -10649,7 +11296,7 @@ sub PrintAFPointsLeftRight($$)
10649
11296
 
10650
11297
  #------------------------------------------------------------------------------
10651
11298
  # Print conversion for relative Up/Down AF points (ref 28)
10652
- # Inputs: 0) column, 1) number of columns
11299
+ # Inputs: 0) row, 1) number of rows
10653
11300
  # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
10654
11301
  sub PrintAFPointsUpDown($$)
10655
11302
  {
@@ -10851,6 +11498,72 @@ sub SerialKey($$)
10851
11498
  return 0x60; # D200 (ref 10), D40X (ref PH), etc
10852
11499
  }
10853
11500
 
11501
+ #------------------------------------------------------------------------------
11502
+ # Extract information from "NIKON APP" trailer (ref PH)
11503
+ # Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info
11504
+ # Returns: true on success
11505
+ sub ProcessNikonApp($;$)
11506
+ {
11507
+ local $_;
11508
+ my ($et, $dirInfo) = @_;
11509
+ my $raf = $$et{RAF};
11510
+ my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
11511
+ my $buff;
11512
+
11513
+ return 0 unless $raf->Seek(-20-$offset, 2) and $raf->Read($buff, 20) == 20 and
11514
+ substr($buff,-16) eq "\0\0\0\0\0\0/NIKON APP"; # check magic number
11515
+
11516
+ my $verbose = $et->Options('Verbose');
11517
+ my $fileEnd = $raf->Tell();
11518
+ my $trailerLen = unpack('N', $buff);
11519
+ $trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0;
11520
+ if ($dirInfo) {
11521
+ $$dirInfo{DirLen} = $trailerLen if $dirInfo;
11522
+ $$dirInfo{DataPos} = $fileEnd - $trailerLen;
11523
+ if ($$dirInfo{OutFile}) {
11524
+ if ($$et{DEL_GROUP}{NikonApp}) {
11525
+ ++$$et{CHANGED};
11526
+ # just copy the trailer when writing
11527
+ } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or
11528
+ $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen)
11529
+ {
11530
+ return 0;
11531
+ } else {
11532
+ return 1;
11533
+ }
11534
+ }
11535
+ $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
11536
+ }
11537
+ unless ($trailerLen >= 0x40 and $raf->Seek($fileEnd - $trailerLen, 0) and
11538
+ $raf->Read($buff, 0x40) == 0x40 and $buff =~ m(NIKON APP\0))
11539
+ {
11540
+ $et->Warn('Error reading NikonApp trailer');
11541
+ return 0;
11542
+ }
11543
+ $$et{SET_GROUP0} = 'NikonApp';
11544
+ while ($raf->Read($buff, 8) == 8) {
11545
+ my ($id, $len) = unpack('N2', $buff);
11546
+ if ($len & 0x80000000) {
11547
+ $et->Warn('Invalid NikonApp record length');
11548
+ last;
11549
+ }
11550
+ last if $id == 0 and $len == 0;
11551
+ unless ($raf->Read($buff, $len) == $len) {
11552
+ $et->Warn('Truncated NikonApp record');
11553
+ last;
11554
+ }
11555
+ if ($id == 1) {
11556
+ require Image::ExifTool::XMP;
11557
+ Image::ExifTool::XMP::ProcessXMP($et, { DataPt => \$buff });
11558
+ } else { # (haven't seen any other types of records)
11559
+ $et->Warn("Unknown NikonApp record $id");
11560
+ last;
11561
+ }
11562
+ }
11563
+ delete $$et{SET_GROUP0};
11564
+ return 1;
11565
+ }
11566
+
10854
11567
  #------------------------------------------------------------------------------
10855
11568
  # Read Nikon NCTG tags in MOV videos
10856
11569
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -11192,7 +11905,7 @@ Nikon maker notes in EXIF information.
11192
11905
 
11193
11906
  =head1 AUTHOR
11194
11907
 
11195
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
11908
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
11196
11909
 
11197
11910
  This library is free software; you can redistribute it and/or modify it
11198
11911
  under the same terms as Perl itself.