exiftool-vendored.pl 12.38.0 → 12.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/LICENSE +10 -3
  2. package/bin/Changes +62 -0
  3. package/bin/MANIFEST +2 -0
  4. package/bin/META.json +1 -1
  5. package/bin/META.yml +1 -1
  6. package/bin/README +45 -45
  7. package/bin/arg_files/exif2xmp.args +5 -0
  8. package/bin/arg_files/xmp2exif.args +6 -0
  9. package/bin/config_files/acdsee.config +6 -6
  10. package/bin/config_files/photoshop_paths.config +30 -7
  11. package/bin/config_files/picasa_faces.config +1 -1
  12. package/bin/config_files/pix4d.config +2 -2
  13. package/bin/config_files/tiff_version.config +2 -2
  14. package/bin/exiftool +96 -65
  15. package/bin/lib/File/RandomAccess.pm +1 -1
  16. package/bin/lib/File/RandomAccess.pod +2 -2
  17. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  18. package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  19. package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  20. package/bin/lib/Image/ExifTool/APE.pm +1 -1
  21. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  22. package/bin/lib/Image/ExifTool/ASF.pm +1 -1
  23. package/bin/lib/Image/ExifTool/Apple.pm +1 -1
  24. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  26. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  27. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  28. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  29. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -4
  30. package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  31. package/bin/lib/Image/ExifTool/Canon.pm +79 -5
  32. package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  33. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  34. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  35. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  36. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  37. package/bin/lib/Image/ExifTool/Charset.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DJI.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  41. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  42. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  43. package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  44. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  45. package/bin/lib/Image/ExifTool/EXE.pm +1 -1
  46. package/bin/lib/Image/ExifTool/Exif.pm +53 -21
  47. package/bin/lib/Image/ExifTool/FITS.pm +1 -1
  48. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  49. package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  50. package/bin/lib/Image/ExifTool/FLIR.pm +16 -4
  51. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  52. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  53. package/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  54. package/bin/lib/Image/ExifTool/Font.pm +1 -1
  55. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  56. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  57. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  58. package/bin/lib/Image/ExifTool/GIF.pm +1 -1
  59. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  60. package/bin/lib/Image/ExifTool/GPS.pm +1 -1
  61. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  62. package/bin/lib/Image/ExifTool/Geotag.pm +4 -3
  63. package/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  64. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  65. package/bin/lib/Image/ExifTool/HP.pm +1 -1
  66. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  67. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  68. package/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  70. package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  71. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  72. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  73. package/bin/lib/Image/ExifTool/Import.pm +1 -1
  74. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  75. package/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  76. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  77. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  78. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  79. package/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  80. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  81. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  82. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  83. package/bin/lib/Image/ExifTool/LNK.pm +1 -1
  84. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  85. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  101. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  102. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  103. package/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  104. package/bin/lib/Image/ExifTool/MIE.pm +1 -1
  105. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  106. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  107. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  108. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  109. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MXF.pm +1 -1
  115. package/bin/lib/Image/ExifTool/MacOS.pm +10 -10
  116. package/bin/lib/Image/ExifTool/MakerNotes.pm +13 -2
  117. package/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  118. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  119. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  120. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  121. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  122. package/bin/lib/Image/ExifTool/Nikon.pm +924 -184
  123. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  124. package/bin/lib/Image/ExifTool/NikonCustom.pm +519 -6
  125. package/bin/lib/Image/ExifTool/NikonSettings.pm +17 -18
  126. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  127. package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  128. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  129. package/bin/lib/Image/ExifTool/Olympus.pm +8 -7
  130. package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  131. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  132. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  133. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  134. package/bin/lib/Image/ExifTool/PDF.pm +1 -1
  135. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  136. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  138. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  139. package/bin/lib/Image/ExifTool/PNG.pm +28 -8
  140. package/bin/lib/Image/ExifTool/PPM.pm +1 -1
  141. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  142. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  143. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  144. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  145. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  146. package/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  147. package/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  148. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  149. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  150. package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  151. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  152. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  153. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  154. package/bin/lib/Image/ExifTool/QuickTime.pm +10 -6
  155. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +16 -5
  156. package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  157. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  158. package/bin/lib/Image/ExifTool/RTF.pm +1 -1
  159. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  160. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  161. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  162. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  163. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  164. package/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  165. package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
  166. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  168. package/bin/lib/Image/ExifTool/Shift.pl +3 -1
  169. package/bin/lib/Image/ExifTool/Shortcuts.pm +3 -2
  170. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  171. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  172. package/bin/lib/Image/ExifTool/Sony.pm +11 -5
  173. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  174. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  175. package/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  176. package/bin/lib/Image/ExifTool/TagLookup.pm +6382 -6290
  177. package/bin/lib/Image/ExifTool/TagNames.pod +340 -21
  178. package/bin/lib/Image/ExifTool/Text.pm +1 -1
  179. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  181. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  182. package/bin/lib/Image/ExifTool/VCard.pm +1 -1
  183. package/bin/lib/Image/ExifTool/Validate.pm +1 -1
  184. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  185. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  186. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  187. package/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  188. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  189. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  190. package/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  191. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  192. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  193. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +9 -4
  194. package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -1
  195. package/bin/lib/Image/ExifTool/Writer.pl +6 -5
  196. package/bin/lib/Image/ExifTool/XMP.pm +49 -23
  197. package/bin/lib/Image/ExifTool/XMP2.pl +3 -2
  198. package/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
  199. package/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  200. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  201. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  202. package/bin/lib/Image/ExifTool.pm +21 -5
  203. package/bin/lib/Image/ExifTool.pod +71 -69
  204. package/bin/perl-Image-ExifTool.spec +43 -43
  205. package/bin/pp_build_exe.args +5 -5
  206. package/package.json +14 -3
@@ -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.05';
66
67
 
67
68
  sub LensIDConv($$$);
68
69
  sub ProcessNikonAVI($$$);
@@ -436,6 +437,7 @@ sub GetAFPointGrid($$;$);
436
437
  'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM',
437
438
  # LensFStops varies with FocalLength for this lens (ref 2):
438
439
  '92 2C 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', #2
440
+ '87 2C 2D 8E 2C 40 4B 0E' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM', #30
439
441
  # '92 2C 2D 88 2C 40 4B 0E' (250mm)
440
442
  # '92 2B 2D 88 2C 40 4B 0E' (210mm)
441
443
  # '92 2C 2D 88 2C 40 4B 0E' (185mm)
@@ -494,6 +496,7 @@ sub GetAFPointGrid($$;$);
494
496
  '7A 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II',
495
497
  'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD
496
498
  '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic
499
+ 'BB 48 5C 80 24 24 4B 4E' => 'Sigma 70-200mm F2.8 DG OS HSM | S', #forum13207
497
500
  '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
498
501
  '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
499
502
  '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
@@ -508,6 +511,7 @@ sub GetAFPointGrid($$;$);
508
511
  '77 44 60 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 APO DG D OS',
509
512
  '48 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
510
513
  'F3 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
514
+ '26 45 68 8E 34 42 1C 02' => 'Sigma 100-300mm F4.5-6.7 DL', #30
511
515
  '48 54 6F 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
512
516
  '7A 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
513
517
  '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 +706,7 @@ sub GetAFPointGrid($$;$);
702
706
  #
703
707
  '9A 4C 50 50 14 14 9C 06' => 'Yongnuo YN50mm F1.8N',
704
708
  '9F 48 48 48 24 24 A1 06' => 'Yongnuo YN40mm F2.8N', #30
709
+ '9F 54 68 68 18 18 A2 06' => 'Yongnuo YN100mm F2N', #30
705
710
  #
706
711
  '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC',
707
712
  #
@@ -754,6 +759,7 @@ my %flashFirmware = (
754
759
  '5 2' => '5.02 (SB-900)',
755
760
  '6 1' => '6.01 (SB-700)', #https://exiftool.org/forum/index.php/topic,5034.0.html
756
761
  '7 1' => '7.01 (SB-910)', #PH
762
+ '14 3' => '14.03 (SB-5000)', #28
757
763
  OTHER => sub {
758
764
  my ($val, $inv) = @_;
759
765
  return sprintf('%d.%.2d (Unknown model)', split(' ', $val)) unless $inv;
@@ -810,6 +816,124 @@ my %flashControlMode = (
810
816
  0x07 => 'Repeating Flash',
811
817
  );
812
818
 
819
+ my %activeDLightingZ7 = (
820
+ 0 => 'Off',
821
+ 2 => 'Low',
822
+ 3 => 'Normal',
823
+ 4 => 'High',
824
+ 5 => 'Extra High',
825
+ );
826
+
827
+ my %flashControlModeZ7 = (
828
+ 0 => 'TTL',
829
+ 1 => 'Auto External Flash',
830
+ 2 => 'GN (distance priority)',
831
+ 3 => 'Manual',
832
+ 4 => 'Repeating Flash',
833
+ );
834
+
835
+ my %flashRemoteControlZ7 = (
836
+ 0 => 'Group',
837
+ 1 => 'Quick Wireless',
838
+ 2 => 'Remote Repeating',
839
+ );
840
+
841
+ my %flashWirelessOptionZ7 = (
842
+ 0 => 'Off',
843
+ 1 => 'Optical AWL',
844
+ 2 => 'Optical/Radio AWL',
845
+ 3 => 'Radio AWL',
846
+ );
847
+
848
+ my %focusModeZ7 = (
849
+ 0 => 'Manual',
850
+ 1 => 'AF-S',
851
+ 2 => 'AF-C',
852
+ 4 => 'AF-F', # full frame
853
+ );
854
+
855
+ my %infoZSeries = (
856
+ Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i',
857
+ Notes => 'Z Series cameras thru Decemeber 2021',
858
+ );
859
+ my %iSOAutoHiLimitZ7 = (
860
+ 0 => 'ISO 64',
861
+ 1 => 'ISO 80',
862
+ 2 => 'ISO 100',
863
+ 3 => 'ISO 125',
864
+ 4 => 'ISO 160',
865
+ 5 => 'ISO 200',
866
+ 6 => 'ISO 250',
867
+ 7 => 'ISO 320',
868
+ 8 => 'ISO 400',
869
+ 9 => 'ISO 500',
870
+ 10 => 'ISO 640',
871
+ 11 => 'ISO 800',
872
+ 12 => 'ISO 1000',
873
+ 13 => 'ISO 1250',
874
+ 14 => 'ISO 1600',
875
+ 15 => 'ISO 2000',
876
+ 16 => 'ISO 2500',
877
+ 17 => 'ISO 3200',
878
+ 18 => 'ISO 4000',
879
+ 19 => 'ISO 5000',
880
+ 20 => 'ISO 6400',
881
+ 21 => 'ISO 8000',
882
+ 22 => 'ISO 10000',
883
+ 23 => 'ISO 12800',
884
+ 24 => 'ISO 16000',
885
+ 25 => 'ISO 20000',
886
+ 26 => 'ISO 25600',
887
+ 27 => 'ISO Hi 0.3',
888
+ 28 => 'ISO Hi 0.7',
889
+ 29 => 'ISO Hi 1.0',
890
+ 32 => 'ISO Hi 2.0',
891
+ );
892
+
893
+ my %meteringModeZ7 = (
894
+ 0 => 'Matrix',
895
+ 1 => 'Center',
896
+ 2 => 'Spot',
897
+ 3 => 'Highlight'
898
+ );
899
+
900
+ my %movieFrameRateZ7 = (
901
+ 0 => '120p',
902
+ 1 => '100p',
903
+ 2 => '60p',
904
+ 3 => '50p',
905
+ 4 => '30p',
906
+ 5 => '25p',
907
+ 6 => '24p',
908
+ );
909
+
910
+ my %offLowNormalHighZ7 = (
911
+ 0 => 'Off',
912
+ 1 => 'Low',
913
+ 2 => 'Normal',
914
+ 3 => 'High',
915
+ );
916
+
917
+ my %movieFrameSizeZ9 = (
918
+ 1 => '1920x1080',
919
+ 2 => '3840x2160',
920
+ 3 => '7680x4320',
921
+ );
922
+
923
+ my %subjectDetectionZ9 = (
924
+ 0 => 'Off',
925
+ 1 => 'Auto',
926
+ 2 => 'People',
927
+ 3 => 'Animals',
928
+ 4 => 'Vehicles',
929
+ );
930
+
931
+ my %vRModeZ9 = (
932
+ 0 => 'Off',
933
+ 1 => 'Normal',
934
+ 2 => 'Sport',
935
+ );
936
+
813
937
  my %retouchValues = ( #PH
814
938
  0 => 'None',
815
939
  3 => 'B & W',
@@ -1095,6 +1219,30 @@ my %binaryDataAttrs = (
1095
1219
  FIRST_ENTRY => 0,
1096
1220
  );
1097
1221
 
1222
+ my %base64bin = ( ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' );
1223
+ my %base64int32u = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); unpack("V",$$val)' );
1224
+ my %base64bytes = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); join(".",unpack("C*",$$val))' );
1225
+ my %base64double = (
1226
+ ValueConv => q{
1227
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1228
+ my $saveOrder = GetByteOrder();
1229
+ SetByteOrder('II');
1230
+ $val = GetDouble($val,0);
1231
+ SetByteOrder($saveOrder);
1232
+ return $val;
1233
+ },
1234
+ );
1235
+ my %base64coord = (
1236
+ ValueConv => q{
1237
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1238
+ my $saveOrder = GetByteOrder();
1239
+ SetByteOrder('II');
1240
+ $val = GetDouble($val,0) + GetDouble($val,8)/60 + GetDouble($val,16)/3600;
1241
+ SetByteOrder($saveOrder);
1242
+ return $val;
1243
+ },
1244
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
1245
+ );
1098
1246
  # Nikon maker note tags
1099
1247
  %Image::ExifTool::Nikon::Main = (
1100
1248
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikon,
@@ -1912,14 +2060,15 @@ my %binaryDataAttrs = (
1912
2060
  ByteOrder => 'BigEndian',
1913
2061
  },
1914
2062
  },
1915
- { # (Z6_2 firmware version 1.00 and Z7_2 firmware versions 1.00 & 1.01, ref 28)
2063
+ { # (Z6_2 firmware version 1.00 and Z7II firmware versions 1.00 & 1.01, ref 28)
1916
2064
  # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc
1917
2065
  Condition => '$$valPt =~ /^080[01234]/',
1918
- Name => 'ShotInfoZ7_2',
2066
+ Name => 'ShotInfoZ7II',
1919
2067
  SubDirectory => {
1920
- TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7_2',
2068
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',
1921
2069
  DecryptStart => 4,
1922
- DecryptLen => 0xcea6 + 1050, # thru decoded parts of Offset31
2070
+ # TODO: eventually set the length dynamically according to actual offsets!
2071
+ DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II
1923
2072
  ByteOrder => 'LittleEndian',
1924
2073
  },
1925
2074
  },
@@ -1929,11 +2078,12 @@ my %binaryDataAttrs = (
1929
2078
  SubDirectory => {
1930
2079
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
1931
2080
  DecryptStart => 4,
1932
- DecryptLen => 0xeb5b + 1050, # thru decoded parts of Offset27
2081
+ # TODO: eventually set the length dynamically according to actual offsets!
2082
+ DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
1933
2083
  ByteOrder => 'LittleEndian',
1934
2084
  },
1935
2085
  },
1936
- { # D7100=0227, Z6/Z7=0800
2086
+ { # D7100=0227
1937
2087
  Condition => '$$valPt =~ /^0[28]/',
1938
2088
  Name => 'ShotInfo02xx',
1939
2089
  SubDirectory => {
@@ -2164,7 +2314,7 @@ my %binaryDataAttrs = (
2164
2314
  },
2165
2315
  },
2166
2316
  {
2167
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
2317
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
2168
2318
  Name => 'LensData0800',
2169
2319
  SubDirectory => {
2170
2320
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -2299,8 +2449,8 @@ my %binaryDataAttrs = (
2299
2449
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' },
2300
2450
  },
2301
2451
  {
2302
- Name => 'FlashInfo0300', # (Z7_2)
2303
- Condition => '$$valPt =~ /^0300/',
2452
+ Name => 'FlashInfo0300', # (Z7II)
2453
+ Condition => '$$valPt =~ /^030[01]/',
2304
2454
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0300' },
2305
2455
  },
2306
2456
  {
@@ -2373,11 +2523,15 @@ my %binaryDataAttrs = (
2373
2523
  PrintConv => '$self->ConvertDateTime($val)',
2374
2524
  PrintConvInv => '$self->InverseDateTime($val,0)',
2375
2525
  },
2376
- 0x00b7 => { #JD
2526
+ 0x00b7 => [{
2527
+ Name => 'AFInfo2',
2528
+ Condition => '$$self{Model} =~ /^NIKON Z 9\b/i', #AFInfo2Version 0400
2529
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2V0400' },
2530
+ },{ #JD
2377
2531
  Name => 'AFInfo2',
2378
2532
  # (this structure may be byte swapped when rewritten by CaptureNX)
2379
2533
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' },
2380
- },
2534
+ }],
2381
2535
  0x00b8 => [{ #PH
2382
2536
  Name => 'FileInfo',
2383
2537
  # unfortunately, some newer models write this as little-endian
@@ -2638,15 +2792,23 @@ my %binaryDataAttrs = (
2638
2792
  },
2639
2793
  },
2640
2794
  # 5 - values: 0, 1 (VR On), 2 (VR Off)
2641
- 6 => {
2795
+ 6 => [{
2642
2796
  Name => 'VRMode',
2643
2797
  PrintConv => {
2644
- 0 => 'Normal', # (Z7 gives this value for "off" - PH)
2798
+ 0 => 'Off',
2799
+ 1 => 'Sport',
2800
+ 3 => 'Normal',
2801
+ },
2802
+ %infoZSeries
2803
+ },{
2804
+ Name => 'VRMode',
2805
+ PrintConv => {
2806
+ 0 => 'Normal',
2645
2807
  1 => 'On (1)', #PH (NC)
2646
2808
  2 => 'Active', # (1J1)
2647
2809
  3 => 'Sport', #PH (Z7)
2648
2810
  },
2649
- },
2811
+ }],
2650
2812
  # 7 - values: 0, 1
2651
2813
  );
2652
2814
 
@@ -3480,6 +3642,10 @@ my %binaryDataAttrs = (
3480
3642
  201 => 'Wide-area AF', #28 (D6)
3481
3643
  202 => 'Face-priority AF', #28 (D6)
3482
3644
  203 => 'Subject-tracking AF', #28 (D6)
3645
+ 204 => 'Dynamic Area (S)', #28 (Z9)
3646
+ 205 => 'Dynamic Area (M)', #28 (Z9)
3647
+ 206 => 'Dynamic Area (L)', #28 (Z9)
3648
+ 207 => '3D-tracking', #28 (Z9)
3483
3649
  },
3484
3650
  },
3485
3651
  ],
@@ -4007,6 +4173,47 @@ my %binaryDataAttrs = (
4007
4173
  },
4008
4174
  );
4009
4175
 
4176
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4177
+ %binaryDataAttrs,
4178
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4179
+ DATAMEMBER => [ 0 ],
4180
+ 0 => {
4181
+ Name => 'AFInfo2Version',
4182
+ Format => 'undef[4]',
4183
+ Writable => 0,
4184
+ RawConv => '$$self{AFInfo2Version} = $val',
4185
+ },
4186
+ 0x3e => {
4187
+ Name => 'AFImageWidth',
4188
+ Format => 'int16u',
4189
+ },
4190
+ 0x40 => {
4191
+ Name => 'AFImageHeight',
4192
+ Format => 'int16u',
4193
+ },
4194
+ 0x43 => {
4195
+ Name => 'FocusPositionHorizontal',
4196
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4197
+ },
4198
+ 0x45 => {
4199
+ Name => 'FocusPositionVertical',
4200
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4201
+ },
4202
+ 0x46 => {
4203
+ Name => 'AFAreaWidth',
4204
+ Format => 'int16u',
4205
+ Notes => 'size of AF area in AFImage pixels',
4206
+ RawConv => '$val ? $val : undef',
4207
+ },
4208
+ 0x48 => {
4209
+ Name => 'AFAreaHeight',
4210
+ Format => 'int16u',
4211
+ RawConv => '$val ? $val : undef',
4212
+ }
4213
+ # AFFocusResult is the result of the last AF operation and not necessarily an indication of the state of the of the capture (e.g., the subject may have moved or the image re-framed)
4214
+ #0x4a => { Name => 'AFFocusResult',PrintConv => {0=> "No Focus", 1=>"Focus"} }, #new tag created because Z9 uses a hybrid contrast/phase AF (closest former tag was ContrastDetectAFInFocus).
4215
+ );
4216
+
4010
4217
  # Nikon AF fine-tune information (ref 28)
4011
4218
  %Image::ExifTool::Nikon::AFTune = (
4012
4219
  %binaryDataAttrs,
@@ -4772,6 +4979,7 @@ my %nikonFocalConversions = (
4772
4979
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4773
4980
  24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
4774
4981
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4982
+ 28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4775
4983
  29 => 'Nikkor Z 28mm f/2.8', #IB
4776
4984
  },
4777
4985
  },
@@ -7284,9 +7492,7 @@ my %nikonFocalConversions = (
7284
7492
  WRITABLE => 1,
7285
7493
  FIRST_ENTRY => 0,
7286
7494
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7287
- NOTES => q{
7288
- These tags are extracted from encrypted data in images from the D4S.
7289
- },
7495
+ NOTES => 'These tags are extracted from encrypted data in images from the D4S.',
7290
7496
  0x00 => {
7291
7497
  Name => 'ShotInfoVersion',
7292
7498
  Format => 'string[4]',
@@ -7585,19 +7791,19 @@ my %nikonFocalConversions = (
7585
7791
  # note: DecryptLen currently set to 0x3697
7586
7792
  );
7587
7793
 
7588
- # shot information for the Z7_2 firmware 1.00 (encrypted) - ref 28
7589
- %Image::ExifTool::Nikon::ShotInfoZ7_2 = (
7794
+ # shot information for the Z7II firmware 1.00 (encrypted) - ref 28
7795
+ %Image::ExifTool::Nikon::ShotInfoZ7II = (
7590
7796
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7591
7797
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7592
7798
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7593
7799
  VARS => { ID_LABEL => 'Index' },
7594
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x30, 0x38, 0x98, 0xa0, 0x75e7,
7595
- 0x760c, 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7800
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x98, 0xa0, 0x75e7, 0x760c,
7801
+ 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7596
7802
  IS_SUBDIR => [ 0xceb8 ],
7597
7803
  WRITABLE => 1,
7598
7804
  FIRST_ENTRY => 0,
7599
7805
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7600
- NOTES => 'These tags are extracted from encrypted data in images from the Z7_2.',
7806
+ NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
7601
7807
  0x00 => {
7602
7808
  Name => 'ShotInfoVersion',
7603
7809
  Format => 'string[4]',
@@ -7614,14 +7820,12 @@ my %nikonFocalConversions = (
7614
7820
  Name => 'FirmwareVersion2',
7615
7821
  Format => 'string[8]',
7616
7822
  Writable => 0,
7617
- RawConv => '$$self{FirmwareVersion2} = $val',
7618
7823
  Hidden => 1,
7619
7824
  },
7620
7825
  0x18 => {
7621
7826
  Name => 'FirmwareVersion3',
7622
7827
  Format => 'string[8]',
7623
7828
  Writable => 0,
7624
- RawConv => '$$self{FirmwareVersion3} = $val',
7625
7829
  Hidden => 1,
7626
7830
  },
7627
7831
  0x24 => {
@@ -7663,12 +7867,12 @@ my %nikonFocalConversions = (
7663
7867
  Hidden => 1,
7664
7868
  RawConv => '$$self{Offset31} = $val || 0x10000000; undef', # (ignore if 0)
7665
7869
  },
7666
- ### 0x75e8 - Offset3 info start (Z7_2 firmware 1.30)
7870
+ ### 0x75e8 - Offset3 info start (Z7II firmware 1.30)
7667
7871
  0x75e7 => {
7668
7872
  Name => 'Hook1',
7669
7873
  Hidden => 1,
7670
7874
  RawConv => 'undef',
7671
- # account for variable location of Offset5 data
7875
+ # account for variable location of Offset3 data
7672
7876
  Hook => '$varSize = $$self{Offset3} - 0x75e8',
7673
7877
  },
7674
7878
  0x760c => {
@@ -7690,7 +7894,7 @@ my %nikonFocalConversions = (
7690
7894
  Format => 'int16u',
7691
7895
  Hidden => 1,
7692
7896
  },
7693
- ### 0x7f00 - Offset5 info start (Z7_2 firmware 1.30)
7897
+ ### 0x7f00 - Offset5 info start (Z7II firmware 1.30)
7694
7898
  0x7eff => {
7695
7899
  Name => 'Hook2',
7696
7900
  Hidden => 1,
@@ -7714,7 +7918,7 @@ my %nikonFocalConversions = (
7714
7918
  return "$color $brightness"
7715
7919
  },
7716
7920
  },
7717
- ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7921
+ ### 0xce32 - OrientationInfo start (Z7II firmware 1.00)
7718
7922
  0xce31 => {
7719
7923
  Name => 'Hook3',
7720
7924
  Hidden => 1,
@@ -7757,26 +7961,27 @@ my %nikonFocalConversions = (
7757
7961
  # account for variable location of Offset31 data
7758
7962
  Hook => '$varSize = $$self{Offset31} - 0xcea6',
7759
7963
  },
7760
- ### 0xcea6 - Offset31 info start (Z7_2 firmware 1.30)
7964
+ ### 0xcea6 - Offset31 info start (Z7II firmware 1.30)
7761
7965
  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)
7966
+ Name => 'MenuSettingsZ7IIOffset',
7967
+ # offset to MenuSettingsZ7II is relative to start of Offset31 block
7968
+ RawConv => '$$self{MenuSettingsZ7IIOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
7765
7969
  },
7766
7970
  0xceb7 => {
7767
7971
  Name => 'Hook5',
7768
7972
  Hidden => 1,
7769
7973
  RawConv => 'undef',
7770
7974
  # account for variable location of Offset5 data
7771
- Hook => '$varSize = $$self{ZMenuSettingsOffset} - 0xceb8',
7975
+ Hook => '$varSize = $$self{MenuSettingsZ7IIOffset} - 0xceb8',
7772
7976
  },
7773
- 0xceb8 => {
7774
- Name => 'ZMenuSettings',
7977
+ 0xceb8 => { # (this is 0xd04e for the Z50)
7978
+ Name => 'MenuSettingsZ7II',
7979
+ Format => 'undef[860]',
7775
7980
  SubDirectory => {
7776
- TagTable => 'Image::ExifTool::Nikon::ZMenuSettings',
7981
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II',
7777
7982
  },
7778
7983
  }
7779
- # note: DecryptLen currently set to 0xcea6 + 1050
7984
+ # note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e)
7780
7985
  );
7781
7986
 
7782
7987
  # shot information for the Z9 firmware 1.00 (encrypted) - ref 28
@@ -7785,7 +7990,9 @@ my %nikonFocalConversions = (
7785
7990
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7786
7991
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7787
7992
  VARS => { ID_LABEL => 'Index' },
7788
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x84, 0xeaea],
7993
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7994
+ 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
7995
+ IS_SUBDIR => [ 0xec4b ],
7789
7996
  WRITABLE => 1,
7790
7997
  FIRST_ENTRY => 0,
7791
7998
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7806,14 +8013,12 @@ my %nikonFocalConversions = (
7806
8013
  Name => 'FirmwareVersion2',
7807
8014
  Format => 'string[8]',
7808
8015
  Writable => 0,
7809
- RawConv => '$$self{FirmwareVersion2} = $val',
7810
8016
  Hidden => 1,
7811
8017
  },
7812
8018
  0x18 => {
7813
8019
  Name => 'FirmwareVersion3',
7814
8020
  Format => 'string[8]',
7815
8021
  Writable => 0,
7816
- RawConv => '$$self{FirmwareVersion3} = $val',
7817
8022
  Hidden => 1,
7818
8023
  },
7819
8024
  0x24 => {
@@ -7823,23 +8028,90 @@ my %nikonFocalConversions = (
7823
8028
  Writable => 0,
7824
8029
  Hidden => 1,
7825
8030
  },
8031
+ 0x30 => {
8032
+ Name => 'Offset3', #offset3 - length 2528 (Z9 firmware 1.0)
8033
+ DataMember => 'Offset3',
8034
+ Format => 'int32u',
8035
+ Writable => 0,
8036
+ Hidden => 1,
8037
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
8038
+ },
8039
+ 0x38 => {
8040
+ Name => 'Offset5', #offset5 - length 2488 (Z9 firmware 1.0)
8041
+ DataMember => 'Offset5',
8042
+ Format => 'int32u',
8043
+ Writable => 0,
8044
+ Hidden => 1,
8045
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
8046
+ },
7826
8047
  0x84 => {
7827
- Name => 'OrientationOffset', #offset24 - length 108
8048
+ Name => 'OrientationOffset', #offset24 - length 108 (Z9 firmware 1.0)
7828
8049
  DataMember => 'OrientationOffset',
7829
8050
  Format => 'int32u',
7830
8051
  Writable => 0,
7831
8052
  Hidden => 1,
7832
8053
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7833
8054
  },
7834
- ### 0xce32 - OrientationInfo start (Z9 firmware 1.00)
8055
+ 0x8c => {
8056
+ Name => 'Offset26', #offset26 - length 1895 (Z9 firmware 1.0)
8057
+ DataMember => 'Offset26',
8058
+ Format => 'int32u',
8059
+ Writable => 0,
8060
+ Hidden => 1,
8061
+ RawConv => '$$self{Offset26} = $val || 0x10000000; undef', # (ignore if 0)
8062
+ },
8063
+ ### 0x6c70 - Offset3 info start (Z9 firmware 1.00)
8064
+ 0x6c6f => {
8065
+ Name => 'Offset3Hook',
8066
+ Hidden => 1,
8067
+ RawConv => 'undef',
8068
+ # account for variable location of Offset3 data
8069
+ Hook => '$varSize = $$self{Offset3} - 0x6c70',
8070
+ },
8071
+ 0x6c98 => {
8072
+ Name => 'IntervalShooting',
8073
+ RawConv => '$$self{IntervalShooting} = $val',
8074
+ Format => 'int16u',
8075
+ PrintConv => q{
8076
+ return 'Off' if $val == 0 ;
8077
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
8078
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
8079
+ return "On: $i$f"
8080
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
8081
+ },
8082
+ },
8083
+ 0x6c9a => {
8084
+ Name => 'IntervalFrame',
8085
+ RawConv => '$$self{IntervalFrame} = $val',
8086
+ Condition => '$$self{IntervalShooting} > 0',
8087
+ Format => 'int16u',
8088
+ Hidden => 1,
8089
+ },
8090
+ ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8091
+ 0x7717 => {
8092
+ Name => 'Offsset5Hook',
8093
+ Hidden => 1,
8094
+ RawConv => 'undef',
8095
+ # account for variable location of Offset5 data
8096
+ Hook => '$varSize = $$self{Offset5} - 0x7718',
8097
+ },
8098
+ 0x7844 => {
8099
+ Name => 'FocusShiftShooting',
8100
+ RawConv => '$$self{FocusShiftShooting} = $val',
8101
+ PrintConv => q{
8102
+ return 'Off' if $val == 0 ;
8103
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8104
+ return "On: $i"
8105
+ },
8106
+ },
8107
+ ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
7835
8108
  0xeaea => {
7836
- Name => 'Hook1',
8109
+ Name => 'OrientationHook',
7837
8110
  Hidden => 1,
7838
8111
  RawConv => 'undef',
7839
8112
  # account for variable location of OrientationInfo data
7840
8113
  Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb',
7841
8114
  },
7842
-
7843
8115
  0xeaeb => {
7844
8116
  Name => 'RollAngle',
7845
8117
  Format => 'fixed32u',
@@ -7867,52 +8139,72 @@ my %nikonFocalConversions = (
7867
8139
  PrintConv => 'sprintf("%.1f", $val)',
7868
8140
  PrintConvInv => '$val',
7869
8141
  },
7870
- # note: DecryptLen currently set to 0xeb5b + 1050
8142
+ ### 0xeb5f - Offset26 info start (Z9 firmware 1.00)
8143
+ 0xeb6f => {
8144
+ Name => 'MenuSettingsZ9Offset',
8145
+ Writable => 0,
8146
+ Hidden => 1,
8147
+ # offset to MenuSettingsZ9 is relative to start of Offset26 block
8148
+ RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{Offset26}; undef', # (ignore if 0)
8149
+ },
8150
+ 0xeb70 => {
8151
+ Name => 'Hook5',
8152
+ Hidden => 1,
8153
+ RawConv => 'undef',
8154
+ # account for variable location of menu settings data
8155
+ Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b',
8156
+ },
8157
+ 0xec4b => {
8158
+ Name => 'MenuSettingsZ9',
8159
+ Format => 'undef[1646]',
8160
+ SubDirectory => {
8161
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8162
+ },
8163
+ },
8164
+ # note: DecryptLen currently set to 0xec4b + 1646
7871
8165
  );
7872
8166
 
7873
- %Image::ExifTool::Nikon::ZMenuSettings = (
8167
+ %Image::ExifTool::Nikon::MenuSettingsZ7II = (
7874
8168
  %binaryDataAttrs,
7875
8169
  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 ],
8170
+ DATAMEMBER => [ 176, 180, 328, 352, 858 ],
8171
+ NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.',
7880
8172
  160 => {
7881
8173
  Name => 'IntervalDurationHours',
7882
8174
  Format => 'int32u',
7883
- Condition => '$$self{IntervalShooting} > 0',
8175
+ #Condition => '$$self{IntervalShooting} > 0',
7884
8176
  },
7885
8177
  164 => {
7886
8178
  Name => 'IntervalDurationMinutes',
7887
8179
  Format => 'int32u',
7888
- Condition => '$$self{IntervalShooting} > 0',
8180
+ #Condition => '$$self{IntervalShooting} > 0',
7889
8181
  },
7890
8182
  168 => {
7891
8183
  Name => 'IntervalDurationSeconds',
7892
8184
  Format => 'int32u',
7893
- Condition => '$$self{IntervalShooting} > 0',
8185
+ #Condition => '$$self{IntervalShooting} > 0',
7894
8186
  },
7895
8187
  176 => {
7896
8188
  Name => 'Intervals',
7897
8189
  Format => 'int32u',
7898
8190
  RawConv => '$$self{IntervalShootingIntervals} = $val',
7899
- Condition => '$$self{IntervalShooting} > 0',
8191
+ #Condition => '$$self{IntervalShooting} > 0',
7900
8192
  },
7901
8193
  180 => {
7902
8194
  Name => 'ShotsPerInterval',
7903
8195
  Format => 'int32u',
7904
8196
  RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
7905
- Condition => '$$self{IntervalShooting} > 0',
8197
+ #Condition => '$$self{IntervalShooting} > 0',
7906
8198
  },
7907
8199
  184 => {
7908
8200
  Name => 'IntervalExposureSmoothing',
7909
- Condition => '$$self{IntervalShooting} > 0',
8201
+ #Condition => '$$self{IntervalShooting} > 0',
7910
8202
  Format => 'int8u',
7911
8203
  PrintConv => \%offOn,
7912
8204
  },
7913
8205
  186 => {
7914
8206
  Name => 'IntervalPriority',
7915
- Condition => '$$self{IntervalShooting} > 0',
8207
+ #Condition => '$$self{IntervalShooting} > 0',
7916
8208
  Format => 'int8u',
7917
8209
  PrintConv => \%offOn,
7918
8210
  },
@@ -7955,16 +8247,11 @@ my %nikonFocalConversions = (
7955
8247
  3 => 'Highlight'
7956
8248
  },
7957
8249
  },
8250
+ 326 => { Name => 'NikonMeteringMode', PrintConv => \%meteringModeZ7},
7958
8251
  328 => {
7959
8252
  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
8253
  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
- },
8254
+ PrintConv => \%flashControlModeZ7,
7968
8255
  },
7969
8256
  334 => {
7970
8257
  Name => 'FlashGNDistance',
@@ -7982,25 +8269,8 @@ my %nikonFocalConversions = (
7982
8269
  PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
7983
8270
  PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
7984
8271
  },
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
- },
8272
+ 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8273
+ 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8004
8274
  352 => {
8005
8275
  Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
8006
8276
  RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
@@ -8038,27 +8308,8 @@ my %nikonFocalConversions = (
8038
8308
  #444 => BracketProgram
8039
8309
  #446 => BracketIncrement
8040
8310
  #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
- },
8311
+ 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8312
+ 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8062
8313
  506 => {
8063
8314
  Name => 'MovieSlowMotion',
8064
8315
  Unknown => 1,
@@ -8083,72 +8334,13 @@ my %nikonFocalConversions = (
8083
8334
  Format => 'int16u',
8084
8335
  Unknown => 1,
8085
8336
  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
- },
8337
+ ValueConvInv => '8 * ($val + 104)',
8338
+ PrintConv => \%iSOAutoHiLimitZ7,
8119
8339
  },
8120
8340
  #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
- },
8341
+ 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8342
+ 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8343
+ 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8152
8344
  576 => {
8153
8345
  Name => 'MovieVignetteControlSameAsPhoto',
8154
8346
  Unknown => 1,
@@ -8164,16 +8356,7 @@ my %nikonFocalConversions = (
8164
8356
  Unknown => 1,
8165
8357
  PrintConv => \%offOn
8166
8358
  },
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
- },
8359
+ 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8177
8360
  #586 => MovieAFAreaMode
8178
8361
  590 => {
8179
8362
  Name => 'MovieVibrationReduction',
@@ -8202,6 +8385,400 @@ my %nikonFocalConversions = (
8202
8385
  },
8203
8386
  #859 => HDMIViewAssist
8204
8387
  );
8388
+
8389
+ %Image::ExifTool::Nikon::MenuSettingsZ9 = (
8390
+ %binaryDataAttrs,
8391
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8392
+ DATAMEMBER => [ 140, 188, 192, 232, 424, 534 ],
8393
+ IS_SUBDIR => [ 799 ],
8394
+ NOTES => 'These tags are used by the Z9.',
8395
+ #90 ISO
8396
+ 140 => {
8397
+ Name => 'MultipleExposureMode',
8398
+ RawConv => '$$self{MultipleExposureMode} = $val',
8399
+ PrintConv => {
8400
+ 0 => 'Off',
8401
+ 1 => 'On (Series)',
8402
+ 2 => 'On',
8403
+ },
8404
+ },
8405
+ 142 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0' }, #range 2-9
8406
+ 188 => {
8407
+ Name => 'Intervals',
8408
+ Format => 'int32u',
8409
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
8410
+ Condition => '$$self{IntervalShooting} > 0',
8411
+ },
8412
+ 192 => {
8413
+ Name => 'ShotsPerInterval',
8414
+ Format => 'int32u',
8415
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8416
+ Condition => '$$self{IntervalShooting} > 0',
8417
+ },
8418
+ #220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
8419
+ 232 => {
8420
+ Name => 'FocusShiftNumberShots', #1-300
8421
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
8422
+ Condition => '$$self{FocusShiftShooting} > 0',
8423
+ },
8424
+ 236 => {
8425
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8426
+ Condition => '$$self{FocusShiftShooting} > 0',
8427
+ },
8428
+ 240 => {
8429
+ Name => 'FocusShiftInterval',
8430
+ Condition => '$$self{FocusShiftShooting} > 0',
8431
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8432
+ },
8433
+ 244 => {
8434
+ Name => 'FocusShiftExposureLock',
8435
+ Unknown => 1,
8436
+ PrintConv => \%offOn,
8437
+ Condition => '$$self{FocusShiftShooting} > 0',
8438
+ },
8439
+ 274 => {
8440
+ Name => 'PhotoShootingMenuBank',
8441
+ PrintConv => {
8442
+ 0 => 'A',
8443
+ 1 => 'B',
8444
+ 2 => 'C',
8445
+ 3 => 'D',
8446
+ },
8447
+ },
8448
+ 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn, }, #single tag from both Photo & Video menus
8449
+ 308 => {
8450
+ Name => 'PhotoShootingMenuBankImageArea',
8451
+ PrintConv => {
8452
+ 0 => 'FX',
8453
+ 1 => 'DX',
8454
+ 4 => '16:9',
8455
+ 8 => '1:1',
8456
+ },
8457
+ },
8458
+ #310 ImageQuality
8459
+ 322 => { Name => 'AutoISO', PrintConv => \%offOn, },
8460
+ 324 => {
8461
+ Name => 'ISOAutoHiLimit',
8462
+ Format => 'int16u',
8463
+ Unknown => 1,
8464
+ ValueConv => '($val-104)/8',
8465
+ ValueConvInv => '8 * ($val + 104)',
8466
+ PrintConv => \%iSOAutoHiLimitZ7,
8467
+ },
8468
+ 326 => {
8469
+ Name => 'ISOAutoFlashLimit',
8470
+ Format => 'int16u',
8471
+ Unknown => 1,
8472
+ ValueConv => '($val-104)/8',
8473
+ ValueConvInv => '8 * ($val + 104)',
8474
+ PrintConv => \%iSOAutoHiLimitZ7,
8475
+ },
8476
+ #332 ISOAutoShutterTime - Auto setting 0=> 'Auto (Slowest)', 1 => 'Auto (Slower)', 2=> 'Auto', 3=> 'Auto (Faster)', 4=> 'Auto (Fastest)'
8477
+ 334 => {
8478
+ Name => 'ISOAutoShutterTime', #shutter speed is 2 ** (-$val/24)
8479
+ ValueConv => '$val / 8',
8480
+ Format => 'int16s',
8481
+ PrintConv => {
8482
+ -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15
8483
+ -12 => '15 s',
8484
+ -9 => '8 s',
8485
+ -6 => '4 s',
8486
+ -3 => '2 s',
8487
+ 0 => '1 s',
8488
+ 1 => '1/1.3 s',
8489
+ 2 => '1/1.6 s',
8490
+ 3 => '1/2 s',
8491
+ 4 => '1/2.5 s',
8492
+ 5 => '1/3 s',
8493
+ 6 => '1/4 s',
8494
+ 7 => '1/5 s',
8495
+ 8 => '1/6 s',
8496
+ 9 => '1/8 s',
8497
+ 10 => '1/10 s',
8498
+ 11 => '1/13 s',
8499
+ 12 => '1/15 s',
8500
+ 13 => '1/20 s',
8501
+ 14 => '1/25 s',
8502
+ 15 => '1/30 s',
8503
+ 16 => '1/40 s',
8504
+ 17 => '1/50 s',
8505
+ 18 => '1/60 s',
8506
+ 19 => '1/80 s',
8507
+ 20 => '1/100 s',
8508
+ 21 => '1/120 s',
8509
+ 22 => '1/160 s',
8510
+ 23 => '1/200 s',
8511
+ 24 => '1/250 s',
8512
+ 25 => '1/320 s',
8513
+ 26 => '1/400 s',
8514
+ 27 => '1/500 s',
8515
+ 28 => '1/640 s',
8516
+ 29 => '1/800 s',
8517
+ 30 => '1/1000 s',
8518
+ 31 => '1/1250 s',
8519
+ 32 => '1/1600 s',
8520
+ 33 => '1/2000 s',
8521
+ 34 => '1/2500 s',
8522
+ 35 => '1/3200 s',
8523
+ 36 => '1/4000 s',
8524
+ 37 => '1/5000 s',
8525
+ 37.5 => '1/6000 s',
8526
+ 38 => '1/6400 s',
8527
+ 39 => '1/8000 s',
8528
+ 40 => '1/10000 s',
8529
+ 40.5 => '1/12000 s',
8530
+ 41 => '1/13000 s',
8531
+ 42 => '1/16000 s',
8532
+ },
8533
+ },
8534
+ #336 WhiteBalance
8535
+ #406 PictureControl
8536
+ #408 ColorSpace
8537
+ #410 ActiveD-Lighting
8538
+ #412 => { Name => 'NoiseReduction', PrintConv => \%offOn }, #Long Exposure Noise Reduction
8539
+ #414 HighISONoiseReduction
8540
+ #414 VignetteControl
8541
+ 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8542
+ 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8543
+ #419 AutoDistortionControl #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8544
+ 420 => { Name => 'FlickerReductionShooting', PrintConv => \%offOn },
8545
+ #422 MeteringMode
8546
+ 424 => {
8547
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
8548
+ RawConv => '$$self{FlashControlMode} = $val',
8549
+ PrintConv => \%flashControlModeZ7,
8550
+ },
8551
+ 426 => {
8552
+ Name => 'FlashMasterCompensation',
8553
+ Format => 'int8s',
8554
+ Unknown => 1,
8555
+ ValueConv => '$val/6',
8556
+ ValueConvInv => '6 * $val',
8557
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8558
+ PrintConvInv => '$val',
8559
+ },
8560
+ 430 => {
8561
+ Name => 'FlashGNDistance',
8562
+ Condition => '$$self{FlashControlMode} == 2',
8563
+ Unknown => 1,
8564
+ ValueConv => '$val + 3',
8565
+ PrintConv => \%flashGNDistance,
8566
+ },
8567
+ 434 => {
8568
+ 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)
8569
+ Condition => '$$self{FlashControlMode} >= 3',
8570
+ Unknown => 1,
8571
+ ValueConv => '2 ** (-$val/3)',
8572
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8573
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8574
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8575
+ },
8576
+ #442 flash wirelss control 0=> 'Off' 1=> 'CMD'
8577
+ 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8578
+ 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8579
+ #526 FocusMode
8580
+ 528 => {
8581
+ Name => 'AFAreaMode',
8582
+ PrintConv => {
8583
+ 1 => 'Single',
8584
+ 2 => 'Dynamic',
8585
+ 3 => 'Wide (S)',
8586
+ 4 => 'Wide (L)',
8587
+ 5 => '3D',
8588
+ 6 => 'Auto',
8589
+ },
8590
+ },
8591
+ 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8592
+ 534 => {
8593
+ Name => 'BracketSet',
8594
+ RawConv => '$$self{BracketSet} = $val',
8595
+ PrintConv => {
8596
+ 0 => 'AE/Flash',
8597
+ 1 => 'AE',
8598
+ 2 => 'Flash',
8599
+ 3 => 'White Balance',
8600
+ 4 => 'Active-D Lighting',
8601
+ },
8602
+ },
8603
+ 536 => {
8604
+ Name => 'BracketProgram',
8605
+ Condition => '$$self{BracketSet} < 3',
8606
+ Notes => 'AE and/or Flash Bracketing',
8607
+ PrintConv => {
8608
+ 0 => 'Disabled',
8609
+ 2 => '2F',
8610
+ 3 => '3F',
8611
+ 4 => '4F',
8612
+ 5 => '5F',
8613
+ 7 => '7F',
8614
+ 9 => '9F',
8615
+ },
8616
+ },
8617
+ 538 => {
8618
+ Name => 'BracketIncrement',
8619
+ Condition => '$$self{BracketSet} < 3',
8620
+ Notes => 'AE and/or Flash Bracketing',
8621
+ PrintConv => {
8622
+ 0 => '0.3',
8623
+ #1 => '0.5',
8624
+ 2 => '0.7',
8625
+ 3 => '1.0',
8626
+ 4 => '2.0',
8627
+ 5 => '3.0',
8628
+ },
8629
+ },
8630
+ #544 BracketProgram for ADL
8631
+ 556 => {
8632
+ Name => 'SecondarySlotFunction',
8633
+ PrintConv => {
8634
+ 0 => 'Overflow',
8635
+ 1 => 'Backup',
8636
+ 2 => 'NEF Primary + JPG Secondary',
8637
+ 3 => 'JPG Primary + JPG Secondary',
8638
+ },
8639
+ },
8640
+ 572 => { Name => 'DXCropAlert', PrintConv => \%offOn, },
8641
+ 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9},
8642
+ 604 => {
8643
+ Name => 'MovieImageArea',
8644
+ Unknown => 1,
8645
+ Mask => 0x01, #without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
8646
+ PrintConv => {
8647
+ 0 => 'FX',
8648
+ 1 => 'DX',
8649
+ },
8650
+ },
8651
+ 614 => {
8652
+ Name => 'MovieType',
8653
+ Unknown => 1,
8654
+ PrintConv => {
8655
+ 1 => 'H.265 8-bit (MP4)',
8656
+ 2 => 'H.265 8-bit (MOV)',
8657
+ 3 => 'H.265 10-bit (MOV)',
8658
+ 4 => 'ProRes 422 HQ 10-bit (MOV)',
8659
+ },
8660
+ },
8661
+ 616 => {
8662
+ Name => 'MovieISOAutoHiLimit',
8663
+ Format => 'int16u',
8664
+ Unknown => 1,
8665
+ ValueConv => '($val-104)/8',
8666
+ ValueConvInv => '8 * ($val + 104)',
8667
+ PrintConv => \%iSOAutoHiLimitZ7,
8668
+ },
8669
+ 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1},
8670
+ 620 => {
8671
+ Name => 'MovieISOAutoManualMode',
8672
+ Format => 'int16u',
8673
+ Unknown => 1,
8674
+ ValueConv => '($val-104)/8',
8675
+ ValueConvInv => '8 * ($val + 104)',
8676
+ PrintConv => \%iSOAutoHiLimitZ7,
8677
+ },
8678
+ 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8679
+ 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8680
+ 704 => {
8681
+ Name => 'MovieFlickerReduction',
8682
+ PrintConv => {
8683
+ 0 => 'Auto',
8684
+ 1 => '50Hz',
8685
+ 2 => '60Hz',
8686
+ },
8687
+ },
8688
+ 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, , Unknown => 1},
8689
+ 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8690
+ 710 => {
8691
+ Name => 'MovieAFAreaMode',
8692
+ PrintConv => {
8693
+ 1 => 'Single',
8694
+ 3 => 'Wide (S)',
8695
+ 4 => 'Wide (L)',
8696
+ 6 => 'Auto',
8697
+ 11 => 'Subject Tracking',
8698
+ },
8699
+ },
8700
+ 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1},
8701
+ 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8702
+ 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'On', 2 => 'On' }, Unknown => 1 }, #not sure why the unusal mapping with 2 => 'On'
8703
+ 720 => { Name => 'MicrophoneSensitivity', Unknown => 1}, #1-20
8704
+ 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8705
+ 724 => { Name => 'MicrophoneFrequencyResponse', PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
8706
+ 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
8707
+ 748 => {
8708
+ Name => 'MovieToneMap',
8709
+ Unknown => 1,
8710
+ PrintConv => {
8711
+ 0 => 'SDR',
8712
+ 1 => 'HLG',
8713
+ 2 => 'N-Log',
8714
+ },
8715
+ },
8716
+ 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8717
+ 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8718
+ 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
8719
+ 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
8720
+ 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1},
8721
+ 799 => {
8722
+ Name => 'CustomSettingsZ9',
8723
+ Format => 'undef[608]',
8724
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' },
8725
+ },
8726
+ 1426 => {
8727
+ Name => 'Language',
8728
+ Unknown => 1,
8729
+ PrintConv => {
8730
+ 4 => 'English',
8731
+ 5 => 'Spanish',
8732
+ 7 => 'French',
8733
+ },
8734
+ },
8735
+ 1428 => {
8736
+ Name => 'TimeZone',
8737
+ PrintConv => {
8738
+ 5 => '+09:00 (Tokyo)',
8739
+ 6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8740
+ 10 => '+05:45 (Kathmandu)',
8741
+ 11 => '+05:30 (New Dehli)',
8742
+ 16 => '+03:00 (Moscow, Nairobi)',
8743
+ 15 => '+02:00 (Athens)',
8744
+ 16 => '+01:00 (Madrid, Paris, Berlin)',
8745
+ 17 => '+02:00 (Athens, Helsinki)',
8746
+ 18 => '+00:00 (London)',
8747
+ 19 => '+00:00', #PH (unknown city)
8748
+ 22 => '-03:00 (Buenos Aires, Sao Paulo)',
8749
+ 24 => '-04:00 (Manaus, Caracas)',
8750
+ 25 => '-05:00 (New York, Toronto, Lima)',
8751
+ 26 => '-06:00 (Chicago, Mexico City)',
8752
+ 27 => '-07:00 (Denver)',
8753
+ 28 => '-08:00 (Los Angeles, Vancouver)',
8754
+ 29 => '-09:00 (Anchorage)',
8755
+ 30 => '-10:00 (Hawaii)',
8756
+ },
8757
+ },
8758
+ 1434 => {Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1}, # settings: -5 to +5
8759
+ 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
8760
+ 1552 => {
8761
+ Name => 'HDMIOutputResolution',
8762
+ PrintConv => {
8763
+ 0 => 'Auto',
8764
+ 1 => '4320p',
8765
+ 2 => '2160p',
8766
+ 3 => '1080p',
8767
+ #4 => '1080i',
8768
+ 5 => '720p',
8769
+ #6 => '576p',
8770
+ #7 => '480p',
8771
+ },
8772
+ },
8773
+ 1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
8774
+ 1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
8775
+ 1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
8776
+ 1608 => { Name => 'EnergySavingMode', PrintConv =>\%offOn, Unknown => 1 },
8777
+ 1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
8778
+ 1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
8779
+ 1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
8780
+ );
8781
+
8205
8782
  # Flash information (ref JD)
8206
8783
  %Image::ExifTool::Nikon::FlashInfo0100 = (
8207
8784
  %binaryDataAttrs,
@@ -9421,7 +9998,7 @@ my %nikonFocalConversions = (
9421
9998
  ],
9422
9999
  );
9423
10000
 
9424
- # Flash information for the Z7_2 (ref 28)
10001
+ # Flash information for the Z7II (ref 28)
9425
10002
  # (likey similar to FlashInfo010 and FlashInfo0108 with addition of support for radio controlled units such as the SB-5000?
9426
10003
  %Image::ExifTool::Nikon::FlashInfo0300 = (
9427
10004
  %binaryDataAttrs,
@@ -9445,7 +10022,7 @@ my %nikonFocalConversions = (
9445
10022
  SeparateTable => 'FlashFirmware',
9446
10023
  PrintConv => \%flashFirmware,
9447
10024
  },
9448
- 27 => {
10025
+ 10 => {
9449
10026
  Name => 'FlashCompensation',
9450
10027
  # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
9451
10028
  # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
@@ -10373,7 +10950,7 @@ my %nikonFocalConversions = (
10373
10950
  },
10374
10951
  },
10375
10952
  {
10376
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
10953
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
10377
10954
  Name => 'LensData0800',
10378
10955
  SubDirectory => {
10379
10956
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -10458,6 +11035,103 @@ my %nikonFocalConversions = (
10458
11035
  },
10459
11036
  );
10460
11037
 
11038
+ # Nikon XMP tags written in NKSC metadata
11039
+ %Image::ExifTool::Nikon::ast = (
11040
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-ast', 2 => 'Image' },
11041
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11042
+ NAMESPACE => 'ast',
11043
+ VARS => { NO_ID => 1 },
11044
+ NOTES => 'Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers.',
11045
+ about => { },
11046
+ version => { },
11047
+ XMLPackets => {
11048
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
11049
+ Encoding => 'Base64',
11050
+ Binary => 1,
11051
+ },
11052
+ IPTC => {
11053
+ SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' },
11054
+ Encoding => 'Base64',
11055
+ Binary => 1,
11056
+ },
11057
+ GPSVersionID => { Groups => { 2 => 'Location' }, %base64bytes },
11058
+ GPSLatitudeRef => {
11059
+ Groups => { 2 => 'Location' },
11060
+ %base64int32u,
11061
+ PrintConv => { 0 => 'North', 1 => 'South' }, #PH (NC)
11062
+ },
11063
+ GPSLatitude => { Groups => { 2 => 'Location' }, %base64coord },
11064
+ GPSLongitudeRef => {
11065
+ Groups => { 2 => 'Location' },
11066
+ %base64int32u,
11067
+ PrintConv => { 2 => 'East', 3 => 'West' }, #PH (NC)
11068
+ },
11069
+ GPSLongitude => { Groups => { 2 => 'Location' }, %base64coord },
11070
+ GPSAltitudeRef => {
11071
+ Groups => { 2 => 'Location' },
11072
+ %base64bytes,
11073
+ PrintConv => {
11074
+ 0 => 'Above Sea Level',
11075
+ 1 => 'Below Sea Level',
11076
+ },
11077
+ },
11078
+ GPSAltitude => {
11079
+ Groups => { 2 => 'Location' },
11080
+ %base64double,
11081
+ PrintConv => '"$val m"',
11082
+ },
11083
+ GPSMapDatum => { Groups => { 2 => 'Location' } },
11084
+ GPSImgDirection => {
11085
+ Groups => { 2 => 'Location' },
11086
+ %base64double,
11087
+ PrintConv => 'sprintf("%.2f", $val)',
11088
+ },
11089
+ GPSImgDirectionRef => {
11090
+ Groups => { 2 => 'Location' },
11091
+ PrintConv => {
11092
+ M => 'Magnetic North',
11093
+ T => 'True North',
11094
+ },
11095
+ },
11096
+ );
11097
+ %Image::ExifTool::Nikon::sdc = (
11098
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' },
11099
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11100
+ NAMESPACE => 'sdc',
11101
+ VARS => { NO_ID => 1 },
11102
+ about => { },
11103
+ version => { },
11104
+ appversion => { Name => 'AppVersion' },
11105
+ appname => { Name => 'AppName' },
11106
+ );
11107
+ %Image::ExifTool::Nikon::nine = (
11108
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-nine', 2 => 'Image' },
11109
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11110
+ NAMESPACE => 'nine',
11111
+ VARS => { NO_ID => 1 },
11112
+ about => { },
11113
+ version => { },
11114
+ Label => { },
11115
+ Rating => { },
11116
+ Trim => { %base64bin },
11117
+ NineEdits => {
11118
+ SubDirectory => {
11119
+ TagTable => 'Image::ExifTool::Nikon::NineEdits',
11120
+ IgnoreProp => { userData => 1 }, # remove "UserData" from already overly long tag names
11121
+ },
11122
+ Binary => 1,
11123
+ },
11124
+ );
11125
+ %Image::ExifTool::Nikon::NineEdits = (
11126
+ GROUPS => { 0 => 'XML', 1 => 'NineEdits', 2 => 'Image' },
11127
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11128
+ VARS => { NO_ID => 1 },
11129
+ NOTES => 'XML-based tags used to store editing information.',
11130
+ filterParametersBinary => { %base64bin },
11131
+ filterParametersExportExportData => { %base64bin },
11132
+ filterParametersCustomCustomData => { %base64bin },
11133
+ );
11134
+
10461
11135
  # Nikon composite tags
10462
11136
  %Image::ExifTool::Nikon::Composite = (
10463
11137
  GROUPS => { 2 => 'Camera' },
@@ -10649,7 +11323,7 @@ sub PrintAFPointsLeftRight($$)
10649
11323
 
10650
11324
  #------------------------------------------------------------------------------
10651
11325
  # Print conversion for relative Up/Down AF points (ref 28)
10652
- # Inputs: 0) column, 1) number of columns
11326
+ # Inputs: 0) row, 1) number of rows
10653
11327
  # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
10654
11328
  sub PrintAFPointsUpDown($$)
10655
11329
  {
@@ -10851,6 +11525,72 @@ sub SerialKey($$)
10851
11525
  return 0x60; # D200 (ref 10), D40X (ref PH), etc
10852
11526
  }
10853
11527
 
11528
+ #------------------------------------------------------------------------------
11529
+ # Extract information from "NIKON APP" trailer (ref PH)
11530
+ # Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info
11531
+ # Returns: true on success
11532
+ sub ProcessNikonApp($;$)
11533
+ {
11534
+ local $_;
11535
+ my ($et, $dirInfo) = @_;
11536
+ my $raf = $$et{RAF};
11537
+ my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
11538
+ my $buff;
11539
+
11540
+ return 0 unless $raf->Seek(-20-$offset, 2) and $raf->Read($buff, 20) == 20 and
11541
+ substr($buff,-16) eq "\0\0\0\0\0\0/NIKON APP"; # check magic number
11542
+
11543
+ my $verbose = $et->Options('Verbose');
11544
+ my $fileEnd = $raf->Tell();
11545
+ my $trailerLen = unpack('N', $buff);
11546
+ $trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0;
11547
+ if ($dirInfo) {
11548
+ $$dirInfo{DirLen} = $trailerLen if $dirInfo;
11549
+ $$dirInfo{DataPos} = $fileEnd - $trailerLen;
11550
+ if ($$dirInfo{OutFile}) {
11551
+ if ($$et{DEL_GROUP}{NikonApp}) {
11552
+ ++$$et{CHANGED};
11553
+ # just copy the trailer when writing
11554
+ } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or
11555
+ $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen)
11556
+ {
11557
+ return 0;
11558
+ } else {
11559
+ return 1;
11560
+ }
11561
+ }
11562
+ $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
11563
+ }
11564
+ unless ($trailerLen >= 0x40 and $raf->Seek($fileEnd - $trailerLen, 0) and
11565
+ $raf->Read($buff, 0x40) == 0x40 and $buff =~ m(NIKON APP\0))
11566
+ {
11567
+ $et->Warn('Error reading NikonApp trailer');
11568
+ return 0;
11569
+ }
11570
+ $$et{SET_GROUP0} = 'NikonApp';
11571
+ while ($raf->Read($buff, 8) == 8) {
11572
+ my ($id, $len) = unpack('N2', $buff);
11573
+ if ($len & 0x80000000) {
11574
+ $et->Warn('Invalid NikonApp record length');
11575
+ last;
11576
+ }
11577
+ last if $id == 0 and $len == 0;
11578
+ unless ($raf->Read($buff, $len) == $len) {
11579
+ $et->Warn('Truncated NikonApp record');
11580
+ last;
11581
+ }
11582
+ if ($id == 1) {
11583
+ require Image::ExifTool::XMP;
11584
+ Image::ExifTool::XMP::ProcessXMP($et, { DataPt => \$buff });
11585
+ } else { # (haven't seen any other types of records)
11586
+ $et->Warn("Unknown NikonApp record $id");
11587
+ last;
11588
+ }
11589
+ }
11590
+ delete $$et{SET_GROUP0};
11591
+ return 1;
11592
+ }
11593
+
10854
11594
  #------------------------------------------------------------------------------
10855
11595
  # Read Nikon NCTG tags in MOV videos
10856
11596
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -11192,7 +11932,7 @@ Nikon maker notes in EXIF information.
11192
11932
 
11193
11933
  =head1 AUTHOR
11194
11934
 
11195
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
11935
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
11196
11936
 
11197
11937
  This library is free software; you can redistribute it and/or modify it
11198
11938
  under the same terms as Perl itself.