exiftool_vendored 13.31.0 → 13.34.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +56 -1
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +47 -46
  7. data/bin/exiftool +114 -89
  8. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  9. data/bin/lib/Image/ExifTool/Canon.pm +19 -2
  10. data/bin/lib/Image/ExifTool/Exif.pm +9 -6
  11. data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
  12. data/bin/lib/Image/ExifTool/FujiFilm.pm +11 -3
  13. data/bin/lib/Image/ExifTool/Geotag.pm +5 -3
  14. data/bin/lib/Image/ExifTool/GoPro.pm +14 -2
  15. data/bin/lib/Image/ExifTool/LNK.pm +4 -1
  16. data/bin/lib/Image/ExifTool/Lang/cs.pm +0 -1
  17. data/bin/lib/Image/ExifTool/Lang/de.pm +0 -1
  18. data/bin/lib/Image/ExifTool/Lang/fr.pm +0 -1
  19. data/bin/lib/Image/ExifTool/Lang/it.pm +0 -1
  20. data/bin/lib/Image/ExifTool/Lang/ja.pm +0 -1
  21. data/bin/lib/Image/ExifTool/Lang/nl.pm +0 -1
  22. data/bin/lib/Image/ExifTool/Lang/pl.pm +0 -1
  23. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
  24. data/bin/lib/Image/ExifTool/Microsoft.pm +158 -1
  25. data/bin/lib/Image/ExifTool/Minolta.pm +4 -2
  26. data/bin/lib/Image/ExifTool/Nikon.pm +72 -37
  27. data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
  28. data/bin/lib/Image/ExifTool/Olympus.pm +254 -34
  29. data/bin/lib/Image/ExifTool/Panasonic.pm +3 -3
  30. data/bin/lib/Image/ExifTool/Pentax.pm +340 -61
  31. data/bin/lib/Image/ExifTool/QuickTime.pm +11 -4
  32. data/bin/lib/Image/ExifTool/README +2 -1
  33. data/bin/lib/Image/ExifTool/Sony.pm +44 -17
  34. data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
  35. data/bin/lib/Image/ExifTool/TagLookup.pm +4380 -4265
  36. data/bin/lib/Image/ExifTool/TagNames.pod +265 -19
  37. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
  38. data/bin/lib/Image/ExifTool/Writer.pl +19 -15
  39. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  40. data/bin/lib/Image/ExifTool.pm +12 -4
  41. data/bin/lib/Image/ExifTool.pod +50 -44
  42. data/bin/perl-Image-ExifTool.spec +46 -45
  43. data/lib/exiftool_vendored/version.rb +1 -1
  44. metadata +3 -2
@@ -60,12 +60,12 @@ package Image::ExifTool::Nikon;
60
60
  use strict;
61
61
  use vars qw($VERSION %nikonLensIDs %nikonTextEncoding);
62
62
  use Image::ExifTool qw(:DataAccess :Utils);
63
- use Image::ExifTool::NikonCustom qw(%buttonsZ9);
63
+ use Image::ExifTool::NikonCustom qw(%buttonsZ8 %buttonsZ9);
64
64
  use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.47';
68
+ $VERSION = '4.50';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -723,6 +723,7 @@ sub GetAFPointGrid($$;$);
723
723
  '9F 48 48 48 24 24 A1 06' => 'Yongnuo YN40mm F2.8N', #30
724
724
  '9F 54 68 68 18 18 A2 06' => 'Yongnuo YN100mm F2N', #30
725
725
  '9F 4C 44 44 18 18 A1 06' => 'Yongnuo YN35mm F2', #30
726
+ '9F 4D 50 50 14 14 A0 06' => 'Yongnuo YN50mm F1.8N', #30
726
727
  #
727
728
  '02 40 44 5C 2C 34 02 00' => 'Exakta AF 35-70mm 1:3.5-4.5 MC',
728
729
  #
@@ -1013,7 +1014,7 @@ my %hDMIOutputResolutionZ9 = (
1013
1014
  1 => '4320p',
1014
1015
  2 => '2160p',
1015
1016
  3 => '1080p',
1016
- #4 => '1080i',
1017
+ 4 => '1080i',
1017
1018
  5 => '720p',
1018
1019
  #6 => '576p',
1019
1020
  #7 => '480p',
@@ -1059,8 +1060,8 @@ my %imageAreaZ9b = (
1059
1060
  );
1060
1061
 
1061
1062
  my %infoZSeries = (
1062
- Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|f|fc|9)\b/i',
1063
- Notes => 'Z Series cameras thru October 2023',
1063
+ Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|f|fc|9)\b/i or $$self{Model} =~ /^NIKON Z(5_2|50_2|6_3)\b/i', #no space after 'Nikon Z' on models from Oct 2023
1064
+ Notes => 'Z Series cameras thru July 2025',
1064
1065
  );
1065
1066
 
1066
1067
  my %iSOAutoHiLimitZ6III = ( #28
@@ -1691,14 +1692,15 @@ my %cropHiSpeed = ( #IB
1691
1692
  4 => '3:2 Crop', # (1.2x, ref 36)
1692
1693
  6 => '16:9 Crop',
1693
1694
  8 => '2.7x Crop', #36 (D4/D500)
1694
- 9 => 'DX Movie Crop', # (DX during movie recording, Large)
1695
+ 9 => 'DX Movie 16:9 Crop', # (DX during movie recording, Large)
1695
1696
  10 => '1.3x Movie Crop', #36 (D4/D500)
1696
1697
  11 => 'FX Uncropped',
1697
1698
  12 => 'DX Uncropped',
1698
1699
  13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936
1699
1700
  14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856
1700
1701
  15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872
1701
- 17 => '1:1 Crop',
1702
+ 17 => 'FX 1:1 Crop',
1703
+ 18 => 'DX 1:1 Crop',
1702
1704
  OTHER => sub {
1703
1705
  my ($val, $inv, $conv) = @_;
1704
1706
  return undef if $inv;
@@ -2597,7 +2599,7 @@ my %base64coord = (
2597
2599
  },
2598
2600
  },
2599
2601
  { # (Z6_3 firmware version 1.00, ref 28)
2600
- Condition => '$$valPt =~ /^0809/',
2602
+ Condition => '$$valPt =~ /^08(09|10|11)/', #0809=Z6iii 0810=Z50ii #0811=Z5ii
2601
2603
  Name => 'ShotInfoZ6III',
2602
2604
  SubDirectory => {
2603
2605
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ6III',
@@ -4919,7 +4921,7 @@ my %base64coord = (
4919
4921
  DATAMEMBER => [ 0, 4, 5, 7, 66, 68 ],
4920
4922
  NOTES => q{
4921
4923
  AF information for Nikon cameras with the Expeed 7 processor: The Zf, Z6_3,
4922
- Z8, Z9 and Z50_3.
4924
+ Z8, Z9, Z50_2 and Z5_2.
4923
4925
  },
4924
4926
  0 => {
4925
4927
  Name => 'AFInfo2Version',
@@ -4965,8 +4967,8 @@ my %base64coord = (
4965
4967
  PrintConv => sub { PrintAFPoints(shift, \@afPoints405) }, #full-frame sensor, 45MP, auto-area focus point configuration
4966
4968
  PrintConvInv => sub { PrintAFPointsInv(shift, \@afPoints405) },
4967
4969
  },{
4968
- Name => 'AFPointsUsed', # Z6iii and Zf (AFInfo2Version 0401)
4969
- Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f)\b/i and ($$self{AFAreaModeUsed} == 197 or $$self{AFAreaModeUsed} == 207)',
4970
+ Name => 'AFPointsUsed', # Z6iii & Zf (AFInfo2Version 0401) and Z5ii (AFInfo2Version 0402)
4971
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and ($$self{AFAreaModeUsed} == 197 or $$self{AFAreaModeUsed} == 207)',
4970
4972
  Format => 'undef[38]',
4971
4973
  ValueConv => 'join(" ", unpack("H2"x38, $val))',
4972
4974
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
@@ -5000,17 +5002,17 @@ my %base64coord = (
5000
5002
  0x43 => [
5001
5003
  {
5002
5004
  Name => 'FocusPositionHorizontal', # 209/231 focus point cameras
5003
- Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaXPosition} != 0', #model Z50ii
5005
+ Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #model Z50ii
5004
5006
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the estimated separation between adjacent points (informed by the measured Z7ii separation)
5005
5007
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 19 ) },
5006
5008
  },{
5007
5009
  Name => 'FocusPositionHorizontal', #273/299 focus point cameras
5008
- Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f)\b/i and $$self{AFAreaXPosition} != 0', #models Z6iii and Zf
5010
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #models Z6iii, Zf & Z5ii
5009
5011
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the estimated separation between adjacent points (informed by the measured Z7ii separation)
5010
5012
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 21 ) },
5011
5013
  },{
5012
5014
  Name => 'FocusPositionHorizontal', #405/493 focus point cameras
5013
- Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaXPosition} != 0', #models Z8 and Z9
5015
+ Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #models Z8 and Z9
5014
5016
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the measured horizontal pixel separation between adjacent points
5015
5017
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ) },
5016
5018
  },
@@ -5024,17 +5026,17 @@ my %base64coord = (
5024
5026
  0x45 => [
5025
5027
  {
5026
5028
  Name => 'FocusPositionVertical', # 209/233 focus point cameras
5027
- Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaYPosition} != 0', #model Z50ii
5029
+ Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #model Z50ii
5028
5030
  ValueConv => 'int($$self{AFAreaYPosition} / 286 )', #divisor chosen to cause center point report 'C'
5029
5031
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 11 ) },
5030
5032
  },{
5031
5033
  Name => 'FocusPositionVertical', #273/299 focus point cameras
5032
- Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f)\b/i and $$self{AFAreaYPosition} != 0', #models Z6iii and Zf
5034
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #models Z6iii, Zf & Z5ii
5033
5035
  ValueConv => 'int($$self{AFAreaYPosition} / 286 )', #divisor chosen to cause center point report 'C'
5034
5036
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 13 ) },
5035
5037
  },{
5036
5038
  Name => 'FocusPositionVertical', #405/493 focus point cameras
5037
- Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaYPosition} != 0', #models Z8 and Z9
5039
+ Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #models Z8 and Z9
5038
5040
  ValueConv => 'int($$self{AFAreaYPosition} / 292 )', #divisor is the measured vertical pixel separation between adjacent points
5039
5041
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ) },
5040
5042
  },
@@ -8668,6 +8670,7 @@ my %nikonFocalConversions = (
8668
8670
  },
8669
8671
  0x90 => {
8670
8672
  Name => 'MenuOffset',
8673
+ Condition => '$$self{Model} =~ /^NIKON Z6_3\b/i',
8671
8674
  Format => 'int32u',
8672
8675
  SubDirectory => {
8673
8676
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ6III',
@@ -9006,12 +9009,17 @@ my %nikonFocalConversions = (
9006
9009
  RawConv => '$$self{FocusShiftShooting} = $val',
9007
9010
  PrintConv => q{
9008
9011
  return 'Off' if $val == 0 ;
9009
- my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
9012
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
9013
+ if ($$self{PixelShiftActive} and $$self{PixelShiftActive} eq 1) {$i = sprintf("Frame %.0f",$val);} #for the Z8 fw3 with PixelShift Enabled, the frame count is correct, but the frame total needs to be multiplied by the number of PixelShift frames (which I cannot find)
9010
9014
  return "On: $i"
9011
9015
  },
9016
+ Hook => '$varSize += 2 if $$self{Model} =~ /^NIKON Z 8/ and $$self{FirmwareVersion} and $$self{FirmwareVersion} ge "03.00"', # 2 bytes were added with Z8 firmware 3.0 support for pixel shift when focus stacking
9012
9017
  },
9018
+ #
9019
+ # Note: Offsets after this are shifted by +2 for Z8 firmware 3.0 (see Hook above)
9020
+ #
9013
9021
  0x0028 => {
9014
- Name => 'IntervalShooting',
9022
+ Name => 'IntervalShooting', #will be 'On' when Interval Shooting is selected via the Photo Shooting Menu and also when a non-zero interval is specified when using Focus Shift and/or Pixel Shift Shooting
9015
9023
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
9016
9024
  RawConv => '$$self{IntervalShooting} = $val',
9017
9025
  Format => 'int16u',
@@ -9790,7 +9798,7 @@ my %nikonFocalConversions = (
9790
9798
  %Image::ExifTool::Nikon::MenuSettingsZ8 = (
9791
9799
  %binaryDataAttrs,
9792
9800
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9793
- DATAMEMBER => [ 72, 152, 200, 204, 244, 440, 548, 554, 570, 596 ],
9801
+ DATAMEMBER => [ 72, 152, 200, 204, 244, 440, 548, 554, 570, 596, 636 ],
9794
9802
  NOTES => 'These tags are common to all Z8 firmware versions.',
9795
9803
  72 => {
9796
9804
  Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
@@ -9805,7 +9813,7 @@ my %nikonFocalConversions = (
9805
9813
  RawConv => '$$self{MultipleExposureMode} = $val',
9806
9814
  PrintConv => \%multipleExposureModeZ9,
9807
9815
  },
9808
- 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
9816
+ 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9 - not present in a NEF, only in the assembled JPG
9809
9817
  184 => {
9810
9818
  Name => 'IntervalDurationHours',
9811
9819
  Format => 'int32u',
@@ -9904,7 +9912,7 @@ my %nikonFocalConversions = (
9904
9912
  Notes => 'AE and/or Flash Bracketing',
9905
9913
  PrintConv => \%bracketIncrementZ9,
9906
9914
  },
9907
- 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 },
9915
+ 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 }, #will be 'on' for the tone mapped JPGs, off for the source NEF files
9908
9916
  #572 HDRSaveRaw 0=> No; 1=> Yes
9909
9917
  576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
9910
9918
  582 => { Name => 'HDRLevel', Condition => '$$self{HDR} ne 0', PrintConv => \%hdrLevelZ8 },
@@ -9919,7 +9927,15 @@ my %nikonFocalConversions = (
9919
9927
  },
9920
9928
  618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9921
9929
  622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9922
- 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9930
+ 636 => {
9931
+ Name => 'HighFrequencyFlickerReduction',
9932
+ PrintConv => \%offOn,
9933
+ Unknown => 1,
9934
+ Hook => '$varSize += 4 if $$self{FirmwareVersion} and $$self{FirmwareVersion} ge "03.00"',
9935
+ },
9936
+ #
9937
+ # firmware 3.00 adds 4 bytes somewhere in the range 638-730 (hence the Hook above)
9938
+ #
9923
9939
  730 => {
9924
9940
  Name => 'MovieImageArea',
9925
9941
  Unknown => 1,
@@ -10028,7 +10044,15 @@ my %nikonFocalConversions = (
10028
10044
  Name => 'MenuSettingsZ8',
10029
10045
  Format => 'undef[943]',
10030
10046
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8' },
10031
- Hook => '$varSize += 4 if $$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.10"',
10047
+ Hook => q{
10048
+ if ($$self{FirmwareVersion}) {
10049
+ if ($$self{FirmwareVersion} =~ /^02\.10/) {
10050
+ $varSize += 4;
10051
+ } elsif ($$self{FirmwareVersion} ge "03.0") {
10052
+ $varSize += 8
10053
+ }
10054
+ }
10055
+ },
10032
10056
  },
10033
10057
  943 => {
10034
10058
  Name => 'CustomSettingsZ8',
@@ -10079,22 +10103,26 @@ my %nikonFocalConversions = (
10079
10103
  1880 => { Name => 'NonCPULens18MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
10080
10104
  1884 => { Name => 'NonCPULens19MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
10081
10105
  1888 => { Name => 'NonCPULens20MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
10082
- 1824 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
10083
- 1842 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
10084
- 1843 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
10085
- 1878 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
10086
- 1906 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
10087
- 1915 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
10106
+ 1904 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
10107
+ 1922 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
10108
+ 1923 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
10109
+ 1958 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
10110
+ 1986 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
10111
+ 1995 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
10088
10112
  2046 => { Name => 'PixelShiftShooting', RawConv => '$$self{PixelShiftShooting} = $val', PrintConv => \%multipleExposureModeZ9 }, #off/on/on (series)
10089
10113
  2048 => { Name => 'PixelShiftNumberShots', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftNumberShots },
10090
10114
  2050 => { Name => 'PixelShiftDelay', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftDelay },
10091
- 2052 => { Name => 'PlaybackButton', %buttonsZ9 }, #CSf2
10092
- 2054 => { Name => 'WBButton', %buttonsZ9}, #CSf2
10093
- 2056 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
10094
- 2058 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ9}, #CSf2
10095
- 2060 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ9}, #CSf2
10096
- 2062 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ9}, #CSf2
10097
- 2064 => { Name => 'BracketButtonPlaybackMode', %buttonsZ9}, #CSf2
10115
+ 2052 => { Name => 'PlaybackButton', %buttonsZ8 }, #CSf2
10116
+ 2054 => { Name => 'WBButton', %buttonsZ8}, #CSf2
10117
+ 2056 => { Name => 'BracketButton', %buttonsZ8}, #CSf2
10118
+ 2058 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ8}, #CSf3
10119
+ 2060 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ8}, #CSf3
10120
+ 2062 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ8}, #CSf3
10121
+ 2064 => { Name => 'BracketButtonPlaybackMode', %buttonsZ8}, #CSf3
10122
+ #2088 FlickerFrequencyPreset #Z8 fw 3.0
10123
+ 2206 => { Name => 'MaximumApertureLV', PrintConv => \%offOn, Unknown => 1 }, #CSa14
10124
+ 2208 => { Name => 'ReleaseModeButton', %buttonsZ8}, #CSf2
10125
+ 2216 => { Name => 'ReleaseModeButtonPlaybackMode', %buttonsZ8}, #CSf3
10098
10126
  );
10099
10127
 
10100
10128
  %Image::ExifTool::Nikon::MenuSettingsZ9 = (
@@ -12057,6 +12085,7 @@ my %nikonFocalConversions = (
12057
12085
  %Image::ExifTool::Nikon::MakerNotes0x56 = (
12058
12086
  %binaryDataAttrs,
12059
12087
  GROUPS => { 0 => 'MakerNotes' },
12088
+ DATAMEMBER => [ 12 ],
12060
12089
  0 => {
12061
12090
  Name => 'FirmwareVersion56',
12062
12091
  Format => 'string[4]',
@@ -12067,6 +12096,11 @@ my %nikonFocalConversions = (
12067
12096
  Name => 'BurstGroupID', #all frames shot within a burst (using CL/CH/C30/C60/C120) will share the same BurstGroupID. Value will be > 0 for all images shot in continuous modes (or via Pixel Shift). 0 for single-frame.
12068
12097
  Format => 'int16u'
12069
12098
  },
12099
+ 12 => {
12100
+ Name => 'PixelShiftID', # 1 => Pixel shift enabled (either directly or thru Focus Shift Shooting with Z8 fw 3.0)
12101
+ RawConv => '$$self{PixelShiftActive} = $val',
12102
+ Hidden => 1
12103
+ },
12070
12104
  );
12071
12105
 
12072
12106
  # extra info found in IFD0 of NEF files (ref PH, Z6/Z7)
@@ -12105,6 +12139,7 @@ my %nikonFocalConversions = (
12105
12139
  Name => 'DistortionCorrection', #used by ACR to determine whether the built-in lens profile is applied
12106
12140
  Format => 'int8u',
12107
12141
  PrintConv => {
12142
+ 0 => 'No Lens Attached', #to prevent reporting 'Unknown'
12108
12143
  1 => 'On (Optional)',
12109
12144
  2 => 'Off',
12110
12145
  3 => 'On (Required)',
@@ -13,16 +13,14 @@
13
13
  package Image::ExifTool::NikonCustom;
14
14
 
15
15
  use strict;
16
- use vars qw($VERSION @ISA @EXPORT_OK %buttonsZ9);
16
+ use vars qw($VERSION @ISA @EXPORT_OK %buttonsZ8 %buttonsZ9);
17
17
 
18
- $VERSION = '1.26';
18
+ $VERSION = '1.27';
19
19
 
20
20
  @ISA = qw(Exporter);
21
- @EXPORT_OK = qw(%buttonsZ9);
21
+ @EXPORT_OK = qw(%buttonsZ8 %buttonsZ9);
22
22
 
23
- %buttonsZ9= (
24
- SeparateTable => 'ButtonsZ9',
25
- PrintConv => {
23
+ my %buttonsCommonZ8Z9 = ( #button roles shared by the Z8 & Z9. Assigments began to diverge with Z8 fw 2.00 and became significant with z8 fw 3.0
26
24
  0 => 'None',
27
25
  1 => 'Preview',
28
26
  3 => 'FV Lock',
@@ -112,7 +110,37 @@ $VERSION = '1.26';
112
110
  113 => 'Power Zoom +',
113
111
  114 => 'Power Zoom -',
114
112
  115 => 'Delete',
115
- 116 => 'Pixel Shift Shooting', #Z8 (Z9 fw 5.1 maps as 'Save and Load Power Zoom Position')
113
+ );
114
+ %buttonsZ8 = (
115
+ SeparateTable => 'ButtonsZ8',
116
+ PrintConv => {
117
+ %buttonsCommonZ8Z9,
118
+ 116 => 'Pixel Shift Shooting',
119
+ 117 => 'Cycle AF-area Mode',
120
+ 119 => 'Focus Limiter',
121
+ 120 => 'Jump to Source Image',
122
+ 121 => 'Raw Processing (Current)',
123
+ 122 => 'Raw Processing (Multiple)',
124
+ 123 => 'Trim',
125
+ 124 => 'Resize (Current)',
126
+ 125 => 'Resize (Multiple)',
127
+ 126 => 'D-Lighting',
128
+ 127 => 'Straighten',
129
+ 128 => 'Distortion Control',
130
+ 129 => 'Perspective Control',
131
+ 130 => 'Monochrome',
132
+ 131 => 'Overlay (Add)',
133
+ 132 => 'Lighten',
134
+ 133 => 'Darken',
135
+ 134 => 'Motion Blend',
136
+ 135 => 'Cycle Monitor Mode',
137
+ },
138
+ );
139
+ %buttonsZ9= (
140
+ SeparateTable => 'ButtonsZ9',
141
+ PrintConv => {
142
+ %buttonsCommonZ8Z9,
143
+ 116 => 'Save and Load Power Zoom Position',
116
144
  117 => 'Cycle AF-area Mode',
117
145
  118 => 'Raw Processing (Current)', #118-131 are Playback Retouch options
118
146
  119 => 'Raw Processing (Multiple)',
@@ -10243,6 +10271,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10243
10271
  1 => '1 s',
10244
10272
  2 => '2 s',
10245
10273
  3 => '3 s',
10274
+ 4 => 'Min',
10246
10275
  },
10247
10276
  },
10248
10277
  51 => { Name => 'PlaybackMonitorOffTime', %powerOffDelayTimesZ9 }, # CSc3-a
@@ -10404,6 +10433,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10404
10433
  263 => { Name => 'AutoFocusModeRestrictions', PrintConv => \%focusModeRestrictionsZ9, Unknown => 1}, # CSa9
10405
10434
  267 => { Name => 'CHModeShootingSpeed', ValueConv => '$val + 1', ValueConvInv => '$val - 1', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1a
10406
10435
  273 => { Name => 'FlashBurstPriority', PrintConv => { 0 => 'Frame Rate',1 => 'Exposure'}, Unknown => 1 }, # CSe8
10436
+ 281 => { Name => 'Func3Button', %buttonsZ9}, # CSf2-c
10407
10437
  335 => { Name => 'LimitAF-AreaModeSelDynamic_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
10408
10438
  336 => { Name => 'LimitAF-AreaModeSelDynamic_M', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
10409
10439
  337 => { Name => 'LimitAF-AreaModeSelDynamic_L', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
@@ -10426,7 +10456,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10426
10456
  463 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
10427
10457
  469 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10
10428
10458
 
10429
- 515 => { Name => 'MovieAFAreaMode', %buttonsZ9, Unknown => 1}, # CSg2-e
10459
+ #515 => { Name => 'MovieAFAreaMode', %buttonsZ9, Unknown => 1}, # CSg2-e #28 this is incorrect - MovieAFAreaMode is set in the Photo Shooting Menu and the tag is set in Nikon.pm
10430
10460
  529 => { # CSg9-a
10431
10461
  Name => 'ZebraPatternToneRange',
10432
10462
  Unknown => 1,
@@ -10736,7 +10766,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10736
10766
  #119 Func2Button submenu: AreaMode 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-b
10737
10767
  #121 Func2Button submenu: AreaMode+AF-On 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-b
10738
10768
  #125 Func2Button submenu: SynchronizedRelease 1=>'Master', 2=>'Remote' # CSf2-b
10739
- #127 Func2Button submenu: Zoom 0=>'Zoom (Low)', 2=>'Zoom (1:1)', 2=>'Zoom (High)' # CSf2-b
10769
+ #127 Func2Button submenu: Zoom 0=>'Zoom 5', 2=>'Zoom (1:1)', 2=>'Zoom 200%, 2=>'Zoom 400%' # CSf2-b
10740
10770
  #129 Func2Button & Func2ButtonPlayback submenu: Rating # CSf2-b & CSf3b 0=>'Candidate For Deletion' 6=>''None'
10741
10771
  131 => { Name => 'AFOnButton', %buttonsZ9}, # CSf2-c
10742
10772
  143 => { Name => 'SubSelector', %buttonsZ9, Unknown => 1}, # CSf2-g
@@ -11275,7 +11305,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
11275
11305
  493 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10
11276
11306
  505 => { Name => 'VerticalMovieFuncButton', %buttonsZ9, Unknown => 1}, # CSg2-d
11277
11307
  529 => { Name => 'VerticalMovieAFOnButton', %buttonsZ9, Unknown => 1}, # CSg2-l
11278
- 539 => { Name => 'MovieAFAreaMode', %buttonsZ9, Unknown => 1}, # CSg2-e
11308
+ #539 => { Name => 'MovieAFAreaMode', %buttonsZ9, Unknown => 1}, # CSg2-e #28 this feels incorrect - MovieAFAreaMode is set in the Photo Shooting Menu and the tag should be in Nikon.pm
11279
11309
  #545 => { Name => 'MovieLimitAF-AreaModeSelWideAF_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-a
11280
11310
  #546 => { Name => 'MovieLimitAF-AreaModeSelWideAF_W', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-b
11281
11311
  #547 => { Name => 'MovieLimitAF-AreaModeSelSubjectTrack', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-c