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