exiftool-vendored.exe 12.34.0 → 12.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/bin/exiftool_files/Changes +61 -2
  2. package/bin/exiftool_files/README +2 -2
  3. package/bin/exiftool_files/exiftool.pl +63 -35
  4. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +6 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +143 -9
  6. package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +12 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +2 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +13 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +33 -8
  10. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +14 -10
  12. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +3 -3
  13. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +108 -11
  14. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1203 -96
  15. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +5 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +135 -71
  17. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +4 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +1 -0
  19. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +14 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +26 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +3 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +9 -4
  23. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6363 -5846
  24. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +1215 -39
  25. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +10 -11
  26. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +10 -5
  27. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +110 -24
  28. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +1 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool.pm +51 -12
  30. package/package.json +2 -2
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
62
62
  use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
 
65
- $VERSION = '4.00';
65
+ $VERSION = '4.03';
66
66
 
67
67
  sub LensIDConv($$$);
68
68
  sub ProcessNikonAVI($$$);
@@ -404,6 +404,7 @@ sub GetAFPointGrid($$;$);
404
404
  '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
405
405
  'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
406
406
  '96 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 II DG HSM', #Jurgen Sahlberg
407
+ 'CA 3C 1F 37 30 30 4B 46' => 'Sigma 12-24mm F4 DG HSM | A', #github issue#101
407
408
  'C1 48 24 37 24 24 4B 46' => 'Sigma 14-24mm F2.8 DG HSM | A', #30
408
409
  '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF',
409
410
  '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG Aspherical HSM',
@@ -1045,7 +1046,9 @@ my %cropHiSpeed = ( #IB
1045
1046
  10 => '1.3x Movie Crop', #36 (D4/D500)
1046
1047
  11 => 'FX Uncropped',
1047
1048
  12 => 'DX Uncropped',
1048
- 15 => '1.5x Movie Crop', #36 (D4/D500)
1049
+ 13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936
1050
+ 14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856
1051
+ 15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872
1049
1052
  17 => '1:1 Crop',
1050
1053
  OTHER => sub {
1051
1054
  my ($val, $inv, $conv) = @_;
@@ -1057,7 +1060,31 @@ my %cropHiSpeed = ( #IB
1057
1060
  },
1058
1061
  );
1059
1062
 
1063
+ my %flashGroupOptionsMode = (
1064
+ 0 => 'TTL',
1065
+ 1 => 'Manual',
1066
+ 2 => 'Auto',
1067
+ 3 => 'Off',
1068
+ );
1069
+
1070
+ my %nefCompression = ( #28 relocated to MakerNotes_0x51 at offset x'0a (Z9)
1071
+ 1 => 'Lossy (type 1)', # (older models)
1072
+ 2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!)
1073
+ 3 => 'Lossless',
1074
+ 4 => 'Lossy (type 2)',
1075
+ 5 => 'Striped packed 12 bits', #IB
1076
+ 6 => 'Uncompressed (reduced to 12 bit)', #IB
1077
+ 7 => 'Unpacked 12 bits', #IB (padded to 16)
1078
+ 8 => 'Small', #IB
1079
+ 9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
1080
+ 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
1081
+ 13 => 'High Efficiency', #28
1082
+ 14 => 'High Efficiency*', #28
1083
+ );
1084
+
1085
+ my %noYes = ( 0 => 'No' , 1 => 'Yes', );
1060
1086
  my %offOn = ( 0 => 'Off', 1 => 'On' );
1087
+ my %onOff = ( 0 => 'On', 1 => 'Off' );
1061
1088
 
1062
1089
  # common attributes for writable BinaryData directories
1063
1090
  my %binaryDataAttrs = (
@@ -1464,6 +1491,16 @@ my %binaryDataAttrs = (
1464
1491
  Name => 'ColorTemperatureAuto',
1465
1492
  Writable => 'int16u',
1466
1493
  },
1494
+ 0x0051 => { #28 (Z9)
1495
+ Name => 'MakerNotes0x51',
1496
+ Writable => 'undef',
1497
+ Hidden => 1,
1498
+ Permanent => 0,
1499
+ Flags => [ 'Binary', 'Protected' ],
1500
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MakerNotes0x51' },
1501
+ },
1502
+ #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)
1503
+ #0x005e #28 possibly DiffractionCompensation block? Certainly offset 0x04 within block contains tag DiffractionCompensation
1467
1504
  0x0080 => { Name => 'ImageAdjustment', Writable => 'string' },
1468
1505
  0x0081 => { Name => 'ToneComp', Writable => 'string' }, #2
1469
1506
  0x0082 => { Name => 'AuxiliaryLens', Writable => 'string' },
@@ -1861,7 +1898,7 @@ my %binaryDataAttrs = (
1861
1898
  SubDirectory => {
1862
1899
  TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
1863
1900
  DecryptStart => 4,
1864
- DecryptLen => 0xc21a + 12,
1901
+ DecryptLen => 0xc292 + 720, # thru decoded parts of Offset 32
1865
1902
  ByteOrder => 'LittleEndian',
1866
1903
  },
1867
1904
  },
@@ -1876,12 +1913,23 @@ my %binaryDataAttrs = (
1876
1913
  },
1877
1914
  },
1878
1915
  { # (Z6_2 firmware version 1.00 and Z7_2 firmware versions 1.00 & 1.01, ref 28)
1879
- Condition => '$$valPt =~ /^0800/ or $$valPt =~ /^0803/',
1916
+ # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc
1917
+ Condition => '$$valPt =~ /^080[01234]/',
1880
1918
  Name => 'ShotInfoZ7_2',
1881
1919
  SubDirectory => {
1882
1920
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7_2',
1883
1921
  DecryptStart => 4,
1884
- DecryptLen => 0xce32 + 12,
1922
+ DecryptLen => 0xcea6 + 1050, # thru decoded parts of Offset31
1923
+ ByteOrder => 'LittleEndian',
1924
+ },
1925
+ },
1926
+ { # (Z9 firmware version 1.00 ref 28)
1927
+ Condition => '$$valPt =~ /^0805/',
1928
+ Name => 'ShotInfoZ9',
1929
+ SubDirectory => {
1930
+ TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
1931
+ DecryptStart => 4,
1932
+ DecryptLen => 0xeb5b + 1050, # thru decoded parts of Offset27
1885
1933
  ByteOrder => 'LittleEndian',
1886
1934
  },
1887
1935
  },
@@ -1914,18 +1962,8 @@ my %binaryDataAttrs = (
1914
1962
  0x0093 => { #21
1915
1963
  Name => 'NEFCompression',
1916
1964
  Writable => 'int16u',
1917
- PrintConv => {
1918
- 1 => 'Lossy (type 1)', # (older models)
1919
- 2 => 'Uncompressed', #JD - D100 (even though TIFF compression is set!)
1920
- 3 => 'Lossless',
1921
- 4 => 'Lossy (type 2)',
1922
- 5 => 'Striped packed 12 bits', #IB
1923
- 6 => 'Uncompressed (reduced to 12 bit)', #IB
1924
- 7 => 'Unpacked 12 bits', #IB (padded to 16)
1925
- 8 => 'Small', #IB
1926
- 9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
1927
- 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
1928
- },
1965
+ SeparateTable => 'NEFCompression',
1966
+ PrintConv => \%nefCompression,
1929
1967
  },
1930
1968
  0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
1931
1969
  0x0095 => { Name => 'NoiseReduction', Writable => 'string' }, # ("Off" or "FPNR"=long exposure NR)
@@ -2388,6 +2426,10 @@ my %binaryDataAttrs = (
2388
2426
  Flags => [ 'Binary', 'Protected' ],
2389
2427
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::PictureControl' },
2390
2428
  },
2429
+ 0x00bf => {
2430
+ Name => 'SilentPhotography',
2431
+ PrintConv => \%offOn,
2432
+ },
2391
2433
  0x00c3 => {
2392
2434
  Name => 'BarometerInfo',
2393
2435
  SubDirectory => {
@@ -6048,6 +6090,18 @@ my %nikonFocalConversions = (
6048
6090
  3 => 'Rotate 180',
6049
6091
  },
6050
6092
  },
6093
+ 0x0d0 => {
6094
+ Name => 'Interval',
6095
+ # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
6096
+ Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
6097
+ PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
6098
+ },
6099
+ 0x0d4 => {
6100
+ Name => 'IntervalFrame',
6101
+ # prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
6102
+ Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
6103
+ PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
6104
+ },
6051
6105
  0x05e2 => {
6052
6106
  Name => 'FlickerReductionIndicator',
6053
6107
  Mask => 0x01,
@@ -6466,7 +6520,7 @@ my %nikonFocalConversions = (
6466
6520
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
6467
6521
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
6468
6522
  VARS => { ID_LABEL => 'Index' },
6469
- DATAMEMBER => [ 0x9c, 0xc219 ],
6523
+ DATAMEMBER => [ 0x30, 0x60, 0x9c, 0xa4, 0x75e7, 0x760c, 0x7610, 0xc219, 0xc292, 0xc40e, 0xc412, 0xc4a6, 0xc4be ],
6470
6524
  WRITABLE => 1,
6471
6525
  FIRST_ENTRY => 0,
6472
6526
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -6476,6 +6530,11 @@ my %nikonFocalConversions = (
6476
6530
  Format => 'string[4]',
6477
6531
  Writable => 0,
6478
6532
  },
6533
+ 0x04 => {
6534
+ Name => 'FirmwareVersion',
6535
+ Format => 'string[8]',
6536
+ Writable => 0,
6537
+ },
6479
6538
  0x24 => {
6480
6539
  Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data)
6481
6540
  DataMember => 'NumberOffsets',
@@ -6483,6 +6542,22 @@ my %nikonFocalConversions = (
6483
6542
  Writable => 0,
6484
6543
  Hidden => 1,
6485
6544
  },
6545
+ 0x30 => {
6546
+ Name => 'Offset3',
6547
+ DataMember => 'Offset3',
6548
+ Format => 'int32u',
6549
+ Writable => 0,
6550
+ Hidden => 1,
6551
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
6552
+ },
6553
+ 0x60 => {
6554
+ Name => 'Offset15',
6555
+ DataMember => 'Offset15',
6556
+ Format => 'int32u',
6557
+ Writable => 0,
6558
+ Hidden => 1,
6559
+ RawConv => '$$self{Offset15} = $val || 0x10000000; undef', # (ignore if 0)
6560
+ },
6486
6561
  0x9c => {
6487
6562
  Name => 'OrientationOffset',
6488
6563
  DataMember => 'OrientationOffset',
@@ -6491,15 +6566,49 @@ my %nikonFocalConversions = (
6491
6566
  Hidden => 1,
6492
6567
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
6493
6568
  },
6494
- ### 0xc21a - OrientationInfo start (D6 firmware 1.00)
6495
- 0xc219 => {
6569
+ 0xa4 => {
6570
+ Name => 'Offset32',
6571
+ DataMember => 'Offset32',
6572
+ Format => 'int32u',
6573
+ Writable => 0,
6574
+ Hidden => 1,
6575
+ RawConv => '$$self{Offset32} = $val || 0x10000000; undef', # (ignore if 0)
6576
+ },
6577
+ ### 0x75e8 - Offset3 info start (D6 firmware 1.33)
6578
+ 0x75e7 => {
6496
6579
  Name => 'Hook1',
6497
6580
  Hidden => 1,
6498
6581
  RawConv => 'undef',
6582
+ # account for variable location of Offset5 data
6583
+ Hook => '$varSize = $$self{Offset3} - 0x75e8',
6584
+ },
6585
+ 0x760c => {
6586
+ Name => 'IntervalShooting',
6587
+ RawConv => '$$self{IntervalShooting} = $val',
6588
+ Format => 'int16u',
6589
+ PrintConv => q{
6590
+ return 'Off' if $val == 0 ;
6591
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); #something like "Interval 1 of 3"
6592
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; #something like "Frame 1 of 3" or blank
6593
+ return "On: $i$f"
6594
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
6595
+ },
6596
+ },
6597
+ 0x7610 => {
6598
+ Name => 'IntervalFrame',
6599
+ RawConv => '$$self{IntervalFrame} = $val',
6600
+ Condition => '$$self{IntervalShooting} > 0',
6601
+ Format => 'int16u',
6602
+ Hidden => 1,
6603
+ },
6604
+ ### 0xc21a - OrientationInfo start (D6 firmware 1.00) (0xc952 for firmware 1.33)
6605
+ 0xc219 => {
6606
+ Name => 'Hook2',
6607
+ Hidden => 1,
6608
+ RawConv => 'undef',
6499
6609
  # account for variable location of OrientationInfo data
6500
6610
  Hook => '$varSize = $$self{OrientationOffset} - 0xc21a',
6501
6611
  },
6502
-
6503
6612
  0xc21a => {
6504
6613
  Name => 'RollAngle',
6505
6614
  Format => 'fixed32u',
@@ -6527,7 +6636,136 @@ my %nikonFocalConversions = (
6527
6636
  PrintConv => 'sprintf("%.1f", $val)',
6528
6637
  PrintConvInv => '$val',
6529
6638
  },
6530
- # note: DecryptLen currently set to 0xc21a + 12
6639
+ ### 0xc9c6 - Offset32 start (D6 firmware 1.33)
6640
+ 0xc292 => {
6641
+ Name => 'Hook3',
6642
+ Hidden => 1,
6643
+ RawConv => 'undef',
6644
+ # account for variable location of data
6645
+ Hook => '$varSize = $$self{Offset32} - 0xc292',
6646
+ },
6647
+ 0xc40e => {
6648
+ Name => 'Intervals',
6649
+ Format => 'int32u',
6650
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
6651
+ Condition => '$$self{IntervalShooting} > 0',
6652
+ },
6653
+ 0xc412 => {
6654
+ Name => 'ShotsPerInterval',
6655
+ Format => 'int32u',
6656
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
6657
+ Condition => '$$self{IntervalShooting} > 0',
6658
+ },
6659
+ 0xc416 => {
6660
+ Name => 'IntervalExposureSmoothing',
6661
+ Condition => '$$self{IntervalShooting} > 0',
6662
+ Format => 'int8u',
6663
+ PrintConv => \%offOn,
6664
+ },
6665
+ 0xc418 => {
6666
+ Name => 'IntervalPriority',
6667
+ Condition => '$$self{IntervalShooting} > 0',
6668
+ Format => 'int8u',
6669
+ PrintConv => \%offOn,
6670
+ },
6671
+ 0xc43a => {
6672
+ Name => 'FocusShiftNumberShots',
6673
+ },
6674
+ 0xc43e => {
6675
+ Name => 'FocusShiftStepWidth',
6676
+ },
6677
+ 0xc442 => {
6678
+ Name => 'FocusShiftInterval',
6679
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
6680
+ },
6681
+ 0xc446 => {
6682
+ Name => 'FocusShiftExposureLock',
6683
+ PrintConv => \%offOn,
6684
+ },
6685
+ #0xc49c => HighISONoiseReduction
6686
+ 0xc4a0 => {
6687
+ Name => 'DiffractionCompensation',
6688
+ Format => 'int8u',
6689
+ PrintConv => \%offOn,
6690
+ },
6691
+ #0xc4a1 => {Name => 'FlickerReductionShooting',}, #redundant with tag in NikonSettings
6692
+ 0xc4a6 => {
6693
+ Name => 'FlashControlMode', #this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
6694
+ RawConv => '$$self{FlashControlMode} = $val',
6695
+ PrintConv => {
6696
+ 0 => 'TTL',
6697
+ 1 => 'Auto External Flash',
6698
+ 2 => 'GN (distance priority)',
6699
+ 3 => 'Manual',
6700
+ 4 => 'Repeating Flash',
6701
+ },
6702
+ },
6703
+ 0xc4ac => {
6704
+ Name => 'FlashGNDistance',
6705
+ Condition => '$$self{FlashControlMode} == 2',
6706
+ Unknown => 1,
6707
+ ValueConv => '$val + 3',
6708
+ PrintConv => \%flashGNDistance,
6709
+ },
6710
+ 0xc4b0 => {
6711
+ 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)
6712
+ Condition => '$$self{FlashControlMode} >= 3',
6713
+ Unknown => 1,
6714
+ ValueConv => '2 ** (-$val/3)',
6715
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
6716
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
6717
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
6718
+ },
6719
+ 0xc4ba => {
6720
+ Name => 'FlashRemoteControl',
6721
+ Unknown => 1,
6722
+ PrintConv => {
6723
+ 0 => 'Group',
6724
+ 1 => 'Quick Wireless',
6725
+ 2 => 'Remote Repeating',
6726
+ },
6727
+ },
6728
+ 0xc4be => {
6729
+ Name => 'FlashMasterControlMode', #tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
6730
+ RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
6731
+ PrintConv => \%flashGroupOptionsMode,
6732
+ },
6733
+ 0xc4c0 => {
6734
+ Name => 'FlashMasterCompensation',
6735
+ Unknown => 1,
6736
+ Format => 'int8s',
6737
+ Condition => '$$self{FlashGroupOptionsMasterMode} != 3', #other than 'Off'
6738
+ ValueConv => '$val/6',
6739
+ ValueConvInv => '6 * $val',
6740
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
6741
+ PrintConvInv => '$val',
6742
+ },
6743
+ 0xc4c4 => {
6744
+ Name => 'FlashMasterOutput',
6745
+ Unknown => 1,
6746
+ Condition => '$$self{FlashGroupOptionsMasterMode} == 1', #only for Mode=M
6747
+ ValueConv => '2 ** (-$val/3)',
6748
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
6749
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
6750
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
6751
+ },
6752
+ 0xc4c6 => {
6753
+ Name => 'FlashWirelessOption',
6754
+ Unknown => 1,
6755
+ PrintConv => {
6756
+ 0 => 'Optical AWL',
6757
+ 1 => 'Off',
6758
+ },
6759
+ },
6760
+ 0xc55c => {
6761
+ Name => 'MovieType',
6762
+ Unknown => 1,
6763
+ PrintConv => {
6764
+ 0 => 'MOV',
6765
+ 1 => 'MP4',
6766
+ },
6767
+ },
6768
+ # note: DecryptLen currently set to 0xc9c6 + 720
6531
6769
  );
6532
6770
 
6533
6771
  # shot information for the D610 firmware 1.00 (encrypted) - ref PH
@@ -7298,7 +7536,7 @@ my %nikonFocalConversions = (
7298
7536
  Format => 'undef[56]',
7299
7537
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
7300
7538
  },
7301
- # 0x1978 => { #this decode works, but involves more bits than should be necessary
7539
+ # 0x1978 => { # this decode works, but involves more bits than should be necessary
7302
7540
  # Name => 'ShutterTrigger',
7303
7541
  # Mask => 0xff,
7304
7542
  # PrintConv => {
@@ -7353,7 +7591,9 @@ my %nikonFocalConversions = (
7353
7591
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7354
7592
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7355
7593
  VARS => { ID_LABEL => 'Index' },
7356
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x98, 0xce31 ],
7594
+ DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x30, 0x38, 0x98, 0xa0, 0x75e7,
7595
+ 0x760c, 0x7610, 0x7eff, 0xce31, 0xcea5, 0xceb6, 0xceb7 ],
7596
+ IS_SUBDIR => [ 0xceb8 ],
7357
7597
  WRITABLE => 1,
7358
7598
  FIRST_ENTRY => 0,
7359
7599
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7370,7 +7610,7 @@ my %nikonFocalConversions = (
7370
7610
  Writable => 0,
7371
7611
  RawConv => '$$self{FirmwareVersion} = $val',
7372
7612
  },
7373
- 0x0E => {
7613
+ 0x0e => {
7374
7614
  Name => 'FirmwareVersion2',
7375
7615
  Format => 'string[8]',
7376
7616
  Writable => 0,
@@ -7385,12 +7625,28 @@ my %nikonFocalConversions = (
7385
7625
  Hidden => 1,
7386
7626
  },
7387
7627
  0x24 => {
7388
- Name => 'NumberOffsets', #number of entries in offset table. offsets are from start of ShotInfo data.
7628
+ Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
7389
7629
  DataMember => 'NumberOffsets',
7390
7630
  Format => 'int32u',
7391
7631
  Writable => 0,
7392
7632
  Hidden => 1,
7393
7633
  },
7634
+ 0x30 => {
7635
+ Name => 'Offset3',
7636
+ DataMember => 'Offset3',
7637
+ Format => 'int32u',
7638
+ Writable => 0,
7639
+ Hidden => 1,
7640
+ RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
7641
+ },
7642
+ 0x38 => {
7643
+ Name => 'Offset5',
7644
+ DataMember => 'Offset5',
7645
+ Format => 'int32u',
7646
+ Writable => 0,
7647
+ Hidden => 1,
7648
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
7649
+ },
7394
7650
  0x98 => {
7395
7651
  Name => 'OrientationOffset',
7396
7652
  DataMember => 'OrientationOffset',
@@ -7399,12 +7655,70 @@ my %nikonFocalConversions = (
7399
7655
  Hidden => 1,
7400
7656
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7401
7657
  },
7402
-
7403
- ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7404
- 0xce31 => {
7658
+ 0xa0 => {
7659
+ Name => 'Offset31',
7660
+ DataMember => 'Offset31',
7661
+ Format => 'int32u',
7662
+ Writable => 0,
7663
+ Hidden => 1,
7664
+ RawConv => '$$self{Offset31} = $val || 0x10000000; undef', # (ignore if 0)
7665
+ },
7666
+ ### 0x75e8 - Offset3 info start (Z7_2 firmware 1.30)
7667
+ 0x75e7 => {
7405
7668
  Name => 'Hook1',
7406
7669
  Hidden => 1,
7407
7670
  RawConv => 'undef',
7671
+ # account for variable location of Offset5 data
7672
+ Hook => '$varSize = $$self{Offset3} - 0x75e8',
7673
+ },
7674
+ 0x760c => {
7675
+ Name => 'IntervalShooting',
7676
+ RawConv => '$$self{IntervalShooting} = $val',
7677
+ Format => 'int16u',
7678
+ PrintConv => q{
7679
+ return 'Off' if $val == 0 ;
7680
+ my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
7681
+ my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
7682
+ return "On: $i$f"
7683
+ #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
7684
+ },
7685
+ },
7686
+ 0x7610 => {
7687
+ Name => 'IntervalFrame',
7688
+ RawConv => '$$self{IntervalFrame} = $val',
7689
+ Condition => '$$self{IntervalShooting} > 0',
7690
+ Format => 'int16u',
7691
+ Hidden => 1,
7692
+ },
7693
+ ### 0x7f00 - Offset5 info start (Z7_2 firmware 1.30)
7694
+ 0x7eff => {
7695
+ Name => 'Hook2',
7696
+ Hidden => 1,
7697
+ RawConv => 'undef',
7698
+ # account for variable location of Offset5 data
7699
+ Hook => '$varSize = $$self{Offset5} - 0x7f00',
7700
+ },
7701
+ 0x7fa0 => { #28
7702
+ 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
7703
+ # offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera
7704
+ # offset5+161 128 is neutral; >128 increases Brightness; <128 decreases Brightness
7705
+ # 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]
7706
+ Format => 'int8u[2]',
7707
+ Condition => '$$self{FirmwareVersion} ge "01.30"',
7708
+ PrintConv => q{
7709
+ return 'Off' if $val eq '0 0' or $val eq '255 255';
7710
+ my @v = split ' ', $val;
7711
+ my $brightness = $v[1]==128 ? 'Brightness: Neutral' : sprintf('Brightness: %+.1f',($v[1]-128)/4);
7712
+ my $color = $v[0]==128 ? 'Color: Neutral' : sprintf('%s: %.1f', $v[0]>128 ? 'Yellow' : 'Magenta', abs($v[0]-128)/4);
7713
+ # will return something like: 'Magenta: 1.0 Brightness: Neutral'
7714
+ return "$color $brightness"
7715
+ },
7716
+ },
7717
+ ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7718
+ 0xce31 => {
7719
+ Name => 'Hook3',
7720
+ Hidden => 1,
7721
+ RawConv => 'undef',
7408
7722
  # account for variable location of OrientationInfo data
7409
7723
  Hook => '$varSize = $$self{OrientationOffset} - 0xce32',
7410
7724
  },
@@ -7436,84 +7750,858 @@ my %nikonFocalConversions = (
7436
7750
  PrintConv => 'sprintf("%.1f", $val)',
7437
7751
  PrintConvInv => '$val',
7438
7752
  },
7439
- #note: DecryptLen currently set to 0xce32 + 12
7753
+ 0xcea5 => {
7754
+ Name => 'Hook4',
7755
+ Hidden => 1,
7756
+ RawConv => 'undef',
7757
+ # account for variable location of Offset31 data
7758
+ Hook => '$varSize = $$self{Offset31} - 0xcea6',
7759
+ },
7760
+ ### 0xcea6 - Offset31 info start (Z7_2 firmware 1.30)
7761
+ 0xceb6 => {
7762
+ Name => 'ZMenuSettingsOffset',
7763
+ # offset to ZMenuSettings is relative to start of Offset31 block
7764
+ RawConv => '$$self{ZMenuSettingsOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
7765
+ },
7766
+ 0xceb7 => {
7767
+ Name => 'Hook5',
7768
+ Hidden => 1,
7769
+ RawConv => 'undef',
7770
+ # account for variable location of Offset5 data
7771
+ Hook => '$varSize = $$self{ZMenuSettingsOffset} - 0xceb8',
7772
+ },
7773
+ 0xceb8 => {
7774
+ Name => 'ZMenuSettings',
7775
+ SubDirectory => {
7776
+ TagTable => 'Image::ExifTool::Nikon::ZMenuSettings',
7777
+ },
7778
+ }
7779
+ # note: DecryptLen currently set to 0xcea6 + 1050
7440
7780
  );
7441
7781
 
7442
- # Flash information (ref JD)
7443
- %Image::ExifTool::Nikon::FlashInfo0100 = (
7444
- %binaryDataAttrs,
7445
- DATAMEMBER => [ 9.2, 15, 16 ],
7782
+ # shot information for the Z9 firmware 1.00 (encrypted) - ref 28
7783
+ %Image::ExifTool::Nikon::ShotInfoZ9 = (
7784
+ PROCESS_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7785
+ WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7786
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7787
+ VARS => { ID_LABEL => 'Index' },
7788
+ DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x84, 0xeaea],
7789
+ WRITABLE => 1,
7790
+ FIRST_ENTRY => 0,
7446
7791
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7447
- NOTES => q{
7448
- These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
7449
- D200.
7450
- },
7451
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
7452
- 0 => {
7453
- Name => 'FlashInfoVersion',
7792
+ NOTES => 'These tags are extracted from encrypted data in images from the Z9.',
7793
+ 0x00 => {
7794
+ Name => 'ShotInfoVersion',
7454
7795
  Format => 'string[4]',
7455
7796
  Writable => 0,
7456
7797
  },
7457
- 4 => { #PH
7458
- Name => 'FlashSource',
7459
- PrintConv => {
7460
- 0 => 'None',
7461
- 1 => 'External',
7462
- 2 => 'Internal',
7463
- },
7798
+ 0x04 => {
7799
+ Name => 'FirmwareVersion',
7800
+ DataMember => 'FirmwareVersion',
7801
+ Format => 'string[8]',
7802
+ Writable => 0,
7803
+ RawConv => '$$self{FirmwareVersion} = $val',
7464
7804
  },
7465
- # 5 - values: 46,48,50,54,78
7466
- 6 => {
7467
- Format => 'int8u[2]',
7468
- Name => 'ExternalFlashFirmware',
7469
- SeparateTable => 'FlashFirmware',
7470
- PrintConv => \%flashFirmware,
7805
+ 0x0e => {
7806
+ Name => 'FirmwareVersion2',
7807
+ Format => 'string[8]',
7808
+ Writable => 0,
7809
+ RawConv => '$$self{FirmwareVersion2} = $val',
7810
+ Hidden => 1,
7471
7811
  },
7472
- 8 => {
7473
- Name => 'ExternalFlashFlags',
7474
- PrintConv => { 0 => '(none)',
7475
- BITMASK => {
7476
- 0 => 'Fired', #28
7477
- 2 => 'Bounce Flash', #PH
7478
- 4 => 'Wide Flash Adapter',
7479
- 5 => 'Dome Diffuser', #28
7480
- },
7481
- },
7812
+ 0x18 => {
7813
+ Name => 'FirmwareVersion3',
7814
+ Format => 'string[8]',
7815
+ Writable => 0,
7816
+ RawConv => '$$self{FirmwareVersion3} = $val',
7817
+ Hidden => 1,
7482
7818
  },
7483
- 9.1 => {
7484
- Name => 'FlashCommanderMode',
7485
- Mask => 0x80,
7486
- PrintConv => { 0 => 'Off', 1 => 'On' },
7819
+ 0x24 => {
7820
+ Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
7821
+ DataMember => 'NumberOffsets',
7822
+ Format => 'int32u',
7823
+ Writable => 0,
7824
+ Hidden => 1,
7487
7825
  },
7488
- 9.2 => {
7489
- Name => 'FlashControlMode',
7490
- Mask => 0x7f,
7491
- DataMember => 'FlashControlMode',
7492
- RawConv => '$$self{FlashControlMode} = $val',
7493
- PrintConv => \%flashControlMode,
7494
- SeparateTable => 'FlashControlMode',
7826
+ 0x84 => {
7827
+ Name => 'OrientationOffset', #offset24 - length 108
7828
+ DataMember => 'OrientationOffset',
7829
+ Format => 'int32u',
7830
+ Writable => 0,
7831
+ Hidden => 1,
7832
+ RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7495
7833
  },
7496
- 10 => [
7497
- {
7498
- Name => 'FlashOutput',
7499
- Condition => '$$self{FlashControlMode} >= 0x06',
7500
- ValueConv => '2 ** (-$val/6)',
7501
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
7502
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
7503
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
7504
- },
7505
- {
7506
- Name => 'FlashCompensation',
7507
- Format => 'int8s',
7508
- Priority => 0,
7509
- ValueConv => '-$val/6',
7510
- ValueConvInv => '-6 * $val',
7511
- PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
7512
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
7513
- },
7514
- ],
7515
- 11 => {
7516
- Name => 'FlashFocalLength',
7834
+ ### 0xce32 - OrientationInfo start (Z9 firmware 1.00)
7835
+ 0xeaea => {
7836
+ Name => 'Hook1',
7837
+ Hidden => 1,
7838
+ RawConv => 'undef',
7839
+ # account for variable location of OrientationInfo data
7840
+ Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb',
7841
+ },
7842
+
7843
+ 0xeaeb => {
7844
+ Name => 'RollAngle',
7845
+ Format => 'fixed32u',
7846
+ Notes => 'converted to degrees of clockwise camera roll',
7847
+ ValueConv => '$val <= 180 ? $val : $val - 360',
7848
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
7849
+ PrintConv => 'sprintf("%.1f", $val)',
7850
+ PrintConvInv => '$val',
7851
+ },
7852
+ 0xeaef => {
7853
+ Name => 'PitchAngle',
7854
+ Format => 'fixed32u',
7855
+ Notes => 'converted to degrees of upward camera tilt',
7856
+ ValueConv => '$val <= 180 ? $val : $val - 360',
7857
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
7858
+ PrintConv => 'sprintf("%.1f", $val)',
7859
+ PrintConvInv => '$val',
7860
+ },
7861
+ 0xeaf3 => {
7862
+ Name => 'YawAngle',
7863
+ Format => 'fixed32u',
7864
+ Notes => 'the camera yaw angle when shooting in portrait orientation',
7865
+ ValueConv => '$val <= 180 ? $val : $val - 360',
7866
+ ValueConvInv => '$val >= 0 ? $val : $val + 360',
7867
+ PrintConv => 'sprintf("%.1f", $val)',
7868
+ PrintConvInv => '$val',
7869
+ },
7870
+ # note: DecryptLen currently set to 0xeb5b + 1050
7871
+ );
7872
+
7873
+ %Image::ExifTool::Nikon::ZMenuSettings = (
7874
+ %binaryDataAttrs,
7875
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7876
+ NOTES => q{
7877
+ These tags are used by the Z5 Z6 Z7 Z6II Z7II Z50 Zfc
7878
+ },
7879
+ DATAMEMBER => [ 0xb0, 0xb4, 0x148, 0x160, 0x35a ],
7880
+ 160 => {
7881
+ Name => 'IntervalDurationHours',
7882
+ Format => 'int32u',
7883
+ Condition => '$$self{IntervalShooting} > 0',
7884
+ },
7885
+ 164 => {
7886
+ Name => 'IntervalDurationMinutes',
7887
+ Format => 'int32u',
7888
+ Condition => '$$self{IntervalShooting} > 0',
7889
+ },
7890
+ 168 => {
7891
+ Name => 'IntervalDurationSeconds',
7892
+ Format => 'int32u',
7893
+ Condition => '$$self{IntervalShooting} > 0',
7894
+ },
7895
+ 176 => {
7896
+ Name => 'Intervals',
7897
+ Format => 'int32u',
7898
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
7899
+ Condition => '$$self{IntervalShooting} > 0',
7900
+ },
7901
+ 180 => {
7902
+ Name => 'ShotsPerInterval',
7903
+ Format => 'int32u',
7904
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
7905
+ Condition => '$$self{IntervalShooting} > 0',
7906
+ },
7907
+ 184 => {
7908
+ Name => 'IntervalExposureSmoothing',
7909
+ Condition => '$$self{IntervalShooting} > 0',
7910
+ Format => 'int8u',
7911
+ PrintConv => \%offOn,
7912
+ },
7913
+ 186 => {
7914
+ Name => 'IntervalPriority',
7915
+ Condition => '$$self{IntervalShooting} > 0',
7916
+ Format => 'int8u',
7917
+ PrintConv => \%offOn,
7918
+ },
7919
+ 220 => {
7920
+ Name => 'FocusShiftNumberShots',
7921
+ },
7922
+ 224 => {
7923
+ Name => 'FocusShiftStepWidth',
7924
+ },
7925
+ 228 => {
7926
+ Name => 'FocusShiftInterval',
7927
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
7928
+ },
7929
+ 232 => {
7930
+ Name => 'FocusShiftExposureLock',
7931
+ PrintConv => \%offOn,
7932
+ },
7933
+ #304 => White Balance - Kelvin Temp
7934
+ #312 => ColorSpace
7935
+ #314 => ActiveD-Lighting
7936
+ #318 => HighISONoiseReduction
7937
+ 322 => {
7938
+ Name => 'DiffractionCompensation',
7939
+ Format => 'int8u',
7940
+ PrintConv => \%offOn,
7941
+ },
7942
+ 323 => {
7943
+ Name => 'AutoDistortionControl',
7944
+ Format => 'int8u',
7945
+ PrintConv => \%offOn,
7946
+ },
7947
+ #324 => {Name => 'FlickerReductionShooting',}, # redundant with tag in NikonSettings
7948
+ 326 => {
7949
+ Name => 'NikonMeteringMode',
7950
+ Unknown => 1,
7951
+ PrintConv => {
7952
+ 0 => 'Matrix',
7953
+ 1 => 'Center',
7954
+ 2 => 'Spot',
7955
+ 3 => 'Highlight'
7956
+ },
7957
+ },
7958
+ 328 => {
7959
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
7960
+ RawConv => '$$self{FlashControlMode} = $val',
7961
+ PrintConv => {
7962
+ 0 => 'TTL',
7963
+ 1 => 'Auto External Flash',
7964
+ 2 => 'GN (distance priority)',
7965
+ 3 => 'Manual',
7966
+ 4 => 'Repeating Flash',
7967
+ },
7968
+ },
7969
+ 334 => {
7970
+ Name => 'FlashGNDistance',
7971
+ Condition => '$$self{FlashControlMode} == 2',
7972
+ Unknown => 1,
7973
+ ValueConv => '$val + 3',
7974
+ PrintConv => \%flashGNDistance,
7975
+ },
7976
+ 338 => {
7977
+ 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)
7978
+ Condition => '$$self{FlashControlMode} >= 3',
7979
+ Unknown => 1,
7980
+ ValueConv => '2 ** (-$val/3)',
7981
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
7982
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
7983
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
7984
+ },
7985
+ 346 => {
7986
+ Name => 'FlashWirelessOption', # also found in FlashInfoUnknown at offset 0x23 (with different mappings)
7987
+ Unknown => 1,
7988
+ PrintConv => {
7989
+ 0 => 'Off',
7990
+ 1 => 'Optical AWL',
7991
+ 2 => 'Optical/Radio AWL',
7992
+ 3 => 'Radio AWL'
7993
+ },
7994
+ },
7995
+ 348 => {
7996
+ Name => 'FlashRemoteControl', # also found in FlashInfoUnknown at offset 0x1e (with different mappings)
7997
+ Unknown => 1,
7998
+ PrintConv => {
7999
+ 0 => 'Group',
8000
+ 1 => 'Quick Wireless',
8001
+ 2 => 'Remote Repeating',
8002
+ },
8003
+ },
8004
+ 352 => {
8005
+ Name => 'FlashMasterControlMode', # tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
8006
+ RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
8007
+ PrintConv => \%flashGroupOptionsMode,
8008
+ },
8009
+ 354 => {
8010
+ Name => 'FlashMasterCompensation',
8011
+ Format => 'int8s',
8012
+ Condition => '$$self{FlashGroupOptionsMasterMode} != 3', # other than 'Off'
8013
+ Unknown => 1,
8014
+ ValueConv => '$val/6',
8015
+ ValueConvInv => '6 * $val',
8016
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8017
+ PrintConvInv => '$val',
8018
+ },
8019
+ 358 => {
8020
+ Name => 'FlashMasterOutput',
8021
+ Unknown => 1,
8022
+ Condition => '$$self{FlashGroupOptionsMasterMode} == 1', # only for Mode=M
8023
+ ValueConv => '2 ** (-$val/3)',
8024
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
8025
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
8026
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8027
+ },
8028
+ #360 => {Name => 'FlashGroupAControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupACompensation at 362 and FlashGroupAOutput at 368
8029
+ #368 => {Name => 'FlashGroupBControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupBCompensation at 370 and FlashGroupBOutput at 374
8030
+ #376 => {Name => 'FlashGroupCControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupCCompensation at 378 and FlashGroupCOutput at 382
8031
+ #384 => {Name => 'FlashGroupDControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupDCompensation at 386 and FlashGroupDOutput at 390
8032
+ #392 => {Name => 'FlashGroupEControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupECompensation at 394 and FlashGroupEOutput at 398
8033
+ #400 => {Name => 'FlashGroupFControlMode', }, # commented out to reduce output volume - mapping follows FlashMasterControlMode with FlashGroupFCompensation at 402 and FlashGroupFOutput at 406
8034
+ #434 => FocusMode
8035
+ #436 => AFAreaMode
8036
+ #438 => VibrationReduction
8037
+ #442 => BracketSet
8038
+ #444 => BracketProgram
8039
+ #446 => BracketIncrement
8040
+ #463 => SilentPhotography
8041
+ 502 => {
8042
+ Name => 'MovieFrameSize', # may want to rename or suppress the movie menu settings - potentially confusing for still photographers
8043
+ Unknown => 1,
8044
+ PrintConv => {
8045
+ 1 => '1920x1080',
8046
+ 2 => '3840x2160',
8047
+ },
8048
+ },
8049
+ 504 => {
8050
+ Name => 'MovieFrameRate',
8051
+ Unknown => 1,
8052
+ PrintConv => {
8053
+ 0 => '120p',
8054
+ 1 => '100p',
8055
+ 2 => '60p',
8056
+ 3 => '50p',
8057
+ 4 => '30p',
8058
+ 5 => '25p',
8059
+ 6 => '24p',
8060
+ },
8061
+ },
8062
+ 506 => {
8063
+ Name => 'MovieSlowMotion',
8064
+ Unknown => 1,
8065
+ PrintConv => {
8066
+ 0 => 'Off',
8067
+ 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]
8068
+ 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5]
8069
+ },
8070
+ },
8071
+ 510 => {
8072
+ Name => 'MovieType',
8073
+ Unknown => 1,
8074
+ PrintConv => {
8075
+ 0 => 'MOV',
8076
+ 1 => 'MP4',
8077
+ },
8078
+ },
8079
+ #512 => MovieISOAutoHiLimit
8080
+ 516 => {
8081
+ Name => 'MovieISOAutoManualMode',
8082
+ Condition => '$$self{Model} =~ /^NIKON 7/', #ISO ranges vary by model. These mappings are for the Z7 and Z7II
8083
+ Format => 'int16u',
8084
+ Unknown => 1,
8085
+ ValueConv => '($val-104)/8',
8086
+ PrintConv => {
8087
+ 0 => 'ISO 64',
8088
+ 1 => 'ISO 80',
8089
+ 2 => 'ISO 100',
8090
+ 3 => 'ISO 125',
8091
+ 4 => 'ISO 160',
8092
+ 5 => 'ISO 200',
8093
+ 6 => 'ISO 250',
8094
+ 7 => 'ISO 320',
8095
+ 8 => 'ISO 400',
8096
+ 9 => 'ISO 500',
8097
+ 10 => 'ISO 640',
8098
+ 11 => 'ISO 800',
8099
+ 12 => 'ISO 1000',
8100
+ 13 => 'ISO 1250',
8101
+ 14 => 'ISO 1600',
8102
+ 15 => 'ISO 2000',
8103
+ 16 => 'ISO 2500',
8104
+ 17 => 'ISO 3200',
8105
+ 18 => 'ISO 4000',
8106
+ 19 => 'ISO 5000',
8107
+ 20 => 'ISO 6400',
8108
+ 21 => 'ISO 8000',
8109
+ 22 => 'ISO 10000',
8110
+ 23 => 'ISO 12800',
8111
+ 24 => 'ISO 16000',
8112
+ 25 => 'ISO 20000',
8113
+ 26 => 'ISO 25600',
8114
+ 27 => 'ISO Hi 0.3',
8115
+ 28 => 'ISO Hi 0.7',
8116
+ 29 => 'ISO Hi 1.0',
8117
+ 32 => 'ISO Hi 2.0',
8118
+ },
8119
+ },
8120
+ #520 => MovieWhiteBalanceSameAsPhoto
8121
+ 568 => {
8122
+ Name => 'MovieActiveD-Lighting',
8123
+ Unknown => 1,
8124
+ PrintConv => {
8125
+ 0 => 'Off',
8126
+ 2 => 'Low',
8127
+ 3 => 'Normal',
8128
+ 4 => 'High',
8129
+ 5 => 'Extra High',
8130
+ },
8131
+ },
8132
+ 572 => {
8133
+ Name => 'MovieHighISONoiseReduction',
8134
+ Unknown => 1,
8135
+ PrintConv => {
8136
+ 0 => 'Off',
8137
+ 1 => 'Low',
8138
+ 2 => 'Normal',
8139
+ 3 => 'High',
8140
+ },
8141
+ },
8142
+ 574=> {
8143
+ Name => 'MovieVignetteControl',
8144
+ Unknown => 1,
8145
+ PrintConv => {
8146
+ 0 => 'Off',
8147
+ 1 => 'Low',
8148
+ 2 => 'Normal',
8149
+ 3 => 'High',
8150
+ },
8151
+ },
8152
+ 576 => {
8153
+ Name => 'MovieVignetteControlSameAsPhoto',
8154
+ Unknown => 1,
8155
+ PrintConv => \%noYes
8156
+ },
8157
+ 577 => {
8158
+ Name => 'MovieDiffractionCompensation',
8159
+ Unknown => 1,
8160
+ PrintConv => \%offOn
8161
+ },
8162
+ 578 => {
8163
+ Name => 'MovieAutoDistortionControl',
8164
+ Unknown => 1,
8165
+ PrintConv => \%offOn
8166
+ },
8167
+ 584 => {
8168
+ Name => 'MovieFocusMode',
8169
+ Unknown => 1,
8170
+ PrintConv => {
8171
+ 0 => 'Manual',
8172
+ 1 => 'AF-S',
8173
+ 2 => 'AF-C',
8174
+ 4 => 'AF-F', # full frame
8175
+ },
8176
+ },
8177
+ #586 => MovieAFAreaMode
8178
+ 590 => {
8179
+ Name => 'MovieVibrationReduction',
8180
+ Unknown => 1,
8181
+ PrintConv => {
8182
+ 0 => 'Off',
8183
+ 1 => 'On (Normal)',
8184
+ 2 => 'On (Sport)',
8185
+ },
8186
+ },
8187
+ 591 => {
8188
+ Name => 'MovieVibrationReductionSameAsPhoto',
8189
+ Unknown => 1,
8190
+ PrintConv => \%noYes
8191
+ },
8192
+ #848 => HDMIOutputResolution
8193
+ #850 => HDMIOutputRange
8194
+ #854 => HDMIExternalRecorder
8195
+ #856 => HDMIBitDepth
8196
+ 858 => {
8197
+ 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
8198
+ Condition => '$$self{HDMIBitDepth} and $$self{HDMIBitDepth} == 2', # only for 10 bit
8199
+ RawConv => '$$self{HDMIOutputNLog} = $val',
8200
+ Unknown => 1,
8201
+ PrintConv => \%offOn,
8202
+ },
8203
+ #859 => HDMIViewAssist
8204
+ );
8205
+ # Flash information (ref JD)
8206
+ %Image::ExifTool::Nikon::FlashInfo0100 = (
8207
+ %binaryDataAttrs,
8208
+ DATAMEMBER => [ 9.2, 15, 16 ],
8209
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8210
+ NOTES => q{
8211
+ These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
8212
+ D200.
8213
+ },
8214
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
8215
+ 0 => {
8216
+ Name => 'FlashInfoVersion',
8217
+ Format => 'string[4]',
8218
+ Writable => 0,
8219
+ },
8220
+ 4 => { #PH
8221
+ Name => 'FlashSource',
8222
+ PrintConv => {
8223
+ 0 => 'None',
8224
+ 1 => 'External',
8225
+ 2 => 'Internal',
8226
+ },
8227
+ },
8228
+ # 5 - values: 46,48,50,54,78
8229
+ 6 => {
8230
+ Format => 'int8u[2]',
8231
+ Name => 'ExternalFlashFirmware',
8232
+ SeparateTable => 'FlashFirmware',
8233
+ PrintConv => \%flashFirmware,
8234
+ },
8235
+ 8 => {
8236
+ Name => 'ExternalFlashFlags',
8237
+ PrintConv => { 0 => '(none)',
8238
+ BITMASK => {
8239
+ 0 => 'Fired', #28
8240
+ 2 => 'Bounce Flash', #PH
8241
+ 4 => 'Wide Flash Adapter',
8242
+ 5 => 'Dome Diffuser', #28
8243
+ },
8244
+ },
8245
+ },
8246
+ 9.1 => {
8247
+ Name => 'FlashCommanderMode',
8248
+ Mask => 0x80,
8249
+ PrintConv => { 0 => 'Off', 1 => 'On' },
8250
+ },
8251
+ 9.2 => {
8252
+ Name => 'FlashControlMode',
8253
+ Mask => 0x7f,
8254
+ DataMember => 'FlashControlMode',
8255
+ RawConv => '$$self{FlashControlMode} = $val',
8256
+ PrintConv => \%flashControlMode,
8257
+ SeparateTable => 'FlashControlMode',
8258
+ },
8259
+ 10 => [
8260
+ {
8261
+ Name => 'FlashOutput',
8262
+ Condition => '$$self{FlashControlMode} >= 0x06',
8263
+ ValueConv => '2 ** (-$val/6)',
8264
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8265
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8266
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8267
+ },
8268
+ {
8269
+ Name => 'FlashCompensation',
8270
+ Format => 'int8s',
8271
+ Priority => 0,
8272
+ ValueConv => '-$val/6',
8273
+ ValueConvInv => '-6 * $val',
8274
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
8275
+ PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
8276
+ },
8277
+ ],
8278
+ 11 => {
8279
+ Name => 'FlashFocalLength',
8280
+ RawConv => '$val ? $val : undef',
8281
+ PrintConv => '"$val mm"',
8282
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8283
+ },
8284
+ 12 => {
8285
+ Name => 'RepeatingFlashRate',
8286
+ RawConv => '$val ? $val : undef',
8287
+ PrintConv => '"$val Hz"',
8288
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8289
+ },
8290
+ 13 => {
8291
+ Name => 'RepeatingFlashCount',
8292
+ RawConv => '$val ? $val : undef',
8293
+ },
8294
+ 14 => { #PH
8295
+ Name => 'FlashGNDistance',
8296
+ SeparateTable => 1,
8297
+ PrintConv => \%flashGNDistance,
8298
+ },
8299
+ 15 => {
8300
+ Name => 'FlashGroupAControlMode',
8301
+ Mask => 0x0f,
8302
+ DataMember => 'FlashGroupAControlMode',
8303
+ RawConv => '$$self{FlashGroupAControlMode} = $val',
8304
+ PrintConv => \%flashControlMode,
8305
+ SeparateTable => 'FlashControlMode',
8306
+ },
8307
+ 16 => {
8308
+ Name => 'FlashGroupBControlMode',
8309
+ Mask => 0x0f,
8310
+ DataMember => 'FlashGroupBControlMode',
8311
+ RawConv => '$$self{FlashGroupBControlMode} = $val',
8312
+ PrintConv => \%flashControlMode,
8313
+ SeparateTable => 'FlashControlMode',
8314
+ },
8315
+ 17 => [
8316
+ {
8317
+ Name => 'FlashGroupAOutput',
8318
+ Condition => '$$self{FlashGroupAControlMode} >= 0x06',
8319
+ ValueConv => '2 ** (-$val/6)',
8320
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8321
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8322
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8323
+ },
8324
+ {
8325
+ Name => 'FlashGroupACompensation',
8326
+ Format => 'int8s',
8327
+ ValueConv => '-$val/6',
8328
+ ValueConvInv => '-6 * $val',
8329
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8330
+ PrintConvInv => '$val',
8331
+ },
8332
+ ],
8333
+ 18 => [
8334
+ {
8335
+ Name => 'FlashGroupBOutput',
8336
+ Condition => '$$self{FlashGroupBControlMode} >= 0x06',
8337
+ ValueConv => '2 ** (-$val/6)',
8338
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8339
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8340
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8341
+ },
8342
+ {
8343
+ Name => 'FlashGroupBCompensation',
8344
+ Format => 'int8s',
8345
+ ValueConv => '-$val/6',
8346
+ ValueConvInv => '-6 * $val',
8347
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8348
+ PrintConvInv => '$val',
8349
+ },
8350
+ ],
8351
+ );
8352
+
8353
+ # Flash information for D40, D40x, D3 and D300 (ref JD)
8354
+ %Image::ExifTool::Nikon::FlashInfo0102 = (
8355
+ %binaryDataAttrs,
8356
+ DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ],
8357
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8358
+ NOTES => q{
8359
+ These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
8360
+ (firmware 1.00).
8361
+ },
8362
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
8363
+ 0 => {
8364
+ Name => 'FlashInfoVersion',
8365
+ Format => 'string[4]',
8366
+ Writable => 0,
8367
+ },
8368
+ 4 => { #PH
8369
+ Name => 'FlashSource',
8370
+ PrintConv => {
8371
+ 0 => 'None',
8372
+ 1 => 'External',
8373
+ 2 => 'Internal',
8374
+ },
8375
+ },
8376
+ # 5 - values: 46,48,50,54,78
8377
+ 6 => {
8378
+ Format => 'int8u[2]',
8379
+ Name => 'ExternalFlashFirmware',
8380
+ SeparateTable => 'FlashFirmware',
8381
+ PrintConv => \%flashFirmware,
8382
+ },
8383
+ 8 => {
8384
+ Name => 'ExternalFlashFlags',
8385
+ PrintConv => { BITMASK => {
8386
+ 0 => 'Fired', #28
8387
+ 2 => 'Bounce Flash', #PH
8388
+ 4 => 'Wide Flash Adapter',
8389
+ 5 => 'Dome Diffuser', #28
8390
+ }},
8391
+ },
8392
+ 9.1 => {
8393
+ Name => 'FlashCommanderMode',
8394
+ Mask => 0x80,
8395
+ PrintConv => { 0 => 'Off', 1 => 'On' },
8396
+ },
8397
+ 9.2 => {
8398
+ Name => 'FlashControlMode',
8399
+ Mask => 0x7f,
8400
+ DataMember => 'FlashControlMode',
8401
+ RawConv => '$$self{FlashControlMode} = $val',
8402
+ PrintConv => \%flashControlMode,
8403
+ SeparateTable => 'FlashControlMode',
8404
+ },
8405
+ 10 => [
8406
+ {
8407
+ Name => 'FlashOutput',
8408
+ Condition => '$$self{FlashControlMode} >= 0x06',
8409
+ ValueConv => '2 ** (-$val/6)',
8410
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8411
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8412
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8413
+ },
8414
+ {
8415
+ Name => 'FlashCompensation',
8416
+ # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
8417
+ # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
8418
+ Format => 'int8s',
8419
+ Priority => 0,
8420
+ ValueConv => '-$val/6',
8421
+ ValueConvInv => '-6 * $val',
8422
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
8423
+ PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
8424
+ },
8425
+ ],
8426
+ 12 => {
8427
+ Name => 'FlashFocalLength',
8428
+ RawConv => '$val ? $val : undef',
8429
+ PrintConv => '"$val mm"',
8430
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8431
+ },
8432
+ 13 => {
8433
+ Name => 'RepeatingFlashRate',
8434
+ RawConv => '$val ? $val : undef',
8435
+ PrintConv => '"$val Hz"',
8436
+ PrintConvInv => '$val=~/(\d+)/; $1 || 0',
8437
+ },
8438
+ 14 => {
8439
+ Name => 'RepeatingFlashCount',
8440
+ RawConv => '$val ? $val : undef',
8441
+ },
8442
+ 15 => { #PH
8443
+ Name => 'FlashGNDistance',
8444
+ SeparateTable => 1,
8445
+ PrintConv => \%flashGNDistance,
8446
+ },
8447
+ 16.1 => {
8448
+ Name => 'FlashGroupAControlMode',
8449
+ Mask => 0x0f,
8450
+ Notes => 'note: group A tags may apply to the built-in flash settings for some models',
8451
+ DataMember => 'FlashGroupAControlMode',
8452
+ RawConv => '$$self{FlashGroupAControlMode} = $val',
8453
+ PrintConv => \%flashControlMode,
8454
+ SeparateTable => 'FlashControlMode',
8455
+ },
8456
+ 17.1 => {
8457
+ Name => 'FlashGroupBControlMode',
8458
+ Mask => 0xf0,
8459
+ Notes => 'note: group B tags may apply to group A settings for some models',
8460
+ DataMember => 'FlashGroupBControlMode',
8461
+ RawConv => '$$self{FlashGroupBControlMode} = $val',
8462
+ PrintConv => \%flashControlMode,
8463
+ SeparateTable => 'FlashControlMode',
8464
+ },
8465
+ 17.2 => { #PH
8466
+ Name => 'FlashGroupCControlMode',
8467
+ Mask => 0x0f,
8468
+ Notes => 'note: group C tags may apply to group B settings for some models',
8469
+ DataMember => 'FlashGroupCControlMode',
8470
+ RawConv => '$$self{FlashGroupCControlMode} = $val',
8471
+ PrintConv => \%flashControlMode,
8472
+ SeparateTable => 'FlashControlMode',
8473
+ },
8474
+ 18 => [
8475
+ {
8476
+ Name => 'FlashGroupAOutput',
8477
+ Condition => '$$self{FlashGroupAControlMode} >= 0x06',
8478
+ ValueConv => '2 ** (-$val/6)',
8479
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8480
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8481
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8482
+ },
8483
+ {
8484
+ Name => 'FlashGroupACompensation',
8485
+ Format => 'int8s',
8486
+ ValueConv => '-$val/6',
8487
+ ValueConvInv => '-6 * $val',
8488
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8489
+ PrintConvInv => '$val',
8490
+ },
8491
+ ],
8492
+ 19 => [
8493
+ {
8494
+ Name => 'FlashGroupBOutput',
8495
+ Condition => '$$self{FlashGroupBControlMode} >= 0x60',
8496
+ ValueConv => '2 ** (-$val/6)',
8497
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8498
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8499
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8500
+ },
8501
+ {
8502
+ Name => 'FlashGroupBCompensation',
8503
+ Format => 'int8s',
8504
+ ValueConv => '-$val/6',
8505
+ ValueConvInv => '-6 * $val',
8506
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8507
+ PrintConvInv => '$val',
8508
+ },
8509
+ ],
8510
+ 20 => [ #PH
8511
+ {
8512
+ Name => 'FlashGroupCOutput',
8513
+ Condition => '$$self{FlashGroupCControlMode} >= 0x06',
8514
+ ValueConv => '2 ** (-$val/6)',
8515
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8516
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8517
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8518
+ },
8519
+ {
8520
+ Name => 'FlashGroupCCompensation',
8521
+ Format => 'int8s',
8522
+ ValueConv => '-$val/6',
8523
+ ValueConvInv => '-6 * $val',
8524
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
8525
+ PrintConvInv => '$val',
8526
+ },
8527
+ ],
8528
+ );
8529
+
8530
+ # Flash information (ref JD)
8531
+ %Image::ExifTool::Nikon::FlashInfo0100 = (
8532
+ %binaryDataAttrs,
8533
+ DATAMEMBER => [ 9.2, 15, 16 ],
8534
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8535
+ NOTES => q{
8536
+ These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
8537
+ D200.
8538
+ },
8539
+ # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
8540
+ 0 => {
8541
+ Name => 'FlashInfoVersion',
8542
+ Format => 'string[4]',
8543
+ Writable => 0,
8544
+ },
8545
+ 4 => { #PH
8546
+ Name => 'FlashSource',
8547
+ PrintConv => {
8548
+ 0 => 'None',
8549
+ 1 => 'External',
8550
+ 2 => 'Internal',
8551
+ },
8552
+ },
8553
+ # 5 - values: 46,48,50,54,78
8554
+ 6 => {
8555
+ Format => 'int8u[2]',
8556
+ Name => 'ExternalFlashFirmware',
8557
+ SeparateTable => 'FlashFirmware',
8558
+ PrintConv => \%flashFirmware,
8559
+ },
8560
+ 8 => {
8561
+ Name => 'ExternalFlashFlags',
8562
+ PrintConv => { 0 => '(none)',
8563
+ BITMASK => {
8564
+ 0 => 'Fired', #28
8565
+ 2 => 'Bounce Flash', #PH
8566
+ 4 => 'Wide Flash Adapter',
8567
+ 5 => 'Dome Diffuser', #28
8568
+ },
8569
+ },
8570
+ },
8571
+ 9.1 => {
8572
+ Name => 'FlashCommanderMode',
8573
+ Mask => 0x80,
8574
+ PrintConv => { 0 => 'Off', 1 => 'On' },
8575
+ },
8576
+ 9.2 => {
8577
+ Name => 'FlashControlMode',
8578
+ Mask => 0x7f,
8579
+ DataMember => 'FlashControlMode',
8580
+ RawConv => '$$self{FlashControlMode} = $val',
8581
+ PrintConv => \%flashControlMode,
8582
+ SeparateTable => 'FlashControlMode',
8583
+ },
8584
+ 10 => [
8585
+ {
8586
+ Name => 'FlashOutput',
8587
+ Condition => '$$self{FlashControlMode} >= 0x06',
8588
+ ValueConv => '2 ** (-$val/6)',
8589
+ ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
8590
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
8591
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
8592
+ },
8593
+ {
8594
+ Name => 'FlashCompensation',
8595
+ Format => 'int8s',
8596
+ Priority => 0,
8597
+ ValueConv => '-$val/6',
8598
+ ValueConvInv => '-6 * $val',
8599
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
8600
+ PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
8601
+ },
8602
+ ],
8603
+ 11 => {
8604
+ Name => 'FlashFocalLength',
7517
8605
  RawConv => '$val ? $val : undef',
7518
8606
  PrintConv => '"$val mm"',
7519
8607
  PrintConvInv => '$val=~/(\d+)/; $1 || 0',
@@ -8492,6 +9580,25 @@ my %nikonFocalConversions = (
8492
9580
  },
8493
9581
  );
8494
9582
 
9583
+ # MakerNotes0x51 - compression info for Z9
9584
+ %Image::ExifTool::Nikon::MakerNotes0x51 = (
9585
+ %binaryDataAttrs,
9586
+ DATAMEMBER => [ 0 ],
9587
+ GROUPS => { 0 => 'MakerNotes' },
9588
+ 0 => {
9589
+ Name => 'FirmwareVersion',
9590
+ Format => 'string[8]',
9591
+ Writable => 0,
9592
+ RawConv => '$$self{FirmwareVersion} = $val',
9593
+ },
9594
+ 10 => {
9595
+ Name => 'NEFCompression',
9596
+ Writable => 'int16u',
9597
+ SeparateTable => 'NEFCompression',
9598
+ PrintConv => \%nefCompression,
9599
+ },
9600
+ );
9601
+
8495
9602
  # extra info found in IFD0 of NEF files (ref PH, Z6/Z7)
8496
9603
  %Image::ExifTool::Nikon::NEFInfo = (
8497
9604
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },