exiftool_vendored 13.12.0 → 13.16.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +79 -22
  3. data/bin/MANIFEST +7 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +2 -2
  7. data/bin/arg_files/exif2xmp.args +4 -0
  8. data/bin/arg_files/xmp2exif.args +2 -1
  9. data/bin/build_geolocation +1 -1
  10. data/bin/exiftool +6 -5
  11. data/bin/lib/Image/ExifTool/AFCP.pm +5 -5
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +20 -15
  13. data/bin/lib/Image/ExifTool/Canon.pm +5 -3
  14. data/bin/lib/Image/ExifTool/DJI.pm +64 -11
  15. data/bin/lib/Image/ExifTool/EXE.pm +17 -3
  16. data/bin/lib/Image/ExifTool/Geolocation.pm +16 -7
  17. data/bin/lib/Image/ExifTool/ID3.pm +4 -4
  18. data/bin/lib/Image/ExifTool/JPEG.pm +5 -1
  19. data/bin/lib/Image/ExifTool/LigoGPS.pm +1 -0
  20. data/bin/lib/Image/ExifTool/MIE.pm +6 -3
  21. data/bin/lib/Image/ExifTool/Nikon.pm +328 -4
  22. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  23. data/bin/lib/Image/ExifTool/Panasonic.pm +7 -1
  24. data/bin/lib/Image/ExifTool/Protobuf.pm +25 -7
  25. data/bin/lib/Image/ExifTool/QuickTime.pm +215 -59
  26. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +12 -12
  27. data/bin/lib/Image/ExifTool/README +4 -1
  28. data/bin/lib/Image/ExifTool/RIFF.pm +11 -1
  29. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  30. data/bin/lib/Image/ExifTool/TagLookup.pm +4821 -4811
  31. data/bin/lib/Image/ExifTool/TagNames.pod +231 -25
  32. data/bin/lib/Image/ExifTool/Torrent.pm +2 -2
  33. data/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  34. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +114 -63
  35. data/bin/lib/Image/ExifTool/WriteRIFF.pl +3 -1
  36. data/bin/lib/Image/ExifTool/Writer.pl +16 -11
  37. data/bin/lib/Image/ExifTool.pm +24 -8
  38. data/bin/lib/Image/ExifTool.pod +52 -49
  39. data/bin/perl-Image-ExifTool.spec +1 -1
  40. data/lib/exiftool_vendored/version.rb +1 -1
  41. metadata +3 -2
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
65
65
  use Image::ExifTool::GPS;
66
66
  use Image::ExifTool::XMP;
67
67
 
68
- $VERSION = '4.40';
68
+ $VERSION = '4.41';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -5710,6 +5710,8 @@ my %nikonFocalConversions = (
5710
5710
  45 => 'Nikkor Z 600mm f/6.3 VR S', #28
5711
5711
  46 => 'Nikkor Z 135mm f/1.8 S Plena', #28
5712
5712
  48 => 'Nikkor Z 28-400mm f/4-8 VR', #30
5713
+ 51 => 'Nikkor Z 35mm f/1.4', #28
5714
+ 52 => 'Nikkor Z 50mm f/1.4', #28
5713
5715
  2305 => 'Laowa FFII 10mm F2.8 C&D Dreamer', #30
5714
5716
  32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
5715
5717
  32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
@@ -9069,13 +9071,23 @@ my %nikonFocalConversions = (
9069
9071
  },
9070
9072
  {
9071
9073
  Name => 'MenuSettingsOffsetZ9v4',
9072
- Notes => 'Firmware versions 4.0 and later',
9074
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} lt "05.01"',
9075
+ Notes => 'Firmware versions 4.x and 5.0',
9073
9076
  Format => 'int32u',
9074
9077
  SubDirectory => {
9075
9078
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9v4',
9076
9079
  Start => '$dirStart + $val',
9077
9080
  },
9078
9081
  },
9082
+ {
9083
+ Name => 'MenuSettingsOffsetZ9v4',
9084
+ Notes => 'Firmware versions 4.x and 5.0',
9085
+ Format => 'int32u',
9086
+ SubDirectory => {
9087
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9v5',
9088
+ Start => '$dirStart + $val',
9089
+ },
9090
+ },
9079
9091
  ],
9080
9092
  );
9081
9093
 
@@ -10583,12 +10595,13 @@ my %nikonFocalConversions = (
10583
10595
  #1936 FocusPointDisplayOption3DTrackingColor CSa11-d 0=> 'White', 1= => 'Red'
10584
10596
  );
10585
10597
 
10598
+ # firmware version 4.x menu settings (ref 28)
10586
10599
  %Image::ExifTool::Nikon::MenuSettingsZ9v4 = (
10587
10600
  %binaryDataAttrs,
10588
10601
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
10589
10602
  DATAMEMBER => [ 154, 204, 208, 248, 328, 444, 548, 554, 570, 596 ],
10590
10603
  IS_SUBDIR => [ 847 ],
10591
- NOTES => 'These tags are used by the Z9 firmware 4.0.0 and 4.1.0',
10604
+ NOTES => 'These tags are used by the Z9 firmware 4.0.0 and 4.1.0.',
10592
10605
  72 => {
10593
10606
  Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
10594
10607
  PrintConv => \%highFrameRateZ9,
@@ -10894,6 +10907,318 @@ my %nikonFocalConversions = (
10894
10907
  2072 => { Name => 'FlashModeButtonPlaybackMode', %buttonsZ9}, #CSf2
10895
10908
  );
10896
10909
 
10910
+ # menu settings for the Z9 with firmware version 5.1 (ref 28)
10911
+ %Image::ExifTool::Nikon::MenuSettingsZ9v5 = (
10912
+ %binaryDataAttrs,
10913
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
10914
+ DATAMEMBER => [ 158, 208, 212, 252, 332, 448, 552, 558, 574, 600 ],
10915
+ IS_SUBDIR => [ 851 ],
10916
+ NOTES => 'These tags are used by the Z9 firmware 5.1.',
10917
+ 72 => {
10918
+ Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
10919
+ PrintConv => \%highFrameRateZ9,
10920
+ },
10921
+ 158 => {
10922
+ Name => 'MultipleExposureMode',
10923
+ RawConv => '$$self{MultipleExposureMode} = $val',
10924
+ PrintConv => \%multipleExposureModeZ9,
10925
+ },
10926
+ 160 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
10927
+ 208 => {
10928
+ Name => 'Intervals',
10929
+ Format => 'int32u',
10930
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
10931
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0', #not valid for C30/C60/C120
10932
+ },
10933
+ 212 => {
10934
+ Name => 'ShotsPerInterval',
10935
+ Format => 'int32u',
10936
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
10937
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0', #not valid for C30/C60/C120
10938
+ },
10939
+ 252 => {
10940
+ Name => 'FocusShiftNumberShots', #1-300
10941
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
10942
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
10943
+ },
10944
+ 256 => {
10945
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
10946
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
10947
+ },
10948
+ 260 => {
10949
+ Name => 'FocusShiftInterval',
10950
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
10951
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
10952
+ },
10953
+ 264 => {
10954
+ Name => 'FocusShiftExposureLock',
10955
+ Unknown => 1,
10956
+ PrintConv => \%offOn,
10957
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
10958
+ },
10959
+ 294 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
10960
+ 296 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
10961
+ 332 => { Name => 'PhotoShootingMenuBankImageArea', RawConv => '$$self{ImageArea} = $val', PrintConv => \%imageAreaZ9 },
10962
+ #338 JPGCompression 0 => 'Size Priority', 1 => 'Optimal Quality',
10963
+ 346 => { Name => 'AutoISO', PrintConv => \%offOn },
10964
+ 348 => {
10965
+ Name => 'ISOAutoHiLimit',
10966
+ Format => 'int16u',
10967
+ Unknown => 1,
10968
+ ValueConv => '($val-104)/8',
10969
+ ValueConvInv => '8 * ($val + 104)',
10970
+ PrintConv => \%iSOAutoHiLimitZ7,
10971
+ },
10972
+ 350 => {
10973
+ Name => 'ISOAutoFlashLimit',
10974
+ Format => 'int16u',
10975
+ Unknown => 1,
10976
+ ValueConv => '($val-104)/8',
10977
+ ValueConvInv => '8 * ($val + 104)',
10978
+ PrintConv => \%iSOAutoHiLimitZ7,
10979
+ },
10980
+ 358 => {
10981
+ Name => 'ISOAutoShutterTime', # shutter speed is 2 ** (-$val/24)
10982
+ ValueConv => '$val / 8',
10983
+ Format => 'int16s',
10984
+ PrintConv => \%iSOAutoShutterTimeZ9,
10985
+ },
10986
+ 440 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
10987
+ 442 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, # value can be set from both the Photo Shoot Menu and the Video Shooting Menu
10988
+ 444 => { Name => 'FlickerReductionShooting',PrintConv => \%offOn },
10989
+ 448 => {
10990
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
10991
+ RawConv => '$$self{FlashControlMode} = $val',
10992
+ PrintConv => \%flashControlModeZ7,
10993
+ },
10994
+ 450 => {
10995
+ Name => 'FlashMasterCompensation',
10996
+ Format => 'int8s',
10997
+ Unknown => 1,
10998
+ ValueConv => '$val/6',
10999
+ ValueConvInv => '6 * $val',
11000
+ PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
11001
+ PrintConvInv => '$val',
11002
+ },
11003
+ 454 => {
11004
+ Name => 'FlashGNDistance',
11005
+ Condition => '$$self{FlashControlMode} == 2',
11006
+ Unknown => 1,
11007
+ ValueConv => '$val + 3',
11008
+ PrintConv => \%flashGNDistance,
11009
+ },
11010
+ 458 => {
11011
+ 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)
11012
+ Condition => '$$self{FlashControlMode} >= 3',
11013
+ Unknown => 1,
11014
+ ValueConv => '2 ** (-$val/3)',
11015
+ ValueConvInv => '$val>0 ? -3*log($val)/log(2) : 0',
11016
+ PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
11017
+ PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
11018
+ },
11019
+ #466 flash wireless control 0=> 'Off' 1=> 'Optical AWL'
11020
+ #468 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1 },
11021
+ #480 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1 },
11022
+ 552 => { Name => 'AFAreaMode', RawConv => '$$self{AFAreaMode} = $val', PrintConv => \%aFAreaModeZ9},
11023
+ 554 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
11024
+ 558 => {
11025
+ Name => 'BracketSet',
11026
+ RawConv => '$$self{BracketSet} = $val',
11027
+ PrintConv => \%bracketSetZ9,
11028
+ },
11029
+ 560 => {
11030
+ Name => 'BracketProgram',
11031
+ Condition => '$$self{BracketSet} < 3',
11032
+ Notes => 'AE and/or Flash Bracketing',
11033
+ PrintConv => \%bracketProgramZ9,
11034
+ },
11035
+ 562 => {
11036
+ Name => 'BracketIncrement',
11037
+ Condition => '$$self{BracketSet} < 3',
11038
+ Notes => 'AE and/or Flash Bracketing',
11039
+ PrintConv => \%bracketIncrementZ9,
11040
+ },
11041
+ 574 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 },
11042
+ 580 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
11043
+ 586 => { Name => 'HDRLevel', Condition => '$$self{HDR} ne 0', PrintConv => \%hdrLevelZ8 },
11044
+ 590 => { Name => 'Slot2JpgSize', PrintConv => { 0 => 'Large (8256x5504)', 1 => 'Medium (6192x4128)', 2 => 'Small (4128x2752)' }, Unknown => 1},
11045
+ 596 => { Name => 'DXCropAlert', PrintConv => \%offOn },
11046
+ 598 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
11047
+ 600 => {
11048
+ Name => 'DynamicAFAreaSize',
11049
+ Condition => '$$self{AFAreaMode} == 2',
11050
+ RawConv => '$$self{DynamicAFAreaSize} = $val',
11051
+ PrintConv => \%dynamicAfAreaModesZ9,
11052
+ },
11053
+ 640 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
11054
+ 650 => {
11055
+ Name => 'MovieImageArea',
11056
+ Unknown => 1,
11057
+ Mask => 0x01, # without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
11058
+ PrintConv => \%imageAreaZ9b,
11059
+ },
11060
+ 660 => { Name => 'MovieType', PrintConv => \%movieTypeZ9, Unknown => 1 },
11061
+ 662 => {
11062
+ Name => 'MovieISOAutoHiLimit',
11063
+ Format => 'int16u',
11064
+ Unknown => 1,
11065
+ ValueConv => '($val-104)/8',
11066
+ ValueConvInv => '8 * ($val + 104)',
11067
+ PrintConv => \%iSOAutoHiLimitZ7,
11068
+ },
11069
+ 664 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1 },
11070
+ 666 => {
11071
+ Name => 'MovieISOAutoManualMode',
11072
+ Format => 'int16u',
11073
+ Unknown => 1,
11074
+ ValueConv => '($val-104)/8',
11075
+ ValueConvInv => '8 * ($val + 104)',
11076
+ PrintConv => \%iSOAutoHiLimitZ7,
11077
+ },
11078
+ 740 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
11079
+ 742 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
11080
+ 748 => { Name => 'MovieFlickerReduction', PrintConv => \%movieFlickerReductionZ9 },
11081
+ 750 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, Unknown => 1 },
11082
+ 752 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
11083
+ 754 => { Name => 'MovieAFAreaMode', PrintConv => \%aFAreaModeZ9 },
11084
+ 756 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1 },
11085
+ 760 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
11086
+ 762 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'Auto', 2 => 'Manual' }, Unknown => 1 },
11087
+ 764 => { Name => 'MicrophoneSensitivity', Unknown => 1 }, # 1-20
11088
+ 766 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
11089
+ 768 => { Name => 'MicrophoneFrequencyResponse',PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
11090
+ 770 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
11091
+ 792 => { Name => 'MovieToneMap', PrintConv => \%movieToneMapZ9, Unknown => 1 },
11092
+ 798 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
11093
+ 800 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
11094
+ 806 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
11095
+ 807 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
11096
+ 808 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1 },
11097
+ 816 => { Name => 'MovieHighResZoom', PrintConv => \%offOn, Unknown => 1 },
11098
+ 851 => {
11099
+ Name => 'CustomSettingsZ9v4',
11100
+ Format => 'undef[632]',
11101
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ9v4' },
11102
+ },
11103
+ 1502 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
11104
+ 1504 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
11105
+ 1510 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
11106
+ 1532 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
11107
+ 1536 => { Name => 'NonCPULens1FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1}, #should probably hide altogther if $val is 0
11108
+ 1540 => { Name => 'NonCPULens2FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11109
+ 1542 => { Name => 'NonCPULens3FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11110
+ 1548 => { Name => 'NonCPULens4FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11111
+ 1552 => { Name => 'NonCPULens5FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11112
+ 1556 => { Name => 'NonCPULens6FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11113
+ 1560 => { Name => 'NonCPULens7FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11114
+ 1564 => { Name => 'NonCPULens8FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11115
+ 1568 => { Name => 'NonCPULens9FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11116
+ 1572 => { Name => 'NonCPULens10FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11117
+ 1576 => { Name => 'NonCPULens11FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11118
+ 1580 => { Name => 'NonCPULens12FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11119
+ 1584 => { Name => 'NonCPULens13FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11120
+ 1588 => { Name => 'NonCPULens14FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11121
+ 1592 => { Name => 'NonCPULens15FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11122
+ 1596 => { Name => 'NonCPULens16FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11123
+ 1600 => { Name => 'NonCPULens17FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11124
+ 1604 => { Name => 'NonCPULens18FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11125
+ 1608 => { Name => 'NonCPULens19FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11126
+ 1612 => { Name => 'NonCPULens20FocalLength', Format => 'int16s', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
11127
+ 1616 => { Name => 'NonCPULens1MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1}, #non-CPU aperture interface, values and storage differ from the Z8
11128
+ 1620 => { Name => 'NonCPULens2MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11129
+ 1624 => { Name => 'NonCPULens3MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11130
+ 1628 => { Name => 'NonCPULens4MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11131
+ 1632 => { Name => 'NonCPULens5MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11132
+ 1636 => { Name => 'NonCPULens6MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11133
+ 1640 => { Name => 'NonCPULens7MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11134
+ 1644 => { Name => 'NonCPULens8MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11135
+ 1648 => { Name => 'NonCPULens9MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11136
+ 1652 => { Name => 'NonCPULens10MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11137
+ 1656 => { Name => 'NonCPULens11MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11138
+ 1660 => { Name => 'NonCPULens12MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11139
+ 1664 => { Name => 'NonCPULens13MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11140
+ 1668 => { Name => 'NonCPULens14MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11141
+ 1672 => { Name => 'NonCPULens15MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11142
+ 1676 => { Name => 'NonCPULens16MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11143
+ 1680 => { Name => 'NonCPULens17MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11144
+ 1684 => { Name => 'NonCPULens18MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11145
+ 1688 => { Name => 'NonCPULens19MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11146
+ 1692 => { Name => 'NonCPULens20MaxAperture', Format => 'int16s', PrintConv => 'sprintf("f/%.1f",$val/100)', Unknown => 1},
11147
+ 1708 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
11148
+ 1721 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
11149
+ 1728 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
11150
+ 1729 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
11151
+ 1764 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
11152
+ 1788 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
11153
+ 1792 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
11154
+ 1801 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
11155
+ 1866 => {
11156
+ Name => 'AutoCapturePreset',
11157
+ PrintConv => {
11158
+ 0 => '1',
11159
+ 1 => '2',
11160
+ 2 => '3',
11161
+ 3 => '4',
11162
+ 4 => '5',
11163
+ },
11164
+ },
11165
+ 1868 => {
11166
+ Name => 'FocusShiftAutoReset',
11167
+ Unknown => 1,
11168
+ PrintConv => \%offOn,
11169
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
11170
+ },
11171
+ 1926 => { #CSd4-a
11172
+ Name => 'PreReleaseBurstLength',
11173
+ PrintConv => {
11174
+ 0 => 'None',
11175
+ 1 => '0.3 Sec',
11176
+ 2 => '0.5 Sec',
11177
+ 3 => '1 Sec',
11178
+ },
11179
+ },
11180
+ 1928 => { #CSd4-b
11181
+ Name => 'PostReleaseBurstLength',
11182
+ PrintConv => {
11183
+ 0 => '1 Sec',
11184
+ 1 => '2 Sec',
11185
+ 2 => '3 Sec',
11186
+ 3 => 'Max',
11187
+ },
11188
+ },
11189
+ 1942 => { Name => 'VerticalISOButton', %buttonsZ9}, #CSf2
11190
+ 1944 => { Name => 'ExposureCompensationButton', %buttonsZ9}, #CSf2
11191
+ 1946 => { Name => 'ISOButton', %buttonsZ9}, #CSf2
11192
+ 2006 => { Name => 'ViewModeShowEffectsOfSettings', PrintConv => { 0=>'Always', 1=> 'Only When Flash Not Used'}, Unknown => 1 }, #CSd9-a
11193
+ 2008 => { Name => 'DispButton', %buttonsZ9}, #CSf2
11194
+ 2052 => { #CSd6
11195
+ Name => 'ExposureDelay',
11196
+ Format => 'fixed32u',
11197
+ PrintConv => '$val ? sprintf("%.1f sec",$val/1000) : "Off"',
11198
+ },
11199
+ 2056 => { #CSf2-m3
11200
+ Name => 'CommandDialFrameAdvanceZoom',
11201
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
11202
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
11203
+ Unknown => 1
11204
+ },
11205
+ 2058 => { #CSf2-n3
11206
+ Name => 'SubCommandDialFrameAdvanceZoom',
11207
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
11208
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
11209
+ Unknown => 1
11210
+ },
11211
+ 2060 => { Name => 'PlaybackButton', %buttonsZ9}, #CSf2
11212
+ 2062 => { Name => 'WBButton', %buttonsZ9}, #CSf2
11213
+ 2064 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
11214
+ 2066 => { Name => 'FlashModeButton', %buttonsZ9}, #CSf2
11215
+ 2068 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ9}, #CSf2
11216
+ 2070 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ9}, #CSf2
11217
+ 2072 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ9}, #CSf2
11218
+ 2074 => { Name => 'BracketButtonPlaybackMode', %buttonsZ9}, #CSf2
11219
+ 2076 => { Name => 'FlashModeButtonPlaybackMode', %buttonsZ9}, #CSf2
11220
+ );
11221
+
10897
11222
  # Flash information (ref JD)
10898
11223
  %Image::ExifTool::Nikon::FlashInfo0100 = (
10899
11224
  %binaryDataAttrs,
@@ -12229,7 +12554,6 @@ my %nikonFocalConversions = (
12229
12554
  3 => 'On (Required)',
12230
12555
  },
12231
12556
  },
12232
- #0x10 Degree of radial distortion correction polynomial? (always 4? - decodes for the first 3 coefficients follow, the 4th at 0x2c/0x30 seems to always be 0)
12233
12557
  0x14 => {
12234
12558
  Name => 'RadialDistortionCoefficient1',
12235
12559
  Format => 'rational64s',
@@ -112,7 +112,7 @@ $VERSION = '1.26';
112
112
  113 => 'Power Zoom +',
113
113
  114 => 'Power Zoom -',
114
114
  115 => 'Delete',
115
- 116 => 'Pixel Shift Shooting',
115
+ 116 => 'Pixel Shift Shooting', #Z8 (Z9 fw 5.1 maps as 'Save and Load Power Zoom Position')
116
116
  117 => 'Cycle AF-area Mode',
117
117
  118 => 'Raw Processing (Current)', #118-131 are Playback Retouch options
118
118
  119 => 'Raw Processing (Multiple)',
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.23';
40
+ $VERSION = '2.24';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -1464,6 +1464,12 @@ my %shootingMode = (
1464
1464
  5 => 'Animal Eye/Body',
1465
1465
  6 => 'Car',
1466
1466
  7 => 'Motorcycle',
1467
+ 8 => 'Car (main part priority)',
1468
+ 9 => 'Motorcycle (helmet priority)',
1469
+ 10 => 'Train',
1470
+ 11 => 'Train (main part priority)',
1471
+ 12 => 'Airplane',
1472
+ 13 => 'Airplane (nose priority)',
1467
1473
  }
1468
1474
  },
1469
1475
  0xee => { #PH (DC-GH6)
@@ -5,8 +5,9 @@
5
5
  #
6
6
  # Revisions: 2024-12-04 - P. Harvey Created
7
7
  #
8
- # Notes: Tag definitions for Protobuf tags support additional 'signed'
9
- # and 'unsigned' formats for varInt (type 0) values
8
+ # Notes: Tag definitions for Protobuf tags support additional 'signed',
9
+ # 'unsigned' and 'int64s' formats for varInt (type 0) values,
10
+ # and 'rational' for byte (type 2) values
10
11
  #
11
12
  # References: 1) https://protobuf.dev/programming-guides/encoding/
12
13
  #------------------------------------------------------------------------------
@@ -17,13 +18,13 @@ use strict;
17
18
  use vars qw($VERSION);
18
19
  use Image::ExifTool qw(:DataAccess :Utils);
19
20
 
20
- $VERSION = '1.01';
21
+ $VERSION = '1.02';
21
22
 
22
23
  sub ProcessProtobuf($$$;$);
23
24
 
24
25
  #------------------------------------------------------------------------------
25
26
  # Read bytes from dirInfo object
26
- # Inputs: 0) dirInfo ref, 1) number of bytes
27
+ # Inputs: 0) dirInfo ref (with DataPt and Pos set), 1) number of bytes
27
28
  # Returns: binary data or undef on error
28
29
  sub GetBytes($$)
29
30
  {
@@ -162,14 +163,31 @@ sub ProcessProtobuf($$$;$)
162
163
  if ($$tagInfo{Format}) {
163
164
  if ($type == 0) {
164
165
  $val = $buff;
165
- $val = ($val & 1) ? -($val >> 1)-1 : ($val >> 1) if $$tagInfo{Format} eq 'signed';
166
+ if ($$tagInfo{Format} eq 'signed') {
167
+ $val = ($val & 1) ? -($val >> 1)-1 : ($val >> 1);
168
+ } elsif ($$tagInfo{Format} eq 'int64s' and $val > 0xffffffff) {
169
+ # hack for DJI drones which store 64-bit signed integers improperly
170
+ # (just toss upper 32 bits which should be all 1's anyway)
171
+ $val = ($val & 0xffffffff) - 4294967296;
172
+ }
173
+ } elsif ($type == 2 and $$tagInfo{Format} eq 'rational') {
174
+ my $dir = { DataPt => \$buff, Pos => 0 };
175
+ my $num = VarInt($dir);
176
+ my $den = VarInt($dir);
177
+ $val = (defined $num and $den) ? "$num/$den" : 'err';
166
178
  } else {
167
179
  $val = ReadValue(\$buff, 0, $$tagInfo{Format}, undef, length($buff));
168
180
  }
169
181
  } elsif ($type == 0) {
170
182
  $val = $buff;
171
- my $signed = ($val & 1) ? -($val >> 1)-1 : ($val >> 1);
172
- $val .= sprintf(" (0x%x, signed $signed)", $val);
183
+ my $hex = sprintf('%x', $val);
184
+ if (length($hex) == 16 and $hex =~ /^ffffffff/) {
185
+ my $s64 = hex(substr($hex, 8)) - 4294967296;
186
+ $val .= " (0x$hex, int64s $s64)";
187
+ } else {
188
+ my $signed = ($val & 1) ? -($val >> 1)-1 : ($val >> 1);
189
+ $val .= " (0x$hex, signed $signed)";
190
+ }
173
191
  } elsif ($type == 1) {
174
192
  $val = '0x' . unpack('H*', $buff) . ' (double ' . GetDouble(\$buff,0) . ')';
175
193
  } elsif ($type == 2) {