exiftool_vendored 13.31.0 → 13.33.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +38 -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 +81 -56
  8. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  9. data/bin/lib/Image/ExifTool/Canon.pm +10 -2
  10. data/bin/lib/Image/ExifTool/Exif.pm +5 -3
  11. data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
  12. data/bin/lib/Image/ExifTool/FujiFilm.pm +10 -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 +1 -1
  26. data/bin/lib/Image/ExifTool/Nikon.pm +71 -37
  27. data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
  28. data/bin/lib/Image/ExifTool/Olympus.pm +240 -35
  29. data/bin/lib/Image/ExifTool/Panasonic.pm +3 -3
  30. data/bin/lib/Image/ExifTool/Pentax.pm +271 -53
  31. data/bin/lib/Image/ExifTool/QuickTime.pm +11 -4
  32. data/bin/lib/Image/ExifTool/Sony.pm +5 -2
  33. data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
  34. data/bin/lib/Image/ExifTool/TagLookup.pm +4373 -4264
  35. data/bin/lib/Image/ExifTool/TagNames.pod +249 -17
  36. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
  37. data/bin/lib/Image/ExifTool/Writer.pl +15 -11
  38. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  39. data/bin/lib/Image/ExifTool.pm +11 -4
  40. data/bin/lib/Image/ExifTool.pod +45 -44
  41. data/bin/perl-Image-ExifTool.spec +46 -45
  42. data/lib/exiftool_vendored/version.rb +1 -1
  43. 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.49';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -1013,7 +1013,7 @@ my %hDMIOutputResolutionZ9 = (
1013
1013
  1 => '4320p',
1014
1014
  2 => '2160p',
1015
1015
  3 => '1080p',
1016
- #4 => '1080i',
1016
+ 4 => '1080i',
1017
1017
  5 => '720p',
1018
1018
  #6 => '576p',
1019
1019
  #7 => '480p',
@@ -1059,8 +1059,8 @@ my %imageAreaZ9b = (
1059
1059
  );
1060
1060
 
1061
1061
  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',
1062
+ 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
1063
+ Notes => 'Z Series cameras thru July 2025',
1064
1064
  );
1065
1065
 
1066
1066
  my %iSOAutoHiLimitZ6III = ( #28
@@ -1691,14 +1691,15 @@ my %cropHiSpeed = ( #IB
1691
1691
  4 => '3:2 Crop', # (1.2x, ref 36)
1692
1692
  6 => '16:9 Crop',
1693
1693
  8 => '2.7x Crop', #36 (D4/D500)
1694
- 9 => 'DX Movie Crop', # (DX during movie recording, Large)
1694
+ 9 => 'DX Movie 16:9 Crop', # (DX during movie recording, Large)
1695
1695
  10 => '1.3x Movie Crop', #36 (D4/D500)
1696
1696
  11 => 'FX Uncropped',
1697
1697
  12 => 'DX Uncropped',
1698
1698
  13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936
1699
1699
  14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856
1700
1700
  15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872
1701
- 17 => '1:1 Crop',
1701
+ 17 => 'FX 1:1 Crop',
1702
+ 18 => 'DX 1:1 Crop',
1702
1703
  OTHER => sub {
1703
1704
  my ($val, $inv, $conv) = @_;
1704
1705
  return undef if $inv;
@@ -2597,7 +2598,7 @@ my %base64coord = (
2597
2598
  },
2598
2599
  },
2599
2600
  { # (Z6_3 firmware version 1.00, ref 28)
2600
- Condition => '$$valPt =~ /^0809/',
2601
+ Condition => '$$valPt =~ /^08(09|10|11)/', #0809=Z6iii 0810=Z50ii #0811=Z5ii
2601
2602
  Name => 'ShotInfoZ6III',
2602
2603
  SubDirectory => {
2603
2604
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ6III',
@@ -4919,7 +4920,7 @@ my %base64coord = (
4919
4920
  DATAMEMBER => [ 0, 4, 5, 7, 66, 68 ],
4920
4921
  NOTES => q{
4921
4922
  AF information for Nikon cameras with the Expeed 7 processor: The Zf, Z6_3,
4922
- Z8, Z9 and Z50_3.
4923
+ Z8, Z9, Z50_2 and Z5_2.
4923
4924
  },
4924
4925
  0 => {
4925
4926
  Name => 'AFInfo2Version',
@@ -4965,8 +4966,8 @@ my %base64coord = (
4965
4966
  PrintConv => sub { PrintAFPoints(shift, \@afPoints405) }, #full-frame sensor, 45MP, auto-area focus point configuration
4966
4967
  PrintConvInv => sub { PrintAFPointsInv(shift, \@afPoints405) },
4967
4968
  },{
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)',
4969
+ Name => 'AFPointsUsed', # Z6iii & Zf (AFInfo2Version 0401) and Z5ii (AFInfo2Version 0402)
4970
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and ($$self{AFAreaModeUsed} == 197 or $$self{AFAreaModeUsed} == 207)',
4970
4971
  Format => 'undef[38]',
4971
4972
  ValueConv => 'join(" ", unpack("H2"x38, $val))',
4972
4973
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
@@ -5000,17 +5001,17 @@ my %base64coord = (
5000
5001
  0x43 => [
5001
5002
  {
5002
5003
  Name => 'FocusPositionHorizontal', # 209/231 focus point cameras
5003
- Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaXPosition} != 0', #model Z50ii
5004
+ Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #model Z50ii
5004
5005
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the estimated separation between adjacent points (informed by the measured Z7ii separation)
5005
5006
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 19 ) },
5006
5007
  },{
5007
5008
  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
5009
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #models Z6iii, Zf & Z5ii
5009
5010
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the estimated separation between adjacent points (informed by the measured Z7ii separation)
5010
5011
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 21 ) },
5011
5012
  },{
5012
5013
  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
5014
+ Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaXPosition} and $$self{AFAreaXPosition} != 0', #models Z8 and Z9
5014
5015
  ValueConv => 'int($$self{AFAreaXPosition} / 260 )', #divisor is the measured horizontal pixel separation between adjacent points
5015
5016
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ) },
5016
5017
  },
@@ -5024,17 +5025,17 @@ my %base64coord = (
5024
5025
  0x45 => [
5025
5026
  {
5026
5027
  Name => 'FocusPositionVertical', # 209/233 focus point cameras
5027
- Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaYPosition} != 0', #model Z50ii
5028
+ Condition => '$$self{Model} =~ /^NIKON Z50_2\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #model Z50ii
5028
5029
  ValueConv => 'int($$self{AFAreaYPosition} / 286 )', #divisor chosen to cause center point report 'C'
5029
5030
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 11 ) },
5030
5031
  },{
5031
5032
  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
5033
+ Condition => '$$self{Model} =~ /^NIKON (Z6_3|Z f|Z5_2)\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #models Z6iii, Zf & Z5ii
5033
5034
  ValueConv => 'int($$self{AFAreaYPosition} / 286 )', #divisor chosen to cause center point report 'C'
5034
5035
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 13 ) },
5035
5036
  },{
5036
5037
  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
5038
+ Condition => '$$self{Model} =~ /^NIKON (Z 8|Z 9)\b/i and $$self{AFAreaYPosition} and $$self{AFAreaYPosition} != 0', #models Z8 and Z9
5038
5039
  ValueConv => 'int($$self{AFAreaYPosition} / 292 )', #divisor is the measured vertical pixel separation between adjacent points
5039
5040
  PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ) },
5040
5041
  },
@@ -8668,6 +8669,7 @@ my %nikonFocalConversions = (
8668
8669
  },
8669
8670
  0x90 => {
8670
8671
  Name => 'MenuOffset',
8672
+ Condition => '$$self{Model} =~ /^NIKON Z6_3\b/i',
8671
8673
  Format => 'int32u',
8672
8674
  SubDirectory => {
8673
8675
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ6III',
@@ -9006,12 +9008,17 @@ my %nikonFocalConversions = (
9006
9008
  RawConv => '$$self{FocusShiftShooting} = $val',
9007
9009
  PrintConv => q{
9008
9010
  return 'Off' if $val == 0 ;
9009
- my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
9011
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
9012
+ 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
9013
  return "On: $i"
9011
9014
  },
9015
+ 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
9016
  },
9017
+ #
9018
+ # Note: Offsets after this are shifted by +2 for Z8 firmware 3.0 (see Hook above)
9019
+ #
9013
9020
  0x0028 => {
9014
- Name => 'IntervalShooting',
9021
+ 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
9022
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
9016
9023
  RawConv => '$$self{IntervalShooting} = $val',
9017
9024
  Format => 'int16u',
@@ -9790,7 +9797,7 @@ my %nikonFocalConversions = (
9790
9797
  %Image::ExifTool::Nikon::MenuSettingsZ8 = (
9791
9798
  %binaryDataAttrs,
9792
9799
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9793
- DATAMEMBER => [ 72, 152, 200, 204, 244, 440, 548, 554, 570, 596 ],
9800
+ DATAMEMBER => [ 72, 152, 200, 204, 244, 440, 548, 554, 570, 596, 636 ],
9794
9801
  NOTES => 'These tags are common to all Z8 firmware versions.',
9795
9802
  72 => {
9796
9803
  Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
@@ -9805,7 +9812,7 @@ my %nikonFocalConversions = (
9805
9812
  RawConv => '$$self{MultipleExposureMode} = $val',
9806
9813
  PrintConv => \%multipleExposureModeZ9,
9807
9814
  },
9808
- 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
9815
+ 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9 - not present in a NEF, only in the assembled JPG
9809
9816
  184 => {
9810
9817
  Name => 'IntervalDurationHours',
9811
9818
  Format => 'int32u',
@@ -9904,7 +9911,7 @@ my %nikonFocalConversions = (
9904
9911
  Notes => 'AE and/or Flash Bracketing',
9905
9912
  PrintConv => \%bracketIncrementZ9,
9906
9913
  },
9907
- 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 },
9914
+ 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 }, #will be 'on' for the tone mapped JPGs, off for the source NEF files
9908
9915
  #572 HDRSaveRaw 0=> No; 1=> Yes
9909
9916
  576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
9910
9917
  582 => { Name => 'HDRLevel', Condition => '$$self{HDR} ne 0', PrintConv => \%hdrLevelZ8 },
@@ -9919,7 +9926,15 @@ my %nikonFocalConversions = (
9919
9926
  },
9920
9927
  618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9921
9928
  622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9922
- 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9929
+ 636 => {
9930
+ Name => 'HighFrequencyFlickerReduction',
9931
+ PrintConv => \%offOn,
9932
+ Unknown => 1,
9933
+ Hook => '$varSize += 4 if $$self{FirmwareVersion} and $$self{FirmwareVersion} ge "03.00"',
9934
+ },
9935
+ #
9936
+ # firmware 3.00 adds 4 bytes somewhere in the range 638-730 (hence the Hook above)
9937
+ #
9923
9938
  730 => {
9924
9939
  Name => 'MovieImageArea',
9925
9940
  Unknown => 1,
@@ -10028,7 +10043,15 @@ my %nikonFocalConversions = (
10028
10043
  Name => 'MenuSettingsZ8',
10029
10044
  Format => 'undef[943]',
10030
10045
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8' },
10031
- Hook => '$varSize += 4 if $$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.10"',
10046
+ Hook => q{
10047
+ if ($$self{FirmwareVersion}) {
10048
+ if ($$self{FirmwareVersion} =~ /^02\.10/) {
10049
+ $varSize += 4;
10050
+ } elsif ($$self{FirmwareVersion} ge "03.0") {
10051
+ $varSize += 8
10052
+ }
10053
+ }
10054
+ },
10032
10055
  },
10033
10056
  943 => {
10034
10057
  Name => 'CustomSettingsZ8',
@@ -10079,22 +10102,26 @@ my %nikonFocalConversions = (
10079
10102
  1880 => { Name => 'NonCPULens18MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
10080
10103
  1884 => { Name => 'NonCPULens19MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
10081
10104
  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 },
10105
+ 1904 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
10106
+ 1922 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
10107
+ 1923 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
10108
+ 1958 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
10109
+ 1986 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
10110
+ 1995 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
10088
10111
  2046 => { Name => 'PixelShiftShooting', RawConv => '$$self{PixelShiftShooting} = $val', PrintConv => \%multipleExposureModeZ9 }, #off/on/on (series)
10089
10112
  2048 => { Name => 'PixelShiftNumberShots', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftNumberShots },
10090
10113
  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
10114
+ 2052 => { Name => 'PlaybackButton', %buttonsZ8 }, #CSf2
10115
+ 2054 => { Name => 'WBButton', %buttonsZ8}, #CSf2
10116
+ 2056 => { Name => 'BracketButton', %buttonsZ8}, #CSf2
10117
+ 2058 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ8}, #CSf3
10118
+ 2060 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ8}, #CSf3
10119
+ 2062 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ8}, #CSf3
10120
+ 2064 => { Name => 'BracketButtonPlaybackMode', %buttonsZ8}, #CSf3
10121
+ #2088 FlickerFrequencyPreset #Z8 fw 3.0
10122
+ 2206 => { Name => 'MaximumApertureLV', PrintConv => \%offOn, Unknown => 1 }, #CSa14
10123
+ 2208 => { Name => 'ReleaseModeButton', %buttonsZ8}, #CSf2
10124
+ 2216 => { Name => 'ReleaseModeButtonPlaybackMode', %buttonsZ8}, #CSf3
10098
10125
  );
10099
10126
 
10100
10127
  %Image::ExifTool::Nikon::MenuSettingsZ9 = (
@@ -12057,6 +12084,7 @@ my %nikonFocalConversions = (
12057
12084
  %Image::ExifTool::Nikon::MakerNotes0x56 = (
12058
12085
  %binaryDataAttrs,
12059
12086
  GROUPS => { 0 => 'MakerNotes' },
12087
+ DATAMEMBER => [ 12 ],
12060
12088
  0 => {
12061
12089
  Name => 'FirmwareVersion56',
12062
12090
  Format => 'string[4]',
@@ -12067,6 +12095,11 @@ my %nikonFocalConversions = (
12067
12095
  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
12096
  Format => 'int16u'
12069
12097
  },
12098
+ 12 => {
12099
+ Name => 'PixelShiftID', # 1 => Pixel shift enabled (either directly or thru Focus Shift Shooting with Z8 fw 3.0)
12100
+ RawConv => '$$self{PixelShiftActive} = $val',
12101
+ Hidden => 1
12102
+ },
12070
12103
  );
12071
12104
 
12072
12105
  # extra info found in IFD0 of NEF files (ref PH, Z6/Z7)
@@ -12105,6 +12138,7 @@ my %nikonFocalConversions = (
12105
12138
  Name => 'DistortionCorrection', #used by ACR to determine whether the built-in lens profile is applied
12106
12139
  Format => 'int8u',
12107
12140
  PrintConv => {
12141
+ 0 => 'No Lens Attached', #to prevent reporting 'Unknown'
12108
12142
  1 => 'On (Optional)',
12109
12143
  2 => 'Off',
12110
12144
  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