exiftool-vendored.exe 12.33.0 → 12.40.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 (200) hide show
  1. package/LICENSE +254 -247
  2. package/bin/exiftool_files/Changes +116 -0
  3. package/bin/exiftool_files/README +45 -45
  4. package/bin/exiftool_files/config_files/acdsee.config +6 -6
  5. package/bin/exiftool_files/config_files/photoshop_paths.config +30 -7
  6. package/bin/exiftool_files/config_files/picasa_faces.config +1 -1
  7. package/bin/exiftool_files/config_files/pix4d.config +2 -2
  8. package/bin/exiftool_files/config_files/tiff_version.config +2 -2
  9. package/bin/exiftool_files/exiftool.pl +112 -82
  10. package/bin/exiftool_files/lib/File/RandomAccess.pm +1 -1
  11. package/bin/exiftool_files/lib/File/RandomAccess.pod +2 -2
  12. package/bin/exiftool_files/lib/Image/ExifTool/AES.pm +1 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/AFCP.pm +1 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/APP12.pm +1 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/ASF.pm +1 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +1 -1
  19. package/bin/exiftool_files/lib/Image/ExifTool/Audible.pm +1 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/BMP.pm +1 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/BPG.pm +1 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/BZZ.pm +1 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/BigTIFF.pm +1 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +15 -4
  25. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +1 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +225 -13
  27. package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +13 -3
  28. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +1 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/CaptureOne.pm +1 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/Casio.pm +1 -1
  32. package/bin/exiftool_files/lib/Image/ExifTool/Charset.pm +3 -1
  33. package/bin/exiftool_files/lib/Image/ExifTool/DICOM.pm +1 -1
  34. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +1 -1
  35. package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +1 -1
  36. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +1 -1
  37. package/bin/exiftool_files/lib/Image/ExifTool/DV.pm +1 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +3 -3
  39. package/bin/exiftool_files/lib/Image/ExifTool/DjVu.pm +1 -1
  40. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +1 -1
  41. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +64 -20
  42. package/bin/exiftool_files/lib/Image/ExifTool/FITS.pm +1 -1
  43. package/bin/exiftool_files/lib/Image/ExifTool/FLAC.pm +1 -1
  44. package/bin/exiftool_files/lib/Image/ExifTool/FLIF.pm +1 -1
  45. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +48 -11
  46. package/bin/exiftool_files/lib/Image/ExifTool/Fixup.pm +1 -1
  47. package/bin/exiftool_files/lib/Image/ExifTool/Flash.pm +1 -1
  48. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +1 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +1 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/FotoStation.pm +1 -1
  51. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -1
  52. package/bin/exiftool_files/lib/Image/ExifTool/GE.pm +1 -1
  53. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +6 -2
  54. package/bin/exiftool_files/lib/Image/ExifTool/GIMP.pm +1 -1
  55. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +15 -11
  56. package/bin/exiftool_files/lib/Image/ExifTool/GeoTiff.pm +1 -1
  57. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +4 -3
  58. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +1 -1
  59. package/bin/exiftool_files/lib/Image/ExifTool/H264.pm +1 -1
  60. package/bin/exiftool_files/lib/Image/ExifTool/HP.pm +1 -1
  61. package/bin/exiftool_files/lib/Image/ExifTool/HTML.pm +1 -1
  62. package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +1 -1
  63. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +97 -5
  64. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +1 -1
  65. package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +1 -1
  66. package/bin/exiftool_files/lib/Image/ExifTool/ISO.pm +1 -1
  67. package/bin/exiftool_files/lib/Image/ExifTool/ITC.pm +1 -1
  68. package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +1 -1
  69. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  70. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +6 -2
  71. package/bin/exiftool_files/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  72. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +1 -1
  73. package/bin/exiftool_files/lib/Image/ExifTool/JVC.pm +1 -1
  74. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +109 -12
  75. package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +1 -1
  76. package/bin/exiftool_files/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  77. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +1 -1
  78. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +1 -1
  79. package/bin/exiftool_files/lib/Image/ExifTool/Lang/cs.pm +1 -1
  80. package/bin/exiftool_files/lib/Image/ExifTool/Lang/de.pm +1 -1
  81. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  82. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  83. package/bin/exiftool_files/lib/Image/ExifTool/Lang/es.pm +1 -1
  84. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fi.pm +1 -1
  85. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +1 -1
  86. package/bin/exiftool_files/lib/Image/ExifTool/Lang/it.pm +1 -1
  87. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ja.pm +1 -1
  88. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ko.pm +1 -1
  89. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +1 -1
  90. package/bin/exiftool_files/lib/Image/ExifTool/Lang/pl.pm +1 -1
  91. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ru.pm +1 -1
  92. package/bin/exiftool_files/lib/Image/ExifTool/Lang/sv.pm +1 -1
  93. package/bin/exiftool_files/lib/Image/ExifTool/Lang/tr.pm +1 -1
  94. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  95. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  96. package/bin/exiftool_files/lib/Image/ExifTool/Leaf.pm +1 -1
  97. package/bin/exiftool_files/lib/Image/ExifTool/Lytro.pm +1 -1
  98. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +1 -1
  99. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +1 -1
  100. package/bin/exiftool_files/lib/Image/ExifTool/MIEUnits.pod +1 -1
  101. package/bin/exiftool_files/lib/Image/ExifTool/MIFF.pm +1 -1
  102. package/bin/exiftool_files/lib/Image/ExifTool/MNG.pm +1 -1
  103. package/bin/exiftool_files/lib/Image/ExifTool/MOI.pm +1 -1
  104. package/bin/exiftool_files/lib/Image/ExifTool/MPC.pm +1 -1
  105. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +1 -1
  106. package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +1 -1
  107. package/bin/exiftool_files/lib/Image/ExifTool/MRC.pm +1 -1
  108. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -1
  109. package/bin/exiftool_files/lib/Image/ExifTool/MXF.pm +1 -1
  110. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +1 -1
  111. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +1 -1
  112. package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +9 -5
  113. package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +1 -1
  114. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +1 -1
  115. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  116. package/bin/exiftool_files/lib/Image/ExifTool/Motorola.pm +1 -1
  117. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1918 -72
  118. package/bin/exiftool_files/lib/Image/ExifTool/NikonCapture.pm +1 -1
  119. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +523 -6
  120. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +150 -87
  121. package/bin/exiftool_files/lib/Image/ExifTool/Nintendo.pm +1 -1
  122. package/bin/exiftool_files/lib/Image/ExifTool/OOXML.pm +1 -1
  123. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +1 -1
  124. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -7
  125. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +5 -3
  126. package/bin/exiftool_files/lib/Image/ExifTool/Opus.pm +1 -1
  127. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +1 -1
  128. package/bin/exiftool_files/lib/Image/ExifTool/PCX.pm +1 -1
  129. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +6 -4
  130. package/bin/exiftool_files/lib/Image/ExifTool/PGF.pm +1 -1
  131. package/bin/exiftool_files/lib/Image/ExifTool/PICT.pm +1 -1
  132. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +1 -1
  133. package/bin/exiftool_files/lib/Image/ExifTool/PLUS.pm +1 -1
  134. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +29 -8
  135. package/bin/exiftool_files/lib/Image/ExifTool/PPM.pm +1 -1
  136. package/bin/exiftool_files/lib/Image/ExifTool/PSP.pm +1 -1
  137. package/bin/exiftool_files/lib/Image/ExifTool/Palm.pm +1 -1
  138. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +1 -1
  139. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  140. package/bin/exiftool_files/lib/Image/ExifTool/Parrot.pm +1 -1
  141. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +3 -2
  142. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +1 -1
  143. package/bin/exiftool_files/lib/Image/ExifTool/PhotoCD.pm +1 -1
  144. package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  145. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +1 -1
  146. package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +1 -1
  147. package/bin/exiftool_files/lib/Image/ExifTool/PrintIM.pm +1 -1
  148. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +1 -1
  149. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +25 -7
  150. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
  151. package/bin/exiftool_files/lib/Image/ExifTool/README +4 -0
  152. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +1 -1
  153. package/bin/exiftool_files/lib/Image/ExifTool/RSRC.pm +1 -1
  154. package/bin/exiftool_files/lib/Image/ExifTool/RTF.pm +1 -1
  155. package/bin/exiftool_files/lib/Image/ExifTool/Radiance.pm +1 -1
  156. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +1 -1
  157. package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +1 -1
  158. package/bin/exiftool_files/lib/Image/ExifTool/Reconyx.pm +1 -1
  159. package/bin/exiftool_files/lib/Image/ExifTool/Red.pm +1 -1
  160. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +1 -1
  161. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +6 -2
  162. package/bin/exiftool_files/lib/Image/ExifTool/Sanyo.pm +1 -1
  163. package/bin/exiftool_files/lib/Image/ExifTool/Scalado.pm +1 -1
  164. package/bin/exiftool_files/lib/Image/ExifTool/Shift.pl +3 -1
  165. package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +1 -1
  166. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +1 -1
  167. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  168. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +34 -12
  169. package/bin/exiftool_files/lib/Image/ExifTool/SonyIDC.pm +1 -1
  170. package/bin/exiftool_files/lib/Image/ExifTool/Stim.pm +1 -1
  171. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  172. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6581 -5893
  173. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +1641 -59
  174. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +1 -1
  175. package/bin/exiftool_files/lib/Image/ExifTool/Theora.pm +1 -1
  176. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +1 -1
  177. package/bin/exiftool_files/lib/Image/ExifTool/Unknown.pm +1 -1
  178. package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +1 -1
  179. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +1 -1
  180. package/bin/exiftool_files/lib/Image/ExifTool/Vorbis.pm +1 -1
  181. package/bin/exiftool_files/lib/Image/ExifTool/WTV.pm +1 -1
  182. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  183. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +1 -1
  184. package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  185. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
  186. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +30 -10
  187. package/bin/exiftool_files/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  188. package/bin/exiftool_files/lib/Image/ExifTool/WritePostScript.pl +1 -1
  189. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +19 -4
  190. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +13 -12
  191. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +56 -10
  192. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +169 -54
  193. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +6 -4
  194. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +22 -8
  195. package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +10 -2
  196. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +1 -1
  197. package/bin/exiftool_files/lib/Image/ExifTool/iWork.pm +1 -1
  198. package/bin/exiftool_files/lib/Image/ExifTool.pm +93 -13
  199. package/bin/exiftool_files/lib/Image/ExifTool.pod +80 -70
  200. package/package.json +3 -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.00';
66
+ $VERSION = '4.05';
66
67
 
67
68
  sub LensIDConv($$$);
68
69
  sub ProcessNikonAVI($$$);
@@ -404,6 +405,7 @@ sub GetAFPointGrid($$;$);
404
405
  '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
405
406
  'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
406
407
  '96 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 II DG HSM', #Jurgen Sahlberg
408
+ 'CA 3C 1F 37 30 30 4B 46' => 'Sigma 12-24mm F4 DG HSM | A', #github issue#101
407
409
  'C1 48 24 37 24 24 4B 46' => 'Sigma 14-24mm F2.8 DG HSM | A', #30
408
410
  '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF',
409
411
  '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG Aspherical HSM',
@@ -493,6 +495,7 @@ sub GetAFPointGrid($$;$);
493
495
  '7A 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II',
494
496
  'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD
495
497
  '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic
498
+ 'BB 48 5C 80 24 24 4B 4E' => 'Sigma 70-200mm F2.8 DG OS HSM | S', #forum13207
496
499
  '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
497
500
  '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
498
501
  '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
@@ -507,6 +510,7 @@ sub GetAFPointGrid($$;$);
507
510
  '77 44 60 98 34 3C 7B 0E' => 'Sigma 80-400mm F4.5-5.6 APO DG D OS',
508
511
  '48 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
509
512
  'F3 48 68 8E 30 30 4B 02' => 'Sigma APO 100-300mm F4 EX IF HSM',
513
+ '26 45 68 8E 34 42 1C 02' => 'Sigma 100-300mm F4.5-6.7 DL', #30
510
514
  '48 54 6F 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
511
515
  '7A 54 6E 8E 24 24 4B 02' => 'Sigma APO 120-300mm F2.8 EX DG HSM',
512
516
  '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
@@ -701,6 +705,7 @@ sub GetAFPointGrid($$;$);
701
705
  #
702
706
  '9A 4C 50 50 14 14 9C 06' => 'Yongnuo YN50mm F1.8N',
703
707
  '9F 48 48 48 24 24 A1 06' => 'Yongnuo YN40mm F2.8N', #30
708
+ '9F 54 68 68 18 18 A2 06' => 'Yongnuo YN100mm F2N', #30
704
709
  #
705
710
  '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC',
706
711
  #
@@ -753,6 +758,7 @@ my %flashFirmware = (
753
758
  '5 2' => '5.02 (SB-900)',
754
759
  '6 1' => '6.01 (SB-700)', #https://exiftool.org/forum/index.php/topic,5034.0.html
755
760
  '7 1' => '7.01 (SB-910)', #PH
761
+ '14 3' => '14.03 (SB-5000)', #28
756
762
  OTHER => sub {
757
763
  my ($val, $inv) = @_;
758
764
  return sprintf('%d.%.2d (Unknown model)', split(' ', $val)) unless $inv;
@@ -809,6 +815,124 @@ my %flashControlMode = (
809
815
  0x07 => 'Repeating Flash',
810
816
  );
811
817
 
818
+ my %activeDLightingZ7 = (
819
+ 0 => 'Off',
820
+ 2 => 'Low',
821
+ 3 => 'Normal',
822
+ 4 => 'High',
823
+ 5 => 'Extra High',
824
+ );
825
+
826
+ my %flashControlModeZ7 = (
827
+ 0 => 'TTL',
828
+ 1 => 'Auto External Flash',
829
+ 2 => 'GN (distance priority)',
830
+ 3 => 'Manual',
831
+ 4 => 'Repeating Flash',
832
+ );
833
+
834
+ my %flashRemoteControlZ7 = (
835
+ 0 => 'Group',
836
+ 1 => 'Quick Wireless',
837
+ 2 => 'Remote Repeating',
838
+ );
839
+
840
+ my %flashWirelessOptionZ7 = (
841
+ 0 => 'Off',
842
+ 1 => 'Optical AWL',
843
+ 2 => 'Optical/Radio AWL',
844
+ 3 => 'Radio AWL',
845
+ );
846
+
847
+ my %focusModeZ7 = (
848
+ 0 => 'Manual',
849
+ 1 => 'AF-S',
850
+ 2 => 'AF-C',
851
+ 4 => 'AF-F', # full frame
852
+ );
853
+
854
+ my %infoZSeries = (
855
+ Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc|9)\b/i',
856
+ Notes => 'Z Series cameras thru Decemeber 2021',
857
+ );
858
+ my %iSOAutoHiLimitZ7 = (
859
+ 0 => 'ISO 64',
860
+ 1 => 'ISO 80',
861
+ 2 => 'ISO 100',
862
+ 3 => 'ISO 125',
863
+ 4 => 'ISO 160',
864
+ 5 => 'ISO 200',
865
+ 6 => 'ISO 250',
866
+ 7 => 'ISO 320',
867
+ 8 => 'ISO 400',
868
+ 9 => 'ISO 500',
869
+ 10 => 'ISO 640',
870
+ 11 => 'ISO 800',
871
+ 12 => 'ISO 1000',
872
+ 13 => 'ISO 1250',
873
+ 14 => 'ISO 1600',
874
+ 15 => 'ISO 2000',
875
+ 16 => 'ISO 2500',
876
+ 17 => 'ISO 3200',
877
+ 18 => 'ISO 4000',
878
+ 19 => 'ISO 5000',
879
+ 20 => 'ISO 6400',
880
+ 21 => 'ISO 8000',
881
+ 22 => 'ISO 10000',
882
+ 23 => 'ISO 12800',
883
+ 24 => 'ISO 16000',
884
+ 25 => 'ISO 20000',
885
+ 26 => 'ISO 25600',
886
+ 27 => 'ISO Hi 0.3',
887
+ 28 => 'ISO Hi 0.7',
888
+ 29 => 'ISO Hi 1.0',
889
+ 32 => 'ISO Hi 2.0',
890
+ );
891
+
892
+ my %meteringModeZ7 = (
893
+ 0 => 'Matrix',
894
+ 1 => 'Center',
895
+ 2 => 'Spot',
896
+ 3 => 'Highlight'
897
+ );
898
+
899
+ my %movieFrameRateZ7 = (
900
+ 0 => '120p',
901
+ 1 => '100p',
902
+ 2 => '60p',
903
+ 3 => '50p',
904
+ 4 => '30p',
905
+ 5 => '25p',
906
+ 6 => '24p',
907
+ );
908
+
909
+ my %offLowNormalHighZ7 = (
910
+ 0 => 'Off',
911
+ 1 => 'Low',
912
+ 2 => 'Normal',
913
+ 3 => 'High',
914
+ );
915
+
916
+ my %movieFrameSizeZ9 = (
917
+ 1 => '1920x1080',
918
+ 2 => '3840x2160',
919
+ 3 => '7680x4320',
920
+ );
921
+
922
+ my %subjectDetectionZ9 = (
923
+ 0 => 'Off',
924
+ 1 => 'Auto',
925
+ 2 => 'People',
926
+ 3 => 'Animals',
927
+ 4 => 'Vehicles',
928
+ );
929
+
930
+ my %vRModeZ9 = (
931
+ 0 => 'Off',
932
+ 1 => 'Normal',
933
+ 2 => 'Sport',
934
+ );
935
+
812
936
  my %retouchValues = ( #PH
813
937
  0 => 'None',
814
938
  3 => 'B & W',
@@ -1045,7 +1169,9 @@ my %cropHiSpeed = ( #IB
1045
1169
  10 => '1.3x Movie Crop', #36 (D4/D500)
1046
1170
  11 => 'FX Uncropped',
1047
1171
  12 => 'DX Uncropped',
1048
- 15 => '1.5x Movie Crop', #36 (D4/D500)
1172
+ 13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936
1173
+ 14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856
1174
+ 15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872
1049
1175
  17 => '1:1 Crop',
1050
1176
  OTHER => sub {
1051
1177
  my ($val, $inv, $conv) = @_;
@@ -1057,7 +1183,31 @@ my %cropHiSpeed = ( #IB
1057
1183
  },
1058
1184
  );
1059
1185
 
1186
+ my %flashGroupOptionsMode = (
1187
+ 0 => 'TTL',
1188
+ 1 => 'Manual',
1189
+ 2 => 'Auto',
1190
+ 3 => 'Off',
1191
+ );
1192
+
1193
+ my %nefCompression = ( #28 relocated to MakerNotes_0x51 at offset x'0a (Z9)
1194
+ 1 => 'Lossy (type 1)', # (older models)
1195
+ 2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!)
1196
+ 3 => 'Lossless',
1197
+ 4 => 'Lossy (type 2)',
1198
+ 5 => 'Striped packed 12 bits', #IB
1199
+ 6 => 'Uncompressed (reduced to 12 bit)', #IB
1200
+ 7 => 'Unpacked 12 bits', #IB (padded to 16)
1201
+ 8 => 'Small', #IB
1202
+ 9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
1203
+ 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
1204
+ 13 => 'High Efficiency', #28
1205
+ 14 => 'High Efficiency*', #28
1206
+ );
1207
+
1208
+ my %noYes = ( 0 => 'No' , 1 => 'Yes', );
1060
1209
  my %offOn = ( 0 => 'Off', 1 => 'On' );
1210
+ my %onOff = ( 0 => 'On', 1 => 'Off' );
1061
1211
 
1062
1212
  # common attributes for writable BinaryData directories
1063
1213
  my %binaryDataAttrs = (
@@ -1068,6 +1218,30 @@ my %binaryDataAttrs = (
1068
1218
  FIRST_ENTRY => 0,
1069
1219
  );
1070
1220
 
1221
+ my %base64bin = ( ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' );
1222
+ my %base64int32u = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); unpack("V",$$val)' );
1223
+ my %base64bytes = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); join(".",unpack("C*",$$val))' );
1224
+ my %base64double = (
1225
+ ValueConv => q{
1226
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1227
+ my $saveOrder = GetByteOrder();
1228
+ SetByteOrder('II');
1229
+ $val = GetDouble($val,0);
1230
+ SetByteOrder($saveOrder);
1231
+ return $val;
1232
+ },
1233
+ );
1234
+ my %base64coord = (
1235
+ ValueConv => q{
1236
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1237
+ my $saveOrder = GetByteOrder();
1238
+ SetByteOrder('II');
1239
+ $val = GetDouble($val,0) + GetDouble($val,8)/60 + GetDouble($val,16)/3600;
1240
+ SetByteOrder($saveOrder);
1241
+ return $val;
1242
+ },
1243
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
1244
+ );
1071
1245
  # Nikon maker note tags
1072
1246
  %Image::ExifTool::Nikon::Main = (
1073
1247
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikon,
@@ -1464,6 +1638,16 @@ my %binaryDataAttrs = (
1464
1638
  Name => 'ColorTemperatureAuto',
1465
1639
  Writable => 'int16u',
1466
1640
  },
1641
+ 0x0051 => { #28 (Z9)
1642
+ Name => 'MakerNotes0x51',
1643
+ Writable => 'undef',
1644
+ Hidden => 1,
1645
+ Permanent => 0,
1646
+ Flags => [ 'Binary', 'Protected' ],
1647
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MakerNotes0x51' },
1648
+ },
1649
+ #0x0053 #28 possibly a secondary DistortionControl block (in addition to DistortInfo)? Certainly offset 0x04 within block contains tag AutoDistortionControl for Z72 and D6 (1=>On; 2=> Off)
1650
+ #0x005e #28 possibly DiffractionCompensation block? Certainly offset 0x04 within block contains tag DiffractionCompensation
1467
1651
  0x0080 => { Name => 'ImageAdjustment', Writable => 'string' },
1468
1652
  0x0081 => { Name => 'ToneComp', Writable => 'string' }, #2
1469
1653
  0x0082 => { Name => 'AuxiliaryLens', Writable => 'string' },
@@ -1861,7 +2045,7 @@ my %binaryDataAttrs = (
1861
2045
  SubDirectory => {
1862
2046
  TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
1863
2047
  DecryptStart => 4,
1864
- DecryptLen => 0xc21a + 12,
2048
+ DecryptLen => 0xc292 + 720, # thru decoded parts of Offset 32
1865
2049
  ByteOrder => 'LittleEndian',
1866
2050
  },
1867
2051
  },
@@ -1875,17 +2059,30 @@ my %binaryDataAttrs = (
1875
2059
  ByteOrder => 'BigEndian',
1876
2060
  },
1877
2061
  },
1878
- { # (Z6_2 firmware version 1.00 and Z7_2 firmware versions 1.00 & 1.01, ref 28)
1879
- Condition => '$$valPt =~ /^0800/ or $$valPt =~ /^0803/',
1880
- Name => 'ShotInfoZ7_2',
2062
+ { # (Z6_2 firmware version 1.00 and Z7II firmware versions 1.00 & 1.01, ref 28)
2063
+ # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc
2064
+ Condition => '$$valPt =~ /^080[01234]/',
2065
+ Name => 'ShotInfoZ7II',
2066
+ SubDirectory => {
2067
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',
2068
+ DecryptStart => 4,
2069
+ # TODO: eventually set the length dynamically according to actual offsets!
2070
+ DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II
2071
+ ByteOrder => 'LittleEndian',
2072
+ },
2073
+ },
2074
+ { # (Z9 firmware version 1.00 ref 28)
2075
+ Condition => '$$valPt =~ /^0805/',
2076
+ Name => 'ShotInfoZ9',
1881
2077
  SubDirectory => {
1882
- TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7_2',
2078
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
1883
2079
  DecryptStart => 4,
1884
- DecryptLen => 0xce32 + 12,
2080
+ # TODO: eventually set the length dynamically according to actual offsets!
2081
+ DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
1885
2082
  ByteOrder => 'LittleEndian',
1886
2083
  },
1887
2084
  },
1888
- { # D7100=0227, Z6/Z7=0800
2085
+ { # D7100=0227
1889
2086
  Condition => '$$valPt =~ /^0[28]/',
1890
2087
  Name => 'ShotInfo02xx',
1891
2088
  SubDirectory => {
@@ -1914,18 +2111,8 @@ my %binaryDataAttrs = (
1914
2111
  0x0093 => { #21
1915
2112
  Name => 'NEFCompression',
1916
2113
  Writable => 'int16u',
1917
- PrintConv => {
1918
- 1 => 'Lossy (type 1)', # (older models)
1919
- 2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!)
1920
- 3 => 'Lossless',
1921
- 4 => 'Lossy (type 2)',
1922
- 5 => 'Striped packed 12 bits', #IB
1923
- 6 => 'Uncompressed (reduced to 12 bit)', #IB
1924
- 7 => 'Unpacked 12 bits', #IB (padded to 16)
1925
- 8 => 'Small', #IB
1926
- 9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
1927
- 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
1928
- },
2114
+ SeparateTable => 'NEFCompression',
2115
+ PrintConv => \%nefCompression,
1929
2116
  },
1930
2117
  0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
1931
2118
  0x0095 => { Name => 'NoiseReduction', Writable => 'string' }, # ("Off" or "FPNR"=long exposure NR)
@@ -2126,7 +2313,7 @@ my %binaryDataAttrs = (
2126
2313
  },
2127
2314
  },
2128
2315
  {
2129
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
2316
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
2130
2317
  Name => 'LensData0800',
2131
2318
  SubDirectory => {
2132
2319
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -2261,8 +2448,8 @@ my %binaryDataAttrs = (
2261
2448
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0107' },
2262
2449
  },
2263
2450
  {
2264
- Name => 'FlashInfo0300', # (Z7_2)
2265
- Condition => '$$valPt =~ /^0300/',
2451
+ Name => 'FlashInfo0300', # (Z7II)
2452
+ Condition => '$$valPt =~ /^030[01]/',
2266
2453
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::FlashInfo0300' },
2267
2454
  },
2268
2455
  {
@@ -2335,11 +2522,15 @@ my %binaryDataAttrs = (
2335
2522
  PrintConv => '$self->ConvertDateTime($val)',
2336
2523
  PrintConvInv => '$self->InverseDateTime($val,0)',
2337
2524
  },
2338
- 0x00b7 => { #JD
2525
+ 0x00b7 => [{
2526
+ Name => 'AFInfo2',
2527
+ Condition => '$$self{Model} =~ /^NIKON Z 9\b/i', #AFInfo2Version 0400
2528
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2V0400' },
2529
+ },{ #JD
2339
2530
  Name => 'AFInfo2',
2340
2531
  # (this structure may be byte swapped when rewritten by CaptureNX)
2341
2532
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2' },
2342
- },
2533
+ }],
2343
2534
  0x00b8 => [{ #PH
2344
2535
  Name => 'FileInfo',
2345
2536
  # unfortunately, some newer models write this as little-endian
@@ -2388,6 +2579,10 @@ my %binaryDataAttrs = (
2388
2579
  Flags => [ 'Binary', 'Protected' ],
2389
2580
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' },
2390
2581
  },
2582
+ 0x00bf => {
2583
+ Name => 'SilentPhotography',
2584
+ PrintConv => \%offOn,
2585
+ },
2391
2586
  0x00c3 => {
2392
2587
  Name => 'BarometerInfo',
2393
2588
  SubDirectory => {
@@ -2596,15 +2791,23 @@ my %binaryDataAttrs = (
2596
2791
  },
2597
2792
  },
2598
2793
  # 5 - values: 0, 1 (VR On), 2 (VR Off)
2599
- 6 => {
2794
+ 6 => [{
2795
+ Name => 'VRMode',
2796
+ PrintConv => {
2797
+ 0 => 'Off',
2798
+ 1 => 'Sport',
2799
+ 3 => 'Normal',
2800
+ },
2801
+ %infoZSeries
2802
+ },{
2600
2803
  Name => 'VRMode',
2601
2804
  PrintConv => {
2602
- 0 => 'Normal', # (Z7 gives this value for "off" - PH)
2805
+ 0 => 'Normal',
2603
2806
  1 => 'On (1)', #PH (NC)
2604
2807
  2 => 'Active', # (1J1)
2605
2808
  3 => 'Sport', #PH (Z7)
2606
2809
  },
2607
- },
2810
+ }],
2608
2811
  # 7 - values: 0, 1
2609
2812
  );
2610
2813
 
@@ -3438,6 +3641,10 @@ my %binaryDataAttrs = (
3438
3641
  201 => 'Wide-area AF', #28 (D6)
3439
3642
  202 => 'Face-priority AF', #28 (D6)
3440
3643
  203 => 'Subject-tracking AF', #28 (D6)
3644
+ 204 => 'Dynamic Area (S)', #28 (Z9)
3645
+ 205 => 'Dynamic Area (M)', #28 (Z9)
3646
+ 206 => 'Dynamic Area (L)', #28 (Z9)
3647
+ 207 => '3D-tracking', #28 (Z9)
3441
3648
  },
3442
3649
  },
3443
3650
  ],
@@ -3965,6 +4172,47 @@ my %binaryDataAttrs = (
3965
4172
  },
3966
4173
  );
3967
4174
 
4175
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4176
+ %binaryDataAttrs,
4177
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4178
+ DATAMEMBER => [ 0 ],
4179
+ 0 => {
4180
+ Name => 'AFInfo2Version',
4181
+ Format => 'undef[4]',
4182
+ Writable => 0,
4183
+ RawConv => '$$self{AFInfo2Version} = $val',
4184
+ },
4185
+ 0x3e => {
4186
+ Name => 'AFImageWidth',
4187
+ Format => 'int16u',
4188
+ },
4189
+ 0x40 => {
4190
+ Name => 'AFImageHeight',
4191
+ Format => 'int16u',
4192
+ },
4193
+ 0x43 => {
4194
+ Name => 'FocusPositionHorizontal',
4195
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4196
+ },
4197
+ 0x45 => {
4198
+ Name => 'FocusPositionVertical',
4199
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4200
+ },
4201
+ 0x46 => {
4202
+ Name => 'AFAreaWidth',
4203
+ Format => 'int16u',
4204
+ Notes => 'size of AF area in AFImage pixels',
4205
+ RawConv => '$val ? $val : undef',
4206
+ },
4207
+ 0x48 => {
4208
+ Name => 'AFAreaHeight',
4209
+ Format => 'int16u',
4210
+ RawConv => '$val ? $val : undef',
4211
+ }
4212
+ # 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)
4213
+ #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).
4214
+ );
4215
+
3968
4216
  # Nikon AF fine-tune information (ref 28)
3969
4217
  %Image::ExifTool::Nikon::AFTune = (
3970
4218
  %binaryDataAttrs,
@@ -4730,6 +4978,7 @@ my %nikonFocalConversions = (
4730
4978
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4731
4979
  24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
4732
4980
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4981
+ 28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4733
4982
  29 => 'Nikkor Z 28mm f/2.8', #IB
4734
4983
  },
4735
4984
  },
@@ -6048,6 +6297,18 @@ my %nikonFocalConversions = (
6048
6297
  3 => 'Rotate 180',
6049
6298
  },
6050
6299
  },
6300
+ 0x0d0 => {
6301
+ Name => 'Interval',
6302
+ # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
6303
+ Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
6304
+ PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
6305
+ },
6306
+ 0x0d4 => {
6307
+ Name => 'IntervalFrame',
6308
+ # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
6309
+ Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
6310
+ PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
6311
+ },
6051
6312
  0x05e2 => {
6052
6313
  Name => 'FlickerReductionIndicator',
6053
6314
  Mask => 0x01,
@@ -6466,7 +6727,7 @@ my %nikonFocalConversions = (
6466
6727
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
6467
6728
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
6468
6729
  VARS => { ID_LABEL => 'Index' },
6469
- DATAMEMBER => [ 0x9c, 0xc219 ],
6730
+ DATAMEMBER => [ 0x30, 0x60, 0x9c, 0xa4, 0x75e7, 0x760c, 0x7610, 0xc219, 0xc292, 0xc40e, 0xc412, 0xc4a6, 0xc4be ],
6470
6731
  WRITABLE => 1,
6471
6732
  FIRST_ENTRY => 0,
6472
6733
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -6476,6 +6737,11 @@ my %nikonFocalConversions = (
6476
6737
  Format => 'string[4]',
6477
6738
  Writable => 0,
6478
6739
  },
6740
+ 0x04 => {
6741
+ Name => 'FirmwareVersion',
6742
+ Format => 'string[8]',
6743
+ Writable => 0,
6744
+ },
6479
6745
  0x24 => {
6480
6746
  Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data)
6481
6747
  DataMember => 'NumberOffsets',
@@ -6483,6 +6749,22 @@ my %nikonFocalConversions = (
6483
6749
  Writable => 0,
6484
6750
  Hidden => 1,
6485
6751
  },
6752
+ 0x30 => {
6753
+ Name => 'Offset3',
6754
+ DataMember => 'Offset3',
6755
+ Format => 'int32u',
6756
+ Writable => 0,
6757
+ Hidden => 1,
6758
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
6759
+ },
6760
+ 0x60 => {
6761
+ Name => 'Offset15',
6762
+ DataMember => 'Offset15',
6763
+ Format => 'int32u',
6764
+ Writable => 0,
6765
+ Hidden => 1,
6766
+ RawConv => '$$self{Offset15} = $val || 0x10000000; undef', # (ignore if 0)
6767
+ },
6486
6768
  0x9c => {
6487
6769
  Name => 'OrientationOffset',
6488
6770
  DataMember => 'OrientationOffset',
@@ -6491,15 +6773,49 @@ my %nikonFocalConversions = (
6491
6773
  Hidden => 1,
6492
6774
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
6493
6775
  },
6494
- ### 0xc21a - OrientationInfo start (D6 firmware 1.00)
6495
- 0xc219 => {
6776
+ 0xa4 => {
6777
+ Name => 'Offset32',
6778
+ DataMember => 'Offset32',
6779
+ Format => 'int32u',
6780
+ Writable => 0,
6781
+ Hidden => 1,
6782
+ RawConv => '$$self{Offset32} = $val || 0x10000000; undef', # (ignore if 0)
6783
+ },
6784
+ ### 0x75e8 - Offset3 info start (D6 firmware 1.33)
6785
+ 0x75e7 => {
6496
6786
  Name => 'Hook1',
6497
6787
  Hidden => 1,
6498
6788
  RawConv => 'undef',
6789
+ # account for variable location of Offset5 data
6790
+ Hook => '$varSize = $$self{Offset3} - 0x75e8',
6791
+ },
6792
+ 0x760c => {
6793
+ Name => 'IntervalShooting',
6794
+ RawConv => '$$self{IntervalShooting} = $val',
6795
+ Format => 'int16u',
6796
+ PrintConv => q{
6797
+ return 'Off' if $val == 0 ;
6798
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); #something like "Interval 1 of 3"
6799
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; #something like "Frame 1 of 3" or blank
6800
+ return "On: $i$f"
6801
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
6802
+ },
6803
+ },
6804
+ 0x7610 => {
6805
+ Name => 'IntervalFrame',
6806
+ RawConv => '$$self{IntervalFrame} = $val',
6807
+ Condition => '$$self{IntervalShooting} > 0',
6808
+ Format => 'int16u',
6809
+ Hidden => 1,
6810
+ },
6811
+ ### 0xc21a - OrientationInfo start (D6 firmware 1.00) (0xc952 for firmware 1.33)
6812
+ 0xc219 => {
6813
+ Name => 'Hook2',
6814
+ Hidden => 1,
6815
+ RawConv => 'undef',
6499
6816
  # account for variable location of OrientationInfo data
6500
6817
  Hook => '$varSize = $$self{OrientationOffset} - 0xc21a',
6501
6818
  },
6502
-
6503
6819
  0xc21a => {
6504
6820
  Name => 'RollAngle',
6505
6821
  Format => 'fixed32u',
@@ -6527,7 +6843,136 @@ my %nikonFocalConversions = (
6527
6843
  PrintConv => 'sprintf("%.1f", $val)',
6528
6844
  PrintConvInv => '$val',
6529
6845
  },
6530
- # note: DecryptLen currently set to 0xc21a + 12
6846
+ ### 0xc9c6 - Offset32 start (D6 firmware 1.33)
6847
+ 0xc292 => {
6848
+ Name => 'Hook3',
6849
+ Hidden => 1,
6850
+ RawConv => 'undef',
6851
+ # account for variable location of data
6852
+ Hook => '$varSize = $$self{Offset32} - 0xc292',
6853
+ },
6854
+ 0xc40e => {
6855
+ Name => 'Intervals',
6856
+ Format => 'int32u',
6857
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
6858
+ Condition => '$$self{IntervalShooting} > 0',
6859
+ },
6860
+ 0xc412 => {
6861
+ Name => 'ShotsPerInterval',
6862
+ Format => 'int32u',
6863
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
6864
+ Condition => '$$self{IntervalShooting} > 0',
6865
+ },
6866
+ 0xc416 => {
6867
+ Name => 'IntervalExposureSmoothing',
6868
+ Condition => '$$self{IntervalShooting} > 0',
6869
+ Format => 'int8u',
6870
+ PrintConv => \%offOn,
6871
+ },
6872
+ 0xc418 => {
6873
+ Name => 'IntervalPriority',
6874
+ Condition => '$$self{IntervalShooting} > 0',
6875
+ Format => 'int8u',
6876
+ PrintConv => \%offOn,
6877
+ },
6878
+ 0xc43a => {
6879
+ Name => 'FocusShiftNumberShots',
6880
+ },
6881
+ 0xc43e => {
6882
+ Name => 'FocusShiftStepWidth',
6883
+ },
6884
+ 0xc442 => {
6885
+ Name => 'FocusShiftInterval',
6886
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
6887
+ },
6888
+ 0xc446 => {
6889
+ Name => 'FocusShiftExposureLock',
6890
+ PrintConv => \%offOn,
6891
+ },
6892
+ #0xc49c => HighISONoiseReduction
6893
+ 0xc4a0 => {
6894
+ Name => 'DiffractionCompensation',
6895
+ Format => 'int8u',
6896
+ PrintConv => \%offOn,
6897
+ },
6898
+ #0xc4a1 => {Name => 'FlickerReductionShooting',}, #redundant with tag in NikonSettings
6899
+ 0xc4a6 => {
6900
+ Name => 'FlashControlMode', #this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
6901
+ RawConv => '$$self{FlashControlMode} = $val',
6902
+ PrintConv => {
6903
+ 0 => 'TTL',
6904
+ 1 => 'Auto External Flash',
6905
+ 2 => 'GN (distance priority)',
6906
+ 3 => 'Manual',
6907
+ 4 => 'Repeating Flash',
6908
+ },
6909
+ },
6910
+ 0xc4ac => {
6911
+ Name => 'FlashGNDistance',
6912
+ Condition => '$$self{FlashControlMode} == 2',
6913
+ Unknown => 1,
6914
+ ValueConv => '$val + 3',
6915
+ PrintConv => \%flashGNDistance,
6916
+ },
6917
+ 0xc4b0 => {
6918
+ 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)
6919
+ Condition => '$$self{FlashControlMode} >= 3',
6920
+ Unknown => 1,
6921
+ ValueConv => '2 ** (-$val/3)',
6922
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
6923
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
6924
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
6925
+ },
6926
+ 0xc4ba => {
6927
+ Name => 'FlashRemoteControl',
6928
+ Unknown => 1,
6929
+ PrintConv => {
6930
+ 0 => 'Group',
6931
+ 1 => 'Quick Wireless',
6932
+ 2 => 'Remote Repeating',
6933
+ },
6934
+ },
6935
+ 0xc4be => {
6936
+ Name => 'FlashMasterControlMode', #tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
6937
+ RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
6938
+ PrintConv => \%flashGroupOptionsMode,
6939
+ },
6940
+ 0xc4c0 => {
6941
+ Name => 'FlashMasterCompensation',
6942
+ Unknown => 1,
6943
+ Format => 'int8s',
6944
+ Condition => '$$self{FlashGroupOptionsMasterMode} != 3', #other than 'Off'
6945
+ ValueConv => '$val/6',
6946
+ ValueConvInv => '6 * $val',
6947
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
6948
+ PrintConvInv => '$val',
6949
+ },
6950
+ 0xc4c4 => {
6951
+ Name => 'FlashMasterOutput',
6952
+ Unknown => 1,
6953
+ Condition => '$$self{FlashGroupOptionsMasterMode} == 1', #only for Mode=M
6954
+ ValueConv => '2 ** (-$val/3)',
6955
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
6956
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
6957
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
6958
+ },
6959
+ 0xc4c6 => {
6960
+ Name => 'FlashWirelessOption',
6961
+ Unknown => 1,
6962
+ PrintConv => {
6963
+ 0 => 'Optical AWL',
6964
+ 1 => 'Off',
6965
+ },
6966
+ },
6967
+ 0xc55c => {
6968
+ Name => 'MovieType',
6969
+ Unknown => 1,
6970
+ PrintConv => {
6971
+ 0 => 'MOV',
6972
+ 1 => 'MP4',
6973
+ },
6974
+ },
6975
+ # note: DecryptLen currently set to 0xc9c6 + 720
6531
6976
  );
6532
6977
 
6533
6978
  # shot information for the D610 firmware 1.00 (encrypted) - ref PH
@@ -7046,9 +7491,7 @@ my %nikonFocalConversions = (
7046
7491
  WRITABLE => 1,
7047
7492
  FIRST_ENTRY => 0,
7048
7493
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7049
- NOTES => q{
7050
- These tags are extracted from encrypted data in images from the D4S.
7051
- },
7494
+ NOTES => 'These tags are extracted from encrypted data in images from the D4S.',
7052
7495
  0x00 => {
7053
7496
  Name => 'ShotInfoVersion',
7054
7497
  Format => 'string[4]',
@@ -7298,7 +7741,7 @@ my %nikonFocalConversions = (
7298
7741
  Format => 'undef[56]',
7299
7742
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
7300
7743
  },
7301
- # 0x1978 => { #this decode works, but involves more bits than should be necessary
7744
+ # 0x1978 => { # this decode works, but involves more bits than should be necessary
7302
7745
  # Name => 'ShutterTrigger',
7303
7746
  # Mask => 0xff,
7304
7747
  # PrintConv => {
@@ -7347,17 +7790,19 @@ my %nikonFocalConversions = (
7347
7790
  # note: DecryptLen currently set to 0x3697
7348
7791
  );
7349
7792
 
7350
- # shot information for the Z7_2 firmware 1.00 (encrypted) - ref 28
7351
- %Image::ExifTool::Nikon::ShotInfoZ7_2 = (
7793
+ # shot information for the Z7II firmware 1.00 (encrypted) - ref 28
7794
+ %Image::ExifTool::Nikon::ShotInfoZ7II = (
7352
7795
  PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7353
7796
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7354
7797
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7355
7798
  VARS => { ID_LABEL => 'Index' },
7356
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x98, 0xce31 ],
7799
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x98, 0xa0, 0x75e7, 0x760c,
7800
+ 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7801
+ IS_SUBDIR => [ 0xceb8 ],
7357
7802
  WRITABLE => 1,
7358
7803
  FIRST_ENTRY => 0,
7359
7804
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7360
- NOTES => 'These tags are extracted from encrypted data in images from the Z7_2.',
7805
+ NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
7361
7806
  0x00 => {
7362
7807
  Name => 'ShotInfoVersion',
7363
7808
  Format => 'string[4]',
@@ -7370,27 +7815,41 @@ my %nikonFocalConversions = (
7370
7815
  Writable => 0,
7371
7816
  RawConv => '$$self{FirmwareVersion} = $val',
7372
7817
  },
7373
- 0x0E => {
7818
+ 0x0e => {
7374
7819
  Name => 'FirmwareVersion2',
7375
7820
  Format => 'string[8]',
7376
7821
  Writable => 0,
7377
- RawConv => '$$self{FirmwareVersion2} = $val',
7378
7822
  Hidden => 1,
7379
7823
  },
7380
7824
  0x18 => {
7381
7825
  Name => 'FirmwareVersion3',
7382
7826
  Format => 'string[8]',
7383
7827
  Writable => 0,
7384
- RawConv => '$$self{FirmwareVersion3} = $val',
7385
7828
  Hidden => 1,
7386
7829
  },
7387
7830
  0x24 => {
7388
- Name => 'NumberOffsets', #number of entries in offset table. offsets are from start of ShotInfo data.
7831
+ Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
7389
7832
  DataMember => 'NumberOffsets',
7390
7833
  Format => 'int32u',
7391
7834
  Writable => 0,
7392
7835
  Hidden => 1,
7393
7836
  },
7837
+ 0x30 => {
7838
+ Name => 'Offset3',
7839
+ DataMember => 'Offset3',
7840
+ Format => 'int32u',
7841
+ Writable => 0,
7842
+ Hidden => 1,
7843
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
7844
+ },
7845
+ 0x38 => {
7846
+ Name => 'Offset5',
7847
+ DataMember => 'Offset5',
7848
+ Format => 'int32u',
7849
+ Writable => 0,
7850
+ Hidden => 1,
7851
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
7852
+ },
7394
7853
  0x98 => {
7395
7854
  Name => 'OrientationOffset',
7396
7855
  DataMember => 'OrientationOffset',
@@ -7399,12 +7858,70 @@ my %nikonFocalConversions = (
7399
7858
  Hidden => 1,
7400
7859
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7401
7860
  },
7402
-
7403
- ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7404
- 0xce31 => {
7861
+ 0xa0 => {
7862
+ Name => 'Offset31',
7863
+ DataMember => 'Offset31',
7864
+ Format => 'int32u',
7865
+ Writable => 0,
7866
+ Hidden => 1,
7867
+ RawConv => '$$self{Offset31} = $val || 0x10000000; undef', # (ignore if 0)
7868
+ },
7869
+ ### 0x75e8 - Offset3 info start (Z7II firmware 1.30)
7870
+ 0x75e7 => {
7405
7871
  Name => 'Hook1',
7406
7872
  Hidden => 1,
7407
7873
  RawConv => 'undef',
7874
+ # account for variable location of Offset3 data
7875
+ Hook => '$varSize = $$self{Offset3} - 0x75e8',
7876
+ },
7877
+ 0x760c => {
7878
+ Name => 'IntervalShooting',
7879
+ RawConv => '$$self{IntervalShooting} = $val',
7880
+ Format => 'int16u',
7881
+ PrintConv => q{
7882
+ return 'Off' if $val == 0 ;
7883
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
7884
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
7885
+ return "On: $i$f"
7886
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
7887
+ },
7888
+ },
7889
+ 0x7610 => {
7890
+ Name => 'IntervalFrame',
7891
+ RawConv => '$$self{IntervalFrame} = $val',
7892
+ Condition => '$$self{IntervalShooting} > 0',
7893
+ Format => 'int16u',
7894
+ Hidden => 1,
7895
+ },
7896
+ ### 0x7f00 - Offset5 info start (Z7II firmware 1.30)
7897
+ 0x7eff => {
7898
+ Name => 'Hook2',
7899
+ Hidden => 1,
7900
+ RawConv => 'undef',
7901
+ # account for variable location of Offset5 data
7902
+ Hook => '$varSize = $$self{Offset5} - 0x7f00',
7903
+ },
7904
+ 0x7fa0 => { #28
7905
+ Name => 'PortraitImpressionBalance', # will be 0 for firmware 1.21 and earlier; firmware 1.30 onward: will be set by Photo Shooting Menu entry Portrait Impression Balance
7906
+ # offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera
7907
+ # offset5+161 128 is neutral; >128 increases Brightness; <128 decreases Brightness
7908
+ # with firmware 1.30 when 'Off' is selected in the Shooting menu, offsets 160 & 161 will contain 255. Selecting Mode 1,2, or 3 will populate offsets 160 & 161 with values in the range [116,141]
7909
+ Format => 'int8u[2]',
7910
+ Condition => '$$self{FirmwareVersion} ge "01.30"',
7911
+ PrintConv => q{
7912
+ return 'Off' if $val eq '0 0' or $val eq '255 255';
7913
+ my @v = split ' ', $val;
7914
+ my $brightness = $v[1]==128 ? 'Brightness: Neutral' : sprintf('Brightness: %+.1f',($v[1]-128)/4);
7915
+ my $color = $v[0]==128 ? 'Color: Neutral' : sprintf('%s: %.1f', $v[0]>128 ? 'Yellow' : 'Magenta', abs($v[0]-128)/4);
7916
+ # will return something like: 'Magenta: 1.0 Brightness: Neutral'
7917
+ return "$color $brightness"
7918
+ },
7919
+ },
7920
+ ### 0xce32 - OrientationInfo start (Z7II firmware 1.00)
7921
+ 0xce31 => {
7922
+ Name => 'Hook3',
7923
+ Hidden => 1,
7924
+ RawConv => 'undef',
7408
7925
  # account for variable location of OrientationInfo data
7409
7926
  Hook => '$varSize = $$self{OrientationOffset} - 0xce32',
7410
7927
  },
@@ -7436,30 +7953,1177 @@ my %nikonFocalConversions = (
7436
7953
  PrintConv => 'sprintf("%.1f", $val)',
7437
7954
  PrintConvInv => '$val',
7438
7955
  },
7439
- #note: DecryptLen currently set to 0xce32 + 12
7956
+ 0xcea5 => {
7957
+ Name => 'Hook4',
7958
+ Hidden => 1,
7959
+ RawConv => 'undef',
7960
+ # account for variable location of Offset31 data
7961
+ Hook => '$varSize = $$self{Offset31} - 0xcea6',
7962
+ },
7963
+ ### 0xcea6 - Offset31 info start (Z7II firmware 1.30)
7964
+ 0xceb6 => {
7965
+ Name => 'MenuSettingsZ7IIOffset',
7966
+ # offset to MenuSettingsZ7II is relative to start of Offset31 block
7967
+ RawConv => '$$self{MenuSettingsZ7IIOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
7968
+ },
7969
+ 0xceb7 => {
7970
+ Name => 'Hook5',
7971
+ Hidden => 1,
7972
+ RawConv => 'undef',
7973
+ # account for variable location of Offset5 data
7974
+ Hook => '$varSize = $$self{MenuSettingsZ7IIOffset} - 0xceb8',
7975
+ },
7976
+ 0xceb8 => { # (this is 0xd04e for the Z50)
7977
+ Name => 'MenuSettingsZ7II',
7978
+ Format => 'undef[860]',
7979
+ SubDirectory => {
7980
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II',
7981
+ },
7982
+ }
7983
+ # note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e)
7440
7984
  );
7441
7985
 
7442
- # Flash information (ref JD)
7443
- %Image::ExifTool::Nikon::FlashInfo0100 = (
7444
- %binaryDataAttrs,
7445
- DATAMEMBER => [ 9.2, 15, 16 ],
7986
+ # shot information for the Z9 firmware 1.00 (encrypted) - ref 28
7987
+ %Image::ExifTool::Nikon::ShotInfoZ9 = (
7988
+ PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7989
+ WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7990
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7991
+ VARS => { ID_LABEL => 'Index' },
7992
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
7993
+ 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
7994
+ IS_SUBDIR => [ 0xec4b ],
7995
+ WRITABLE => 1,
7996
+ FIRST_ENTRY => 0,
7446
7997
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7447
- NOTES => q{
7448
- These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
7449
- D200.
7450
- },
7451
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
7452
- 0 => {
7453
- Name => 'FlashInfoVersion',
7998
+ NOTES => 'These tags are extracted from encrypted data in images from the Z9.',
7999
+ 0x00 => {
8000
+ Name => 'ShotInfoVersion',
7454
8001
  Format => 'string[4]',
7455
8002
  Writable => 0,
7456
8003
  },
7457
- 4 => { #PH
7458
- Name => 'FlashSource',
7459
- PrintConv => {
7460
- 0 => 'None',
7461
- 1 => 'External',
7462
- 2 => 'Internal',
8004
+ 0x04 => {
8005
+ Name => 'FirmwareVersion',
8006
+ DataMember => 'FirmwareVersion',
8007
+ Format => 'string[8]',
8008
+ Writable => 0,
8009
+ RawConv => '$$self{FirmwareVersion} = $val',
8010
+ },
8011
+ 0x0e => {
8012
+ Name => 'FirmwareVersion2',
8013
+ Format => 'string[8]',
8014
+ Writable => 0,
8015
+ Hidden => 1,
8016
+ },
8017
+ 0x18 => {
8018
+ Name => 'FirmwareVersion3',
8019
+ Format => 'string[8]',
8020
+ Writable => 0,
8021
+ Hidden => 1,
8022
+ },
8023
+ 0x24 => {
8024
+ Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
8025
+ DataMember => 'NumberOffsets',
8026
+ Format => 'int32u',
8027
+ Writable => 0,
8028
+ Hidden => 1,
8029
+ },
8030
+ 0x30 => {
8031
+ Name => 'Offset3', #offset3 - length 2528 (Z9 firmware 1.0)
8032
+ DataMember => 'Offset3',
8033
+ Format => 'int32u',
8034
+ Writable => 0,
8035
+ Hidden => 1,
8036
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
8037
+ },
8038
+ 0x38 => {
8039
+ Name => 'Offset5', #offset5 - length 2488 (Z9 firmware 1.0)
8040
+ DataMember => 'Offset5',
8041
+ Format => 'int32u',
8042
+ Writable => 0,
8043
+ Hidden => 1,
8044
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
8045
+ },
8046
+ 0x84 => {
8047
+ Name => 'OrientationOffset', #offset24 - length 108 (Z9 firmware 1.0)
8048
+ DataMember => 'OrientationOffset',
8049
+ Format => 'int32u',
8050
+ Writable => 0,
8051
+ Hidden => 1,
8052
+ RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
8053
+ },
8054
+ 0x8c => {
8055
+ Name => 'Offset26', #offset26 - length 1895 (Z9 firmware 1.0)
8056
+ DataMember => 'Offset26',
8057
+ Format => 'int32u',
8058
+ Writable => 0,
8059
+ Hidden => 1,
8060
+ RawConv => '$$self{Offset26} = $val || 0x10000000; undef', # (ignore if 0)
8061
+ },
8062
+ ### 0x6c70 - Offset3 info start (Z9 firmware 1.00)
8063
+ 0x6c6f => {
8064
+ Name => 'Offset3Hook',
8065
+ Hidden => 1,
8066
+ RawConv => 'undef',
8067
+ # account for variable location of Offset3 data
8068
+ Hook => '$varSize = $$self{Offset3} - 0x6c70',
8069
+ },
8070
+ 0x6c98 => {
8071
+ Name => 'IntervalShooting',
8072
+ RawConv => '$$self{IntervalShooting} = $val',
8073
+ Format => 'int16u',
8074
+ PrintConv => q{
8075
+ return 'Off' if $val == 0 ;
8076
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
8077
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
8078
+ return "On: $i$f"
8079
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
8080
+ },
8081
+ },
8082
+ 0x6c9a => {
8083
+ Name => 'IntervalFrame',
8084
+ RawConv => '$$self{IntervalFrame} = $val',
8085
+ Condition => '$$self{IntervalShooting} > 0',
8086
+ Format => 'int16u',
8087
+ Hidden => 1,
8088
+ },
8089
+ ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8090
+ 0x7717 => {
8091
+ Name => 'Offsset5Hook',
8092
+ Hidden => 1,
8093
+ RawConv => 'undef',
8094
+ # account for variable location of Offset5 data
8095
+ Hook => '$varSize = $$self{Offset5} - 0x7718',
8096
+ },
8097
+ 0x7844 => {
8098
+ Name => 'FocusShiftShooting',
8099
+ RawConv => '$$self{FocusShiftShooting} = $val',
8100
+ PrintConv => q{
8101
+ return 'Off' if $val == 0 ;
8102
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8103
+ return "On: $i"
8104
+ },
8105
+ },
8106
+ ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8107
+ 0xeaea => {
8108
+ Name => 'OrientationHook',
8109
+ Hidden => 1,
8110
+ RawConv => 'undef',
8111
+ # account for variable location of OrientationInfo data
8112
+ Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb',
8113
+ },
8114
+ 0xeaeb => {
8115
+ Name => 'RollAngle',
8116
+ Format => 'fixed32u',
8117
+ Notes => 'converted to degrees of clockwise camera roll',
8118
+ ValueConv => '$val <= 180 ? $val : $val - 360',
8119
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
8120
+ PrintConv => 'sprintf("%.1f", $val)',
8121
+ PrintConvInv => '$val',
8122
+ },
8123
+ 0xeaef => {
8124
+ Name => 'PitchAngle',
8125
+ Format => 'fixed32u',
8126
+ Notes => 'converted to degrees of upward camera tilt',
8127
+ ValueConv => '$val <= 180 ? $val : $val - 360',
8128
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
8129
+ PrintConv => 'sprintf("%.1f", $val)',
8130
+ PrintConvInv => '$val',
8131
+ },
8132
+ 0xeaf3 => {
8133
+ Name => 'YawAngle',
8134
+ Format => 'fixed32u',
8135
+ Notes => 'the camera yaw angle when shooting in portrait orientation',
8136
+ ValueConv => '$val <= 180 ? $val : $val - 360',
8137
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
8138
+ PrintConv => 'sprintf("%.1f", $val)',
8139
+ PrintConvInv => '$val',
8140
+ },
8141
+ ### 0xeb5f - Offset26 info start (Z9 firmware 1.00)
8142
+ 0xeb6f => {
8143
+ Name => 'MenuSettingsZ9Offset',
8144
+ Writable => 0,
8145
+ Hidden => 1,
8146
+ # offset to MenuSettingsZ9 is relative to start of Offset26 block
8147
+ RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{Offset26}; undef', # (ignore if 0)
8148
+ },
8149
+ 0xeb70 => {
8150
+ Name => 'Hook5',
8151
+ Hidden => 1,
8152
+ RawConv => 'undef',
8153
+ # account for variable location of menu settings data
8154
+ Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b',
8155
+ },
8156
+ 0xec4b => {
8157
+ Name => 'MenuSettingsZ9',
8158
+ Format => 'undef[1646]',
8159
+ SubDirectory => {
8160
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8161
+ },
8162
+ },
8163
+ # note: DecryptLen currently set to 0xec4b + 1646
8164
+ );
8165
+
8166
+ %Image::ExifTool::Nikon::MenuSettingsZ7II = (
8167
+ %binaryDataAttrs,
8168
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8169
+ DATAMEMBER => [ 176, 180, 328, 352, 858 ],
8170
+ NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.',
8171
+ 160 => {
8172
+ Name => 'IntervalDurationHours',
8173
+ Format => 'int32u',
8174
+ #Condition => '$$self{IntervalShooting} > 0',
8175
+ },
8176
+ 164 => {
8177
+ Name => 'IntervalDurationMinutes',
8178
+ Format => 'int32u',
8179
+ #Condition => '$$self{IntervalShooting} > 0',
8180
+ },
8181
+ 168 => {
8182
+ Name => 'IntervalDurationSeconds',
8183
+ Format => 'int32u',
8184
+ #Condition => '$$self{IntervalShooting} > 0',
8185
+ },
8186
+ 176 => {
8187
+ Name => 'Intervals',
8188
+ Format => 'int32u',
8189
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
8190
+ #Condition => '$$self{IntervalShooting} > 0',
8191
+ },
8192
+ 180 => {
8193
+ Name => 'ShotsPerInterval',
8194
+ Format => 'int32u',
8195
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8196
+ #Condition => '$$self{IntervalShooting} > 0',
8197
+ },
8198
+ 184 => {
8199
+ Name => 'IntervalExposureSmoothing',
8200
+ #Condition => '$$self{IntervalShooting} > 0',
8201
+ Format => 'int8u',
8202
+ PrintConv => \%offOn,
8203
+ },
8204
+ 186 => {
8205
+ Name => 'IntervalPriority',
8206
+ #Condition => '$$self{IntervalShooting} > 0',
8207
+ Format => 'int8u',
8208
+ PrintConv => \%offOn,
8209
+ },
8210
+ 220 => {
8211
+ Name => 'FocusShiftNumberShots',
8212
+ },
8213
+ 224 => {
8214
+ Name => 'FocusShiftStepWidth',
8215
+ },
8216
+ 228 => {
8217
+ Name => 'FocusShiftInterval',
8218
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8219
+ },
8220
+ 232 => {
8221
+ Name => 'FocusShiftExposureLock',
8222
+ PrintConv => \%offOn,
8223
+ },
8224
+ #304 => White Balance - Kelvin Temp
8225
+ #312 => ColorSpace
8226
+ #314 => ActiveD-Lighting
8227
+ #318 => HighISONoiseReduction
8228
+ 322 => {
8229
+ Name => 'DiffractionCompensation',
8230
+ Format => 'int8u',
8231
+ PrintConv => \%offOn,
8232
+ },
8233
+ 323 => {
8234
+ Name => 'AutoDistortionControl',
8235
+ Format => 'int8u',
8236
+ PrintConv => \%offOn,
8237
+ },
8238
+ #324 => {Name => 'FlickerReductionShooting',}, # redundant with tag in NikonSettings
8239
+ 326 => {
8240
+ Name => 'NikonMeteringMode',
8241
+ Unknown => 1,
8242
+ PrintConv => {
8243
+ 0 => 'Matrix',
8244
+ 1 => 'Center',
8245
+ 2 => 'Spot',
8246
+ 3 => 'Highlight'
8247
+ },
8248
+ },
8249
+ 326 => { Name => 'NikonMeteringMode', PrintConv => \%meteringModeZ7},
8250
+ 328 => {
8251
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
8252
+ RawConv => '$$self{FlashControlMode} = $val',
8253
+ PrintConv => \%flashControlModeZ7,
8254
+ },
8255
+ 334 => {
8256
+ Name => 'FlashGNDistance',
8257
+ Condition => '$$self{FlashControlMode} == 2',
8258
+ Unknown => 1,
8259
+ ValueConv => '$val + 3',
8260
+ PrintConv => \%flashGNDistance,
8261
+ },
8262
+ 338 => {
8263
+ 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)
8264
+ Condition => '$$self{FlashControlMode} >= 3',
8265
+ Unknown => 1,
8266
+ ValueConv => '2 ** (-$val/3)',
8267
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8268
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8269
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8270
+ },
8271
+ 346 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8272
+ 348 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8273
+ 352 => {
8274
+ Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
8275
+ RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
8276
+ PrintConv => \%flashGroupOptionsMode,
8277
+ },
8278
+ 354 => {
8279
+ Name => 'FlashMasterCompensation',
8280
+ Format => 'int8s',
8281
+ Condition => '$$self{FlashGroupOptionsMasterMode} != 3', # other than 'Off'
8282
+ Unknown => 1,
8283
+ ValueConv => '$val/6',
8284
+ ValueConvInv => '6 * $val',
8285
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8286
+ PrintConvInv => '$val',
8287
+ },
8288
+ 358 => {
8289
+ Name => 'FlashMasterOutput',
8290
+ Unknown => 1,
8291
+ Condition => '$$self{FlashGroupOptionsMasterMode} == 1', # only for Mode=M
8292
+ ValueConv => '2 ** (-$val/3)',
8293
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8294
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8295
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8296
+ },
8297
+ #360 => {Name => 'FlashGroupAControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupACompensation at 362 and FlashGroupAOutput at 368
8298
+ #368 => {Name => 'FlashGroupBControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupBCompensation at 370 and FlashGroupBOutput at 374
8299
+ #376 => {Name => 'FlashGroupCControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupCCompensation at 378 and FlashGroupCOutput at 382
8300
+ #384 => {Name => 'FlashGroupDControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupDCompensation at 386 and FlashGroupDOutput at 390
8301
+ #392 => {Name => 'FlashGroupEControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupECompensation at 394 and FlashGroupEOutput at 398
8302
+ #400 => {Name => 'FlashGroupFControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupFCompensation at 402 and FlashGroupFOutput at 406
8303
+ #434 => FocusMode
8304
+ #436 => AFAreaMode
8305
+ #438 => VibrationReduction
8306
+ #442 => BracketSet
8307
+ #444 => BracketProgram
8308
+ #446 => BracketIncrement
8309
+ #463 => SilentPhotography
8310
+ 502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8311
+ 504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8312
+ 506 => {
8313
+ Name => 'MovieSlowMotion',
8314
+ Unknown => 1,
8315
+ PrintConv => {
8316
+ 0 => 'Off',
8317
+ 1 => 'On (4x)', # 120p recording with playback @ 30p [1920 x 1080; 30p x 4] or 100p recording with playback @ 25p [1920 x 1080; 25p x 4]
8318
+ 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5]
8319
+ },
8320
+ },
8321
+ 510 => {
8322
+ Name => 'MovieType',
8323
+ Unknown => 1,
8324
+ PrintConv => {
8325
+ 0 => 'MOV',
8326
+ 1 => 'MP4',
8327
+ },
8328
+ },
8329
+ #512 => MovieISOAutoHiLimit
8330
+ 516 => {
8331
+ Name => 'MovieISOAutoManualMode',
8332
+ Condition => '$$self{Model} =~ /^NIKON 7/', #ISO ranges vary by model. These mappings are for the Z7 and Z7II
8333
+ Format => 'int16u',
8334
+ Unknown => 1,
8335
+ ValueConv => '($val-104)/8',
8336
+ ValueConvInv => '8 * ($val + 104)',
8337
+ PrintConv => \%iSOAutoHiLimitZ7,
8338
+ },
8339
+ #520 => MovieWhiteBalanceSameAsPhoto
8340
+ 568 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8341
+ 572 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8342
+ 574 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8343
+ 576 => {
8344
+ Name => 'MovieVignetteControlSameAsPhoto',
8345
+ Unknown => 1,
8346
+ PrintConv => \%noYes
8347
+ },
8348
+ 577 => {
8349
+ Name => 'MovieDiffractionCompensation',
8350
+ Unknown => 1,
8351
+ PrintConv => \%offOn
8352
+ },
8353
+ 578 => {
8354
+ Name => 'MovieAutoDistortionControl',
8355
+ Unknown => 1,
8356
+ PrintConv => \%offOn
8357
+ },
8358
+ 584 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8359
+ #586 => MovieAFAreaMode
8360
+ 590 => {
8361
+ Name => 'MovieVibrationReduction',
8362
+ Unknown => 1,
8363
+ PrintConv => {
8364
+ 0 => 'Off',
8365
+ 1 => 'On (Normal)',
8366
+ 2 => 'On (Sport)',
8367
+ },
8368
+ },
8369
+ 591 => {
8370
+ Name => 'MovieVibrationReductionSameAsPhoto',
8371
+ Unknown => 1,
8372
+ PrintConv => \%noYes
8373
+ },
8374
+ #848 => HDMIOutputResolution
8375
+ #850 => HDMIOutputRange
8376
+ #854 => HDMIExternalRecorder
8377
+ #856 => HDMIBitDepth
8378
+ 858 => {
8379
+ Name => 'HDMIOutputN-Log', # one of the choices under SettingsMenu/HDMI/Advanced. Curiously,the HDR/HLC output option which is controlled by the same sub-menu is decoded thru NikonSettings
8380
+ Condition => '$$self{HDMIBitDepth} and $$self{HDMIBitDepth} == 2', # only for 10 bit
8381
+ RawConv => '$$self{HDMIOutputNLog} = $val',
8382
+ Unknown => 1,
8383
+ PrintConv => \%offOn,
8384
+ },
8385
+ #859 => HDMIViewAssist
8386
+ );
8387
+
8388
+ %Image::ExifTool::Nikon::MenuSettingsZ9 = (
8389
+ %binaryDataAttrs,
8390
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8391
+ DATAMEMBER => [ 140, 188, 192, 232, 424, 534 ],
8392
+ IS_SUBDIR => [ 799 ],
8393
+ NOTES => 'These tags are used by the Z9.',
8394
+ #90 ISO
8395
+ 140 => {
8396
+ Name => 'MultipleExposureMode',
8397
+ RawConv => '$$self{MultipleExposureMode} = $val',
8398
+ PrintConv => {
8399
+ 0 => 'Off',
8400
+ 1 => 'On (Series)',
8401
+ 2 => 'On',
8402
+ },
8403
+ },
8404
+ 142 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0' }, #range 2-9
8405
+ 188 => {
8406
+ Name => 'Intervals',
8407
+ Format => 'int32u',
8408
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
8409
+ Condition => '$$self{IntervalShooting} > 0',
8410
+ },
8411
+ 192 => {
8412
+ Name => 'ShotsPerInterval',
8413
+ Format => 'int32u',
8414
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8415
+ Condition => '$$self{IntervalShooting} > 0',
8416
+ },
8417
+ #220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
8418
+ 232 => {
8419
+ Name => 'FocusShiftNumberShots', #1-300
8420
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
8421
+ Condition => '$$self{FocusShiftShooting} > 0',
8422
+ },
8423
+ 236 => {
8424
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8425
+ Condition => '$$self{FocusShiftShooting} > 0',
8426
+ },
8427
+ 240 => {
8428
+ Name => 'FocusShiftInterval',
8429
+ Condition => '$$self{FocusShiftShooting} > 0',
8430
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8431
+ },
8432
+ 244 => {
8433
+ Name => 'FocusShiftExposureLock',
8434
+ Unknown => 1,
8435
+ PrintConv => \%offOn,
8436
+ Condition => '$$self{FocusShiftShooting} > 0',
8437
+ },
8438
+ 274 => {
8439
+ Name => 'PhotoShootingMenuBank',
8440
+ PrintConv => {
8441
+ 0 => 'A',
8442
+ 1 => 'B',
8443
+ 2 => 'C',
8444
+ 3 => 'D',
8445
+ },
8446
+ },
8447
+ 276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn, }, #single tag from both Photo & Video menus
8448
+ 308 => {
8449
+ Name => 'PhotoShootingMenuBankImageArea',
8450
+ PrintConv => {
8451
+ 0 => 'FX',
8452
+ 1 => 'DX',
8453
+ 4 => '16:9',
8454
+ 8 => '1:1',
8455
+ },
8456
+ },
8457
+ #310 ImageQuality
8458
+ 322 => { Name => 'AutoISO', PrintConv => \%offOn, },
8459
+ 324 => {
8460
+ Name => 'ISOAutoHiLimit',
8461
+ Format => 'int16u',
8462
+ Unknown => 1,
8463
+ ValueConv => '($val-104)/8',
8464
+ ValueConvInv => '8 * ($val + 104)',
8465
+ PrintConv => \%iSOAutoHiLimitZ7,
8466
+ },
8467
+ 326 => {
8468
+ Name => 'ISOAutoFlashLimit',
8469
+ Format => 'int16u',
8470
+ Unknown => 1,
8471
+ ValueConv => '($val-104)/8',
8472
+ ValueConvInv => '8 * ($val + 104)',
8473
+ PrintConv => \%iSOAutoHiLimitZ7,
8474
+ },
8475
+ #332 ISOAutoShutterTime - Auto setting 0=> 'Auto (Slowest)', 1 => 'Auto (Slower)', 2=> 'Auto', 3=> 'Auto (Faster)', 4=> 'Auto (Fastest)'
8476
+ 334 => {
8477
+ Name => 'ISOAutoShutterTime', #shutter speed is 2 ** (-$val/24)
8478
+ ValueConv => '$val / 8',
8479
+ Format => 'int16s',
8480
+ PrintConv => {
8481
+ -15 => 'Auto', #z9 firmware 1.00 maps both 'Auto' and '30 s' to -15
8482
+ -12 => '15 s',
8483
+ -9 => '8 s',
8484
+ -6 => '4 s',
8485
+ -3 => '2 s',
8486
+ 0 => '1 s',
8487
+ 1 => '1/1.3 s',
8488
+ 2 => '1/1.6 s',
8489
+ 3 => '1/2 s',
8490
+ 4 => '1/2.5 s',
8491
+ 5 => '1/3 s',
8492
+ 6 => '1/4 s',
8493
+ 7 => '1/5 s',
8494
+ 8 => '1/6 s',
8495
+ 9 => '1/8 s',
8496
+ 10 => '1/10 s',
8497
+ 11 => '1/13 s',
8498
+ 12 => '1/15 s',
8499
+ 13 => '1/20 s',
8500
+ 14 => '1/25 s',
8501
+ 15 => '1/30 s',
8502
+ 16 => '1/40 s',
8503
+ 17 => '1/50 s',
8504
+ 18 => '1/60 s',
8505
+ 19 => '1/80 s',
8506
+ 20 => '1/100 s',
8507
+ 21 => '1/120 s',
8508
+ 22 => '1/160 s',
8509
+ 23 => '1/200 s',
8510
+ 24 => '1/250 s',
8511
+ 25 => '1/320 s',
8512
+ 26 => '1/400 s',
8513
+ 27 => '1/500 s',
8514
+ 28 => '1/640 s',
8515
+ 29 => '1/800 s',
8516
+ 30 => '1/1000 s',
8517
+ 31 => '1/1250 s',
8518
+ 32 => '1/1600 s',
8519
+ 33 => '1/2000 s',
8520
+ 34 => '1/2500 s',
8521
+ 35 => '1/3200 s',
8522
+ 36 => '1/4000 s',
8523
+ 37 => '1/5000 s',
8524
+ 37.5 => '1/6000 s',
8525
+ 38 => '1/6400 s',
8526
+ 39 => '1/8000 s',
8527
+ 40 => '1/10000 s',
8528
+ 40.5 => '1/12000 s',
8529
+ 41 => '1/13000 s',
8530
+ 42 => '1/16000 s',
8531
+ },
8532
+ },
8533
+ #336 WhiteBalance
8534
+ #406 PictureControl
8535
+ #408 ColorSpace
8536
+ #410 ActiveD-Lighting
8537
+ #412 => { Name => 'NoiseReduction', PrintConv => \%offOn }, #Long Exposure Noise Reduction
8538
+ #414 HighISONoiseReduction
8539
+ #414 VignetteControl
8540
+ 416 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8541
+ 418 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8542
+ #419 AutoDistortionControl #value can be set from both the Photo Shoot Menu and the Video Shooting Menu
8543
+ 420 => { Name => 'FlickerReductionShooting', PrintConv => \%offOn },
8544
+ #422 MeteringMode
8545
+ 424 => {
8546
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
8547
+ RawConv => '$$self{FlashControlMode} = $val',
8548
+ PrintConv => \%flashControlModeZ7,
8549
+ },
8550
+ 426 => {
8551
+ Name => 'FlashMasterCompensation',
8552
+ Format => 'int8s',
8553
+ Unknown => 1,
8554
+ ValueConv => '$val/6',
8555
+ ValueConvInv => '6 * $val',
8556
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8557
+ PrintConvInv => '$val',
8558
+ },
8559
+ 430 => {
8560
+ Name => 'FlashGNDistance',
8561
+ Condition => '$$self{FlashControlMode} == 2',
8562
+ Unknown => 1,
8563
+ ValueConv => '$val + 3',
8564
+ PrintConv => \%flashGNDistance,
8565
+ },
8566
+ 434 => {
8567
+ 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)
8568
+ Condition => '$$self{FlashControlMode} >= 3',
8569
+ Unknown => 1,
8570
+ ValueConv => '2 ** (-$val/3)',
8571
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8572
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8573
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8574
+ },
8575
+ #442 flash wirelss control 0=> 'Off' 1=> 'CMD'
8576
+ 444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8577
+ 456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8578
+ #526 FocusMode
8579
+ 528 => {
8580
+ Name => 'AFAreaMode',
8581
+ PrintConv => {
8582
+ 1 => 'Single',
8583
+ 2 => 'Dynamic',
8584
+ 3 => 'Wide (S)',
8585
+ 4 => 'Wide (L)',
8586
+ 5 => '3D',
8587
+ 6 => 'Auto',
8588
+ },
8589
+ },
8590
+ 530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8591
+ 534 => {
8592
+ Name => 'BracketSet',
8593
+ RawConv => '$$self{BracketSet} = $val',
8594
+ PrintConv => {
8595
+ 0 => 'AE/Flash',
8596
+ 1 => 'AE',
8597
+ 2 => 'Flash',
8598
+ 3 => 'White Balance',
8599
+ 4 => 'Active-D Lighting',
8600
+ },
8601
+ },
8602
+ 536 => {
8603
+ Name => 'BracketProgram',
8604
+ Condition => '$$self{BracketSet} < 3',
8605
+ Notes => 'AE and/or Flash Bracketing',
8606
+ PrintConv => {
8607
+ 0 => 'Disabled',
8608
+ 2 => '2F',
8609
+ 3 => '3F',
8610
+ 4 => '4F',
8611
+ 5 => '5F',
8612
+ 7 => '7F',
8613
+ 9 => '9F',
8614
+ },
8615
+ },
8616
+ 538 => {
8617
+ Name => 'BracketIncrement',
8618
+ Condition => '$$self{BracketSet} < 3',
8619
+ Notes => 'AE and/or Flash Bracketing',
8620
+ PrintConv => {
8621
+ 0 => '0.3',
8622
+ #1 => '0.5',
8623
+ 2 => '0.7',
8624
+ 3 => '1.0',
8625
+ 4 => '2.0',
8626
+ 5 => '3.0',
8627
+ },
8628
+ },
8629
+ #544 BracketProgram for ADL
8630
+ 556 => {
8631
+ Name => 'SecondarySlotFunction',
8632
+ PrintConv => {
8633
+ 0 => 'Overflow',
8634
+ 1 => 'Backup',
8635
+ 2 => 'NEF Primary + JPG Secondary',
8636
+ 3 => 'JPG Primary + JPG Secondary',
8637
+ },
8638
+ },
8639
+ 572 => { Name => 'DXCropAlert', PrintConv => \%offOn, },
8640
+ 574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9},
8641
+ 604 => {
8642
+ Name => 'MovieImageArea',
8643
+ Unknown => 1,
8644
+ Mask => 0x01, #without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
8645
+ PrintConv => {
8646
+ 0 => 'FX',
8647
+ 1 => 'DX',
8648
+ },
8649
+ },
8650
+ 614 => {
8651
+ Name => 'MovieType',
8652
+ Unknown => 1,
8653
+ PrintConv => {
8654
+ 1 => 'H.265 8-bit (MP4)',
8655
+ 2 => 'H.265 8-bit (MOV)',
8656
+ 3 => 'H.265 10-bit (MOV)',
8657
+ 4 => 'ProRes 422 HQ 10-bit (MOV)',
8658
+ },
8659
+ },
8660
+ 616 => {
8661
+ Name => 'MovieISOAutoHiLimit',
8662
+ Format => 'int16u',
8663
+ Unknown => 1,
8664
+ ValueConv => '($val-104)/8',
8665
+ ValueConvInv => '8 * ($val + 104)',
8666
+ PrintConv => \%iSOAutoHiLimitZ7,
8667
+ },
8668
+ 618 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1},
8669
+ 620 => {
8670
+ Name => 'MovieISOAutoManualMode',
8671
+ Format => 'int16u',
8672
+ Unknown => 1,
8673
+ ValueConv => '($val-104)/8',
8674
+ ValueConvInv => '8 * ($val + 104)',
8675
+ PrintConv => \%iSOAutoHiLimitZ7,
8676
+ },
8677
+ 696 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1},
8678
+ 698 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1},
8679
+ 704 => {
8680
+ Name => 'MovieFlickerReduction',
8681
+ PrintConv => {
8682
+ 0 => 'Auto',
8683
+ 1 => '50Hz',
8684
+ 2 => '60Hz',
8685
+ },
8686
+ },
8687
+ 706 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, , Unknown => 1},
8688
+ 708 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1},
8689
+ 710 => {
8690
+ Name => 'MovieAFAreaMode',
8691
+ PrintConv => {
8692
+ 1 => 'Single',
8693
+ 3 => 'Wide (S)',
8694
+ 4 => 'Wide (L)',
8695
+ 6 => 'Auto',
8696
+ 11 => 'Subject Tracking',
8697
+ },
8698
+ },
8699
+ 712 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1},
8700
+ 716 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8701
+ 718 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'On', 2 => 'On' }, Unknown => 1 }, #not sure why the unusal mapping with 2 => 'On'
8702
+ 720 => { Name => 'MicrophoneSensitivity', Unknown => 1}, #1-20
8703
+ 722 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, #distinct from MoveieVRMode
8704
+ 724 => { Name => 'MicrophoneFrequencyResponse', PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
8705
+ 726 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
8706
+ 748 => {
8707
+ Name => 'MovieToneMap',
8708
+ Unknown => 1,
8709
+ PrintConv => {
8710
+ 0 => 'SDR',
8711
+ 1 => 'HLG',
8712
+ 2 => 'N-Log',
8713
+ },
8714
+ },
8715
+ 754 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1},
8716
+ 756 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1},
8717
+ 762 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
8718
+ 763 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
8719
+ 764 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1},
8720
+ 799 => {
8721
+ Name => 'CustomSettingsZ9',
8722
+ Format => 'undef[608]',
8723
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9' },
8724
+ },
8725
+ 1426 => {
8726
+ Name => 'Language',
8727
+ Unknown => 1,
8728
+ PrintConv => {
8729
+ 4 => 'English',
8730
+ 5 => 'Spanish',
8731
+ 7 => 'French',
8732
+ },
8733
+ },
8734
+ 1428 => {
8735
+ Name => 'TimeZone',
8736
+ PrintConv => {
8737
+ 5 => '+09:00 (Tokyo)',
8738
+ 6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8739
+ 10 => '+05:45 (Kathmandu)',
8740
+ 11 => '+05:30 (New Dehli)',
8741
+ 16 => '+03:00 (Moscow, Nairobi)',
8742
+ 15 => '+02:00 (Athens)',
8743
+ 16 => '+01:00 (Madrid, Paris, Berlin)',
8744
+ 17 => '+02:00 (Athens, Helsinki)',
8745
+ 18 => '+00:00 (London)',
8746
+ 19 => '+00:00', #PH (unknown city)
8747
+ 22 => '-03:00 (Buenos Aires, Sao Paulo)',
8748
+ 24 => '-04:00 (Manaus, Caracas)',
8749
+ 25 => '-05:00 (New York, Toronto, Lima)',
8750
+ 26 => '-06:00 (Chicago, Mexico City)',
8751
+ 27 => '-07:00 (Denver)',
8752
+ 28 => '-08:00 (Los Angeles, Vancouver)',
8753
+ 29 => '-09:00 (Anchorage)',
8754
+ 30 => '-10:00 (Hawaii)',
8755
+ },
8756
+ },
8757
+ 1434 => {Name => 'MonitorBrightness', ValueConv => '$val - 5', Unknown => 1}, # settings: -5 to +5
8758
+ 1456 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
8759
+ 1552 => {
8760
+ Name => 'HDMIOutputResolution',
8761
+ PrintConv => {
8762
+ 0 => 'Auto',
8763
+ 1 => '4320p',
8764
+ 2 => '2160p',
8765
+ 3 => '1080p',
8766
+ #4 => '1080i',
8767
+ 5 => '720p',
8768
+ #6 => '576p',
8769
+ #7 => '480p',
8770
+ },
8771
+ },
8772
+ 1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
8773
+ 1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
8774
+ 1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
8775
+ 1608 => { Name => 'EnergySavingMode', PrintConv =>\%offOn, Unknown => 1 },
8776
+ 1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
8777
+ 1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
8778
+ 1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
8779
+ );
8780
+
8781
+ # Flash information (ref JD)
8782
+ %Image::ExifTool::Nikon::FlashInfo0100 = (
8783
+ %binaryDataAttrs,
8784
+ DATAMEMBER => [ 9.2, 15, 16 ],
8785
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8786
+ NOTES => q{
8787
+ These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
8788
+ D200.
8789
+ },
8790
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
8791
+ 0 => {
8792
+ Name => 'FlashInfoVersion',
8793
+ Format => 'string[4]',
8794
+ Writable => 0,
8795
+ },
8796
+ 4 => { #PH
8797
+ Name => 'FlashSource',
8798
+ PrintConv => {
8799
+ 0 => 'None',
8800
+ 1 => 'External',
8801
+ 2 => 'Internal',
8802
+ },
8803
+ },
8804
+ # 5 - values: 46,48,50,54,78
8805
+ 6 => {
8806
+ Format => 'int8u[2]',
8807
+ Name => 'ExternalFlashFirmware',
8808
+ SeparateTable => 'FlashFirmware',
8809
+ PrintConv => \%flashFirmware,
8810
+ },
8811
+ 8 => {
8812
+ Name => 'ExternalFlashFlags',
8813
+ PrintConv => { 0 => '(none)',
8814
+ BITMASK => {
8815
+ 0 => 'Fired', #28
8816
+ 2 => 'Bounce Flash', #PH
8817
+ 4 => 'Wide Flash Adapter',
8818
+ 5 => 'Dome Diffuser', #28
8819
+ },
8820
+ },
8821
+ },
8822
+ 9.1 => {
8823
+ Name => 'FlashCommanderMode',
8824
+ Mask => 0x80,
8825
+ PrintConv => { 0 => 'Off', 1 => 'On' },
8826
+ },
8827
+ 9.2 => {
8828
+ Name => 'FlashControlMode',
8829
+ Mask => 0x7f,
8830
+ DataMember => 'FlashControlMode',
8831
+ RawConv => '$$self{FlashControlMode} = $val',
8832
+ PrintConv => \%flashControlMode,
8833
+ SeparateTable => 'FlashControlMode',
8834
+ },
8835
+ 10 => [
8836
+ {
8837
+ Name => 'FlashOutput',
8838
+ Condition => '$$self{FlashControlMode} >= 0x06',
8839
+ ValueConv => '2 ** (-$val/6)',
8840
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8841
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8842
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8843
+ },
8844
+ {
8845
+ Name => 'FlashCompensation',
8846
+ Format => 'int8s',
8847
+ Priority => 0,
8848
+ ValueConv => '-$val/6',
8849
+ ValueConvInv => '-6 * $val',
8850
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
8851
+ PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
8852
+ },
8853
+ ],
8854
+ 11 => {
8855
+ Name => 'FlashFocalLength',
8856
+ RawConv => '$val ? $val : undef',
8857
+ PrintConv => '"$val mm"',
8858
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8859
+ },
8860
+ 12 => {
8861
+ Name => 'RepeatingFlashRate',
8862
+ RawConv => '$val ? $val : undef',
8863
+ PrintConv => '"$val Hz"',
8864
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8865
+ },
8866
+ 13 => {
8867
+ Name => 'RepeatingFlashCount',
8868
+ RawConv => '$val ? $val : undef',
8869
+ },
8870
+ 14 => { #PH
8871
+ Name => 'FlashGNDistance',
8872
+ SeparateTable => 1,
8873
+ PrintConv => \%flashGNDistance,
8874
+ },
8875
+ 15 => {
8876
+ Name => 'FlashGroupAControlMode',
8877
+ Mask => 0x0f,
8878
+ DataMember => 'FlashGroupAControlMode',
8879
+ RawConv => '$$self{FlashGroupAControlMode} = $val',
8880
+ PrintConv => \%flashControlMode,
8881
+ SeparateTable => 'FlashControlMode',
8882
+ },
8883
+ 16 => {
8884
+ Name => 'FlashGroupBControlMode',
8885
+ Mask => 0x0f,
8886
+ DataMember => 'FlashGroupBControlMode',
8887
+ RawConv => '$$self{FlashGroupBControlMode} = $val',
8888
+ PrintConv => \%flashControlMode,
8889
+ SeparateTable => 'FlashControlMode',
8890
+ },
8891
+ 17 => [
8892
+ {
8893
+ Name => 'FlashGroupAOutput',
8894
+ Condition => '$$self{FlashGroupAControlMode} >= 0x06',
8895
+ ValueConv => '2 ** (-$val/6)',
8896
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8897
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8898
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8899
+ },
8900
+ {
8901
+ Name => 'FlashGroupACompensation',
8902
+ Format => 'int8s',
8903
+ ValueConv => '-$val/6',
8904
+ ValueConvInv => '-6 * $val',
8905
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8906
+ PrintConvInv => '$val',
8907
+ },
8908
+ ],
8909
+ 18 => [
8910
+ {
8911
+ Name => 'FlashGroupBOutput',
8912
+ Condition => '$$self{FlashGroupBControlMode} >= 0x06',
8913
+ ValueConv => '2 ** (-$val/6)',
8914
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8915
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8916
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8917
+ },
8918
+ {
8919
+ Name => 'FlashGroupBCompensation',
8920
+ Format => 'int8s',
8921
+ ValueConv => '-$val/6',
8922
+ ValueConvInv => '-6 * $val',
8923
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8924
+ PrintConvInv => '$val',
8925
+ },
8926
+ ],
8927
+ );
8928
+
8929
+ # Flash information for D40, D40x, D3 and D300 (ref JD)
8930
+ %Image::ExifTool::Nikon::FlashInfo0102 = (
8931
+ %binaryDataAttrs,
8932
+ DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ],
8933
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8934
+ NOTES => q{
8935
+ These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
8936
+ (firmware 1.00).
8937
+ },
8938
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
8939
+ 0 => {
8940
+ Name => 'FlashInfoVersion',
8941
+ Format => 'string[4]',
8942
+ Writable => 0,
8943
+ },
8944
+ 4 => { #PH
8945
+ Name => 'FlashSource',
8946
+ PrintConv => {
8947
+ 0 => 'None',
8948
+ 1 => 'External',
8949
+ 2 => 'Internal',
8950
+ },
8951
+ },
8952
+ # 5 - values: 46,48,50,54,78
8953
+ 6 => {
8954
+ Format => 'int8u[2]',
8955
+ Name => 'ExternalFlashFirmware',
8956
+ SeparateTable => 'FlashFirmware',
8957
+ PrintConv => \%flashFirmware,
8958
+ },
8959
+ 8 => {
8960
+ Name => 'ExternalFlashFlags',
8961
+ PrintConv => { BITMASK => {
8962
+ 0 => 'Fired', #28
8963
+ 2 => 'Bounce Flash', #PH
8964
+ 4 => 'Wide Flash Adapter',
8965
+ 5 => 'Dome Diffuser', #28
8966
+ }},
8967
+ },
8968
+ 9.1 => {
8969
+ Name => 'FlashCommanderMode',
8970
+ Mask => 0x80,
8971
+ PrintConv => { 0 => 'Off', 1 => 'On' },
8972
+ },
8973
+ 9.2 => {
8974
+ Name => 'FlashControlMode',
8975
+ Mask => 0x7f,
8976
+ DataMember => 'FlashControlMode',
8977
+ RawConv => '$$self{FlashControlMode} = $val',
8978
+ PrintConv => \%flashControlMode,
8979
+ SeparateTable => 'FlashControlMode',
8980
+ },
8981
+ 10 => [
8982
+ {
8983
+ Name => 'FlashOutput',
8984
+ Condition => '$$self{FlashControlMode} >= 0x06',
8985
+ ValueConv => '2 ** (-$val/6)',
8986
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8987
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8988
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8989
+ },
8990
+ {
8991
+ Name => 'FlashCompensation',
8992
+ # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
8993
+ # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
8994
+ Format => 'int8s',
8995
+ Priority => 0,
8996
+ ValueConv => '-$val/6',
8997
+ ValueConvInv => '-6 * $val',
8998
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
8999
+ PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
9000
+ },
9001
+ ],
9002
+ 12 => {
9003
+ Name => 'FlashFocalLength',
9004
+ RawConv => '$val ? $val : undef',
9005
+ PrintConv => '"$val mm"',
9006
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9007
+ },
9008
+ 13 => {
9009
+ Name => 'RepeatingFlashRate',
9010
+ RawConv => '$val ? $val : undef',
9011
+ PrintConv => '"$val Hz"',
9012
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9013
+ },
9014
+ 14 => {
9015
+ Name => 'RepeatingFlashCount',
9016
+ RawConv => '$val ? $val : undef',
9017
+ },
9018
+ 15 => { #PH
9019
+ Name => 'FlashGNDistance',
9020
+ SeparateTable => 1,
9021
+ PrintConv => \%flashGNDistance,
9022
+ },
9023
+ 16.1 => {
9024
+ Name => 'FlashGroupAControlMode',
9025
+ Mask => 0x0f,
9026
+ Notes => 'note: group A tags may apply to the built-in flash settings for some models',
9027
+ DataMember => 'FlashGroupAControlMode',
9028
+ RawConv => '$$self{FlashGroupAControlMode} = $val',
9029
+ PrintConv => \%flashControlMode,
9030
+ SeparateTable => 'FlashControlMode',
9031
+ },
9032
+ 17.1 => {
9033
+ Name => 'FlashGroupBControlMode',
9034
+ Mask => 0xf0,
9035
+ Notes => 'note: group B tags may apply to group A settings for some models',
9036
+ DataMember => 'FlashGroupBControlMode',
9037
+ RawConv => '$$self{FlashGroupBControlMode} = $val',
9038
+ PrintConv => \%flashControlMode,
9039
+ SeparateTable => 'FlashControlMode',
9040
+ },
9041
+ 17.2 => { #PH
9042
+ Name => 'FlashGroupCControlMode',
9043
+ Mask => 0x0f,
9044
+ Notes => 'note: group C tags may apply to group B settings for some models',
9045
+ DataMember => 'FlashGroupCControlMode',
9046
+ RawConv => '$$self{FlashGroupCControlMode} = $val',
9047
+ PrintConv => \%flashControlMode,
9048
+ SeparateTable => 'FlashControlMode',
9049
+ },
9050
+ 18 => [
9051
+ {
9052
+ Name => 'FlashGroupAOutput',
9053
+ Condition => '$$self{FlashGroupAControlMode} >= 0x06',
9054
+ ValueConv => '2 ** (-$val/6)',
9055
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9056
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9057
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9058
+ },
9059
+ {
9060
+ Name => 'FlashGroupACompensation',
9061
+ Format => 'int8s',
9062
+ ValueConv => '-$val/6',
9063
+ ValueConvInv => '-6 * $val',
9064
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9065
+ PrintConvInv => '$val',
9066
+ },
9067
+ ],
9068
+ 19 => [
9069
+ {
9070
+ Name => 'FlashGroupBOutput',
9071
+ Condition => '$$self{FlashGroupBControlMode} >= 0x60',
9072
+ ValueConv => '2 ** (-$val/6)',
9073
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9074
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9075
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9076
+ },
9077
+ {
9078
+ Name => 'FlashGroupBCompensation',
9079
+ Format => 'int8s',
9080
+ ValueConv => '-$val/6',
9081
+ ValueConvInv => '-6 * $val',
9082
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9083
+ PrintConvInv => '$val',
9084
+ },
9085
+ ],
9086
+ 20 => [ #PH
9087
+ {
9088
+ Name => 'FlashGroupCOutput',
9089
+ Condition => '$$self{FlashGroupCControlMode} >= 0x06',
9090
+ ValueConv => '2 ** (-$val/6)',
9091
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9092
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9093
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9094
+ },
9095
+ {
9096
+ Name => 'FlashGroupCCompensation',
9097
+ Format => 'int8s',
9098
+ ValueConv => '-$val/6',
9099
+ ValueConvInv => '-6 * $val',
9100
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9101
+ PrintConvInv => '$val',
9102
+ },
9103
+ ],
9104
+ );
9105
+
9106
+ # Flash information (ref JD)
9107
+ %Image::ExifTool::Nikon::FlashInfo0100 = (
9108
+ %binaryDataAttrs,
9109
+ DATAMEMBER => [ 9.2, 15, 16 ],
9110
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9111
+ NOTES => q{
9112
+ These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
9113
+ D200.
9114
+ },
9115
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
9116
+ 0 => {
9117
+ Name => 'FlashInfoVersion',
9118
+ Format => 'string[4]',
9119
+ Writable => 0,
9120
+ },
9121
+ 4 => { #PH
9122
+ Name => 'FlashSource',
9123
+ PrintConv => {
9124
+ 0 => 'None',
9125
+ 1 => 'External',
9126
+ 2 => 'Internal',
7463
9127
  },
7464
9128
  },
7465
9129
  # 5 - values: 46,48,50,54,78
@@ -8333,7 +9997,7 @@ my %nikonFocalConversions = (
8333
9997
  ],
8334
9998
  );
8335
9999
 
8336
- # Flash information for the Z7_2 (ref 28)
10000
+ # Flash information for the Z7II (ref 28)
8337
10001
  # (likey similar to FlashInfo010 and FlashInfo0108 with addition of support for radio controlled units such as the SB-5000?
8338
10002
  %Image::ExifTool::Nikon::FlashInfo0300 = (
8339
10003
  %binaryDataAttrs,
@@ -8357,7 +10021,7 @@ my %nikonFocalConversions = (
8357
10021
  SeparateTable => 'FlashFirmware',
8358
10022
  PrintConv => \%flashFirmware,
8359
10023
  },
8360
- 27 => {
10024
+ 10 => {
8361
10025
  Name => 'FlashCompensation',
8362
10026
  # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
8363
10027
  # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
@@ -8492,6 +10156,25 @@ my %nikonFocalConversions = (
8492
10156
  },
8493
10157
  );
8494
10158
 
10159
+ # MakerNotes0x51 - compression info for Z9
10160
+ %Image::ExifTool::Nikon::MakerNotes0x51 = (
10161
+ %binaryDataAttrs,
10162
+ DATAMEMBER => [ 0 ],
10163
+ GROUPS => { 0 => 'MakerNotes' },
10164
+ 0 => {
10165
+ Name => 'FirmwareVersion',
10166
+ Format => 'string[8]',
10167
+ Writable => 0,
10168
+ RawConv => '$$self{FirmwareVersion} = $val',
10169
+ },
10170
+ 10 => {
10171
+ Name => 'NEFCompression',
10172
+ Writable => 'int16u',
10173
+ SeparateTable => 'NEFCompression',
10174
+ PrintConv => \%nefCompression,
10175
+ },
10176
+ );
10177
+
8495
10178
  # extra info found in IFD0 of NEF files (ref PH, Z6/Z7)
8496
10179
  %Image::ExifTool::Nikon::NEFInfo = (
8497
10180
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -9266,7 +10949,7 @@ my %nikonFocalConversions = (
9266
10949
  },
9267
10950
  },
9268
10951
  {
9269
- Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
10952
+ Condition => '$$valPt =~ /^080[012]/', # Z6/Z7/Z9
9270
10953
  Name => 'LensData0800',
9271
10954
  SubDirectory => {
9272
10955
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -9351,6 +11034,103 @@ my %nikonFocalConversions = (
9351
11034
  },
9352
11035
  );
9353
11036
 
11037
+ # Nikon XMP tags written in NKSC metadata
11038
+ %Image::ExifTool::Nikon::ast = (
11039
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-ast', 2 => 'Image' },
11040
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11041
+ NAMESPACE => 'ast',
11042
+ VARS => { NO_ID => 1 },
11043
+ NOTES => 'Tags used by Nikon NX Studio in Nikon NKSC sidecar files and trailers.',
11044
+ about => { },
11045
+ version => { },
11046
+ XMLPackets => {
11047
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
11048
+ Encoding => 'Base64',
11049
+ Binary => 1,
11050
+ },
11051
+ IPTC => {
11052
+ SubDirectory => { TagTable => 'Image::ExifTool::IPTC::Main' },
11053
+ Encoding => 'Base64',
11054
+ Binary => 1,
11055
+ },
11056
+ GPSVersionID => { Groups => { 2 => 'Location' }, %base64bytes },
11057
+ GPSLatitudeRef => {
11058
+ Groups => { 2 => 'Location' },
11059
+ %base64int32u,
11060
+ PrintConv => { 0 => 'North', 1 => 'South' }, #PH (NC)
11061
+ },
11062
+ GPSLatitude => { Groups => { 2 => 'Location' }, %base64coord },
11063
+ GPSLongitudeRef => {
11064
+ Groups => { 2 => 'Location' },
11065
+ %base64int32u,
11066
+ PrintConv => { 2 => 'East', 3 => 'West' }, #PH (NC)
11067
+ },
11068
+ GPSLongitude => { Groups => { 2 => 'Location' }, %base64coord },
11069
+ GPSAltitudeRef => {
11070
+ Groups => { 2 => 'Location' },
11071
+ %base64bytes,
11072
+ PrintConv => {
11073
+ 0 => 'Above Sea Level',
11074
+ 1 => 'Below Sea Level',
11075
+ },
11076
+ },
11077
+ GPSAltitude => {
11078
+ Groups => { 2 => 'Location' },
11079
+ %base64double,
11080
+ PrintConv => '"$val m"',
11081
+ },
11082
+ GPSMapDatum => { Groups => { 2 => 'Location' } },
11083
+ GPSImgDirection => {
11084
+ Groups => { 2 => 'Location' },
11085
+ %base64double,
11086
+ PrintConv => 'sprintf("%.2f", $val)',
11087
+ },
11088
+ GPSImgDirectionRef => {
11089
+ Groups => { 2 => 'Location' },
11090
+ PrintConv => {
11091
+ M => 'Magnetic North',
11092
+ T => 'True North',
11093
+ },
11094
+ },
11095
+ );
11096
+ %Image::ExifTool::Nikon::sdc = (
11097
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' },
11098
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11099
+ NAMESPACE => 'sdc',
11100
+ VARS => { NO_ID => 1 },
11101
+ about => { },
11102
+ version => { },
11103
+ appversion => { Name => 'AppVersion' },
11104
+ appname => { Name => 'AppName' },
11105
+ );
11106
+ %Image::ExifTool::Nikon::nine = (
11107
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-nine', 2 => 'Image' },
11108
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11109
+ NAMESPACE => 'nine',
11110
+ VARS => { NO_ID => 1 },
11111
+ about => { },
11112
+ version => { },
11113
+ Label => { },
11114
+ Rating => { },
11115
+ Trim => { %base64bin },
11116
+ NineEdits => {
11117
+ SubDirectory => {
11118
+ TagTable => 'Image::ExifTool::Nikon::NineEdits',
11119
+ IgnoreProp => { userData => 1 }, # remove "UserData" from already overly long tag names
11120
+ },
11121
+ Binary => 1,
11122
+ },
11123
+ );
11124
+ %Image::ExifTool::Nikon::NineEdits = (
11125
+ GROUPS => { 0 => 'XML', 1 => 'NineEdits', 2 => 'Image' },
11126
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
11127
+ VARS => { NO_ID => 1 },
11128
+ NOTES => 'XML-based tags used to store editing information.',
11129
+ filterParametersBinary => { %base64bin },
11130
+ filterParametersExportExportData => { %base64bin },
11131
+ filterParametersCustomCustomData => { %base64bin },
11132
+ );
11133
+
9354
11134
  # Nikon composite tags
9355
11135
  %Image::ExifTool::Nikon::Composite = (
9356
11136
  GROUPS => { 2 => 'Camera' },
@@ -9542,7 +11322,7 @@ sub PrintAFPointsLeftRight($$)
9542
11322
 
9543
11323
  #------------------------------------------------------------------------------
9544
11324
  # Print conversion for relative Up/Down AF points (ref 28)
9545
- # Inputs: 0) column, 1) number of columns
11325
+ # Inputs: 0) row, 1) number of rows
9546
11326
  # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
9547
11327
  sub PrintAFPointsUpDown($$)
9548
11328
  {
@@ -9744,6 +11524,72 @@ sub SerialKey($$)
9744
11524
  return 0x60; # D200 (ref 10), D40X (ref PH), etc
9745
11525
  }
9746
11526
 
11527
+ #------------------------------------------------------------------------------
11528
+ # Extract information from "NIKON APP" trailer (ref PH)
11529
+ # Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info
11530
+ # Returns: true on success
11531
+ sub ProcessNikonApp($;$)
11532
+ {
11533
+ local $_;
11534
+ my ($et, $dirInfo) = @_;
11535
+ my $raf = $$et{RAF};
11536
+ my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
11537
+ my $buff;
11538
+
11539
+ return 0 unless $raf->Seek(-20-$offset, 2) and $raf->Read($buff, 20) == 20 and
11540
+ substr($buff,-16) eq "\0\0\0\0\0\0/NIKON APP"; # check magic number
11541
+
11542
+ my $verbose = $et->Options('Verbose');
11543
+ my $fileEnd = $raf->Tell();
11544
+ my $trailerLen = unpack('N', $buff);
11545
+ $trailerLen > $fileEnd and $et->Warn('Bad NikonApp trailer size'), return 0;
11546
+ if ($dirInfo) {
11547
+ $$dirInfo{DirLen} = $trailerLen if $dirInfo;
11548
+ $$dirInfo{DataPos} = $fileEnd - $trailerLen;
11549
+ if ($$dirInfo{OutFile}) {
11550
+ if ($$et{DEL_GROUP}{NikonApp}) {
11551
+ ++$$et{CHANGED};
11552
+ # just copy the trailer when writing
11553
+ } elsif ($trailerLen > $fileEnd or not $raf->Seek($$dirInfo{DataPos}, 0) or
11554
+ $raf->Read(${$$dirInfo{OutFile}}, $trailerLen) != $trailerLen)
11555
+ {
11556
+ return 0;
11557
+ } else {
11558
+ return 1;
11559
+ }
11560
+ }
11561
+ $et->DumpTrailer($dirInfo) if $verbose or $$et{HTML_DUMP};
11562
+ }
11563
+ unless ($trailerLen >= 0x40 and $raf->Seek($fileEnd - $trailerLen, 0) and
11564
+ $raf->Read($buff, 0x40) == 0x40 and $buff =~ m(NIKON APP\0))
11565
+ {
11566
+ $et->Warn('Error reading NikonApp trailer');
11567
+ return 0;
11568
+ }
11569
+ $$et{SET_GROUP0} = 'NikonApp';
11570
+ while ($raf->Read($buff, 8) == 8) {
11571
+ my ($id, $len) = unpack('N2', $buff);
11572
+ if ($len & 0x80000000) {
11573
+ $et->Warn('Invalid NikonApp record length');
11574
+ last;
11575
+ }
11576
+ last if $id == 0 and $len == 0;
11577
+ unless ($raf->Read($buff, $len) == $len) {
11578
+ $et->Warn('Truncated NikonApp record');
11579
+ last;
11580
+ }
11581
+ if ($id == 1) {
11582
+ require Image::ExifTool::XMP;
11583
+ Image::ExifTool::XMP::ProcessXMP($et, { DataPt => \$buff });
11584
+ } else { # (haven't seen any other types of records)
11585
+ $et->Warn("Unknown NikonApp record $id");
11586
+ last;
11587
+ }
11588
+ }
11589
+ delete $$et{SET_GROUP0};
11590
+ return 1;
11591
+ }
11592
+
9747
11593
  #------------------------------------------------------------------------------
9748
11594
  # Read Nikon NCTG tags in MOV videos
9749
11595
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -10085,7 +11931,7 @@ Nikon maker notes in EXIF information.
10085
11931
 
10086
11932
  =head1 AUTHOR
10087
11933
 
10088
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
11934
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
10089
11935
 
10090
11936
  This library is free software; you can redistribute it and/or modify it
10091
11937
  under the same terms as Perl itself.