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