exiftool_vendored 12.50.0 → 12.52.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,68 +15,87 @@ package Image::ExifTool::NikonCustom;
15
15
  use strict;
16
16
  use vars qw($VERSION);
17
17
 
18
- $VERSION = '1.20';
18
+ $VERSION = '1.22';
19
19
 
20
20
  my %buttonsZ9= (
21
- 0 => 'None',
22
- 1 => 'Preview',
23
- 3 => 'FV Lock',
24
- 4 => 'AE/AF Lock',
25
- 5 => 'AE Lock Only',
26
- 6 => 'AE Lock (reset on release)',
27
- 7 => 'AE Lock (hold)',
28
- 8 => 'AF Lock Only',
29
- 9 => 'AF-On',
30
- 10 => 'Flash Disable/Enable',
31
- 11 => 'Bracketing Burst',
32
- 12 => '+NEF(RAW)',
33
- 18 => 'Virtual Horizon',
34
- 19 => 'Synchronized Release',
35
- 20 => 'My Menu',
36
- 21 => 'My Menu Top Item',
37
- 22 => 'Playback',
38
- 23 => 'Rating',
39
- 24 => 'Protect',
40
- 25 => 'Zoom',
41
- 26 => 'Focus Peaking',
42
- 28 => 'Image Area',
43
- 30 => 'Non-CPU Lens',
44
- 31 => 'Active-D Lighting',
45
- 33 => '1 Stop Speed/Aperture',
46
- 35 => 'Metering',
47
- 36 => 'Auto Bracketing',
48
- 37 => 'Multiple Exposure',
49
- 38 => 'HDR Overlay',
50
- 39 => 'Picture Control',
51
- 40 => 'Quality',
52
- 41 => 'Focus Mode/AF AreaMode',
53
- 42 => 'Select Center Focus Point',
54
- 44 => 'Record Movie',
55
- 47 => 'Choose Folder',
56
- 48 => 'Power Aperture (Open)',
57
- 49 => 'Power Aperture (Close)',
58
- 52 => 'Microphone Sensitivity',
59
- 57 => 'Preset Focus Point',
60
- 58 => 'AE/AWB Lock (hold)',
61
- 59 => 'AF-AreaMode',
62
- 60 => 'AF-AreaMode + AF-On',
63
- 61 => 'Recall Shooting Functions',
64
- 64 => 'Filtered Playback',
65
- 65 => 'Same as AF-On',
66
- 66 => 'Voice Memo',
67
- 70 => 'Photo Shooting Bank',
68
- 73 => 'Exposure Compensation',
69
- 76 => 'Silent Mode',
70
- 78 => 'LiveView Information',
71
- 79 => 'AWB Lock (hold)',
72
- 80 => 'Grid Display',
73
- 81 => 'Starlight View',
74
- 82 => 'Select To Send (PC)',
75
- 83 => 'Select To Send (FTP)',
76
- 85 => 'Control Lock',
77
- 86 => 'Save Focus Position',
78
- 87 => 'Recall Focus Position',
79
- 88 => 'Recall Shooting Functions (Hold)',
21
+ SeparateTable => 'ButtonsZ9',
22
+ PrintConv => {
23
+ 0 => 'None',
24
+ 1 => 'Preview',
25
+ 3 => 'FV Lock',
26
+ 4 => 'AE/AF Lock',
27
+ 5 => 'AE Lock Only',
28
+ 6 => 'AE Lock (reset on release)',
29
+ 7 => 'AE Lock (hold)',
30
+ 8 => 'AF Lock Only',
31
+ 9 => 'AF-On',
32
+ 10 => 'Flash Disable/Enable',
33
+ 11 => 'Bracketing Burst',
34
+ 12 => '+NEF(RAW)',
35
+ 18 => 'Virtual Horizon',
36
+ 19 => 'Synchronized Release',
37
+ 20 => 'My Menu',
38
+ 21 => 'My Menu Top Item',
39
+ 22 => 'Playback',
40
+ 23 => 'Rating',
41
+ 24 => 'Protect',
42
+ 25 => 'Zoom',
43
+ 26 => 'Focus Peaking',
44
+ 28 => 'Image Area',
45
+ 30 => 'Non-CPU Lens',
46
+ 31 => 'Active-D Lighting',
47
+ 33 => '1 Stop Speed/Aperture',
48
+ 34 => 'White Balance',
49
+ 35 => 'Metering',
50
+ 36 => 'Auto Bracketing',
51
+ 37 => 'Multiple Exposure',
52
+ 38 => 'HDR Overlay',
53
+ 39 => 'Picture Control',
54
+ 40 => 'Quality',
55
+ 41 => 'Focus Mode/AF AreaMode',
56
+ 42 => 'Select Center Focus Point',
57
+ 44 => 'Record Movie',
58
+ 47 => 'Choose Folder',
59
+ 48 => 'Power Aperture (Open)',
60
+ 49 => 'Power Aperture (Close)',
61
+ 52 => 'Microphone Sensitivity',
62
+ 57 => 'Preset Focus Point',
63
+ 58 => 'AE/AWB Lock (hold)',
64
+ 59 => 'AF-AreaMode',
65
+ 60 => 'AF-AreaMode + AF-On',
66
+ 61 => 'Recall Shooting Functions',
67
+ 64 => 'Filtered Playback',
68
+ 65 => 'Same as AF-On',
69
+ 66 => 'Voice Memo',
70
+ 70 => 'Photo Shooting Bank',
71
+ 71 => 'ISO',
72
+ 73 => 'Exposure Compensation',
73
+ 76 => 'Silent Mode',
74
+ 78 => 'LiveView Information',
75
+ 79 => 'AWB Lock (hold)',
76
+ 80 => 'Grid Display',
77
+ 81 => 'Starlight View',
78
+ 82 => 'Select To Send (PC)',
79
+ 83 => 'Select To Send (FTP)',
80
+ 84 => 'Pattern Tone Range',
81
+ 85 => 'Control Lock',
82
+ 86 => 'Save Focus Position',
83
+ 87 => 'Recall Focus Position',
84
+ 88 => 'Recall Shooting Functions (Hold)',
85
+ 97 => 'High Frequency Flicker Reduction',
86
+ 98 => 'Switch FX/DX',
87
+ 99 => 'View Mode (Photo LV)',
88
+ 100 => 'Photo Flicker Reduction',
89
+ 101 => 'Filtered Playback (Select Criteria)',
90
+ 103 => 'Start Series Playback',
91
+ 104 => 'View Assist',
92
+ 105 => 'Hi-Res Zoom+',
93
+ 106 => 'Hi-Res Zoom-',
94
+ 108 => 'Override Other Cameras',
95
+ 109 => 'DISP - Cycle Information Display (shooting)', # Shooting Mode
96
+ 110 => 'DISP - Cycle Information Display (playback)', # Playback mode
97
+ 111 => 'Resume Shooting',
98
+ },
80
99
  );
81
100
  my %dialsZ9 = (
82
101
  0 => '1 Frame',
@@ -116,16 +135,19 @@ my %focusModeRestrictionsZ9 = (
116
135
  4 => 'No Restrictions',
117
136
  );
118
137
  my %powerOffDelayTimesZ9 = (
119
- 0 => '2 s',
120
- 1 => '4 s',
121
- 3 => '10 s',
122
- 4 => '20 s',
123
- 5 => '30 s',
124
- 6 => '1 min',
125
- 7 => '5 min',
126
- 8 => '10 min',
127
- 11 => '30 min',
128
- 12 => 'No Limit',
138
+ SeparateTable => 'DelaysZ9',
139
+ PrintConv => {
140
+ 0 => '2 s',
141
+ 1 => '4 s',
142
+ 3 => '10 s',
143
+ 4 => '20 s',
144
+ 5 => '30 s',
145
+ 6 => '1 min',
146
+ 7 => '5 min',
147
+ 8 => '10 min',
148
+ 11 => '30 min',
149
+ 12 => 'No Limit',
150
+ },
129
151
  );
130
152
  my %thirdHalfFull = (
131
153
  0 => '1/3 EV',
@@ -9767,10 +9789,10 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9767
9789
  3 => '3 s',
9768
9790
  },
9769
9791
  },
9770
- 51 => { Name => 'PlaybackMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-a
9771
- 53 => { Name => 'MenuMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-b
9772
- 55 => { Name => 'ShootingInfoMonitorOffTime',PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-c
9773
- 57 => { Name => 'ImageReviewMonitorOffTime', PrintConv => \%powerOffDelayTimesZ9 }, # CSc4-d
9792
+ 51 => { Name => 'PlaybackMonitorOffTime', %powerOffDelayTimesZ9 }, # CSc4-a
9793
+ 53 => { Name => 'MenuMonitorOffTime', %powerOffDelayTimesZ9 }, # CSc4-b
9794
+ 55 => { Name => 'ShootingInfoMonitorOffTime',%powerOffDelayTimesZ9 }, # CSc4-c
9795
+ 57 => { Name => 'ImageReviewMonitorOffTime', %powerOffDelayTimesZ9 }, # CSc4-d
9774
9796
  59 => { Name => 'CLModeShootingSpeed', ValueConv => '$val + 1', ValueConvInv => '$val - 1', PrintConv => '"$val fps"', PrintConvInv => '$val=~s/\s*fps//i; $val' }, # CSd1b
9775
9797
  61 => { # CSd2 # values: 1-200 & 'No Limit'
9776
9798
  Name => 'MaxContinuousRelease',
@@ -9848,25 +9870,25 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9848
9870
  },
9849
9871
  },
9850
9872
  97 => { Name => 'AutoBracketOrder', PrintConv => { 0 => '0,-,+',1 => '-,0,+' } }, # CSe7
9851
- 99 => { Name => 'Func1Button', PrintConv => \%buttonsZ9}, # CSf2-a
9873
+ 99 => { Name => 'Func1Button', %buttonsZ9}, # CSf2-a
9852
9874
  #101 Func1Button submenu: Preview 0 => 'Press To Recall', 1=> 'Hold To Recall' # CSf2-a
9853
9875
  #103 Func1Button submenu: AreaMode 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-a
9854
9876
  #105 Func1Button submenu: AreaMode+AF-On 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-a
9855
9877
  #109 Func1Button submenu: SynchronizedRelease 1=>'Master', 2=>'Remote' # CSf2-a
9856
9878
  #111 Func1Button submenu: Zoom 0=>'Zoom (Low)', 2=>'Zoom (1:1)', 2=>'Zoom (High)' # CSf2-a
9857
9879
  #113 Func1Button & Func1ButtonPlayback submenu: Rating # CSf2-a & CSf3a 0=>'Candidate For Deletion' 6=>''None'
9858
- 115 => { Name => 'Func2Button', PrintConv => \%buttonsZ9}, # CSf2-b
9880
+ 115 => { Name => 'Func2Button', %buttonsZ9}, # CSf2-b
9859
9881
  #117 Func2Button submenu: Preview 0 => 'Press To Recall', 1=> 'Hold To Recall' # CSf2-b
9860
9882
  #119 Func2Button submenu: AreaMode 0-7 => S, Dyn-S, Dyn-M, Dyn-L, Wide-S, Wide-L, 3D, Auto; 11=>n/a # CSf2-b
9861
9883
  #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
9862
9884
  #125 Func2Button submenu: SynchronizedRelease 1=>'Master', 2=>'Remote' # CSf2-b
9863
9885
  #127 Func2Button submenu: Zoom 0=>'Zoom (Low)', 2=>'Zoom (1:1)', 2=>'Zoom (High)' # CSf2-b
9864
9886
  #129 Func2Button & Func2ButtonPlayback submenu: Rating # CSf2-b & CSf3b 0=>'Candidate For Deletion' 6=>''None'
9865
- 131 => { Name => 'AFOnButton', PrintConv => \%buttonsZ9}, # CSf2-c
9866
- 143 => { Name => 'SubSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-g
9867
- 155 => { Name => 'AssignMovieRecordButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-m
9868
- 159 => { Name => 'LensFunc1Button', PrintConv => \%buttonsZ9}, # CSf2-o
9869
- 167 => { Name => 'LensFunc2Button', PrintConv => \%buttonsZ9}, # CSf2-p
9887
+ 131 => { Name => 'AFOnButton', %buttonsZ9}, # CSf2-c
9888
+ 143 => { Name => 'SubSelector', %buttonsZ9, Unknown => 1}, # CSf2-g
9889
+ 155 => { Name => 'AssignMovieRecordButton', %buttonsZ9, Unknown => 1}, # CSf2-m
9890
+ 159 => { Name => 'LensFunc1Button', %buttonsZ9}, # CSf2-o
9891
+ 167 => { Name => 'LensFunc2Button', %buttonsZ9}, # CSf2-p
9870
9892
  173 => { # CSf2-q
9871
9893
  Name => 'LensControlRing',
9872
9894
  PrintConv => {
@@ -9877,8 +9899,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9877
9899
  4 => 'Aperture',
9878
9900
  },
9879
9901
  },
9880
- 175 => { Name => 'MultiSelectorShootMode', PrintConv => \%buttonsZ9}, # CSf2-h called the OK button in camera, tag name retained for compatibility
9881
- 179 => { Name => 'MultiSelectorPlaybackMode', PrintConv => \%buttonsZ9}, # CSf3f
9902
+ 175 => { Name => 'MultiSelectorShootMode', %buttonsZ9}, # CSf2-h called the OK button in camera, tag name retained for compatibility
9903
+ 179 => { Name => 'MultiSelectorPlaybackMode', %buttonsZ9}, # CSf3f
9882
9904
  183 => { Name => 'ShutterSpeedLock', PrintConv => \%offOn }, # CSf4-a
9883
9905
  184 => { Name => 'ApertureLock', PrintConv => \%offOn }, # CSf4-b
9884
9906
  185 => { # CSf5-a Previous cameras reported this tag as part of CmdDialsReverseRotation. Blend with CSf5-b separate settings together to match extant tag name and values
@@ -9902,9 +9924,20 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9902
9924
  }],
9903
9925
  191 => { Name => 'UseDialWithoutHold', PrintConv => \%offOn, Unknown => 1 }, # CSf6
9904
9926
  193 => { Name => 'ReverseIndicators', PrintConv => { 0 => '+ 0 -', 1 => '- 0 +' }, Unknown => 1 }, # CSf7
9905
- 195 => { Name => 'MovieFunc1Button', PrintConv => \%buttonsZ9}, # CSg2-a
9906
- 203 => { Name => 'MovieAF-OnButton', PrintConv => \%buttonsZ9}, # CSg2-f
9907
- 217 => { Name => 'MovieMultiSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-h
9927
+ 195 => { Name => 'MovieFunc1Button', %buttonsZ9}, # CSg2-a
9928
+ 199 => { Name => 'MovieFunc2Button', %buttonsZ9}, # CSg2-b
9929
+ 203 => { Name => 'MovieAF-OnButton', %buttonsZ9}, # CSg2-f
9930
+ 215 => { # CSg2-z
9931
+ Name => 'MovieLensControlRing',
9932
+ PrintConv => {
9933
+ 0 => 'None (Disabled)',
9934
+ 2 => 'ISO Sensitivity',
9935
+ 3 => 'Exposure Compensation',
9936
+ 4 => 'Power Aperture',
9937
+ 5 => 'Hi-Res Zoom',
9938
+ },
9939
+ },
9940
+ 217 => { Name => 'MovieMultiSelector', %buttonsZ9, Unknown => 1}, # CSg2-h
9908
9941
  221 => { Name => 'MovieAFSpeed', ValueConv => '$val - 5', ValueConvInv => '$val + 6' }, # CSg6-a
9909
9942
  223 => { Name => 'MovieAFSpeedApply', rintConv => {0 => 'Always', 1 => 'Only During Recording'},}, # CSg6-b
9910
9943
  225 => { # CSg7
@@ -9931,11 +9964,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9931
9964
  269.4 => { Name => 'LimitReleaseModeSelC120', Mask => 0x40, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-c
9932
9965
  269.5 => { Name => 'LimitReleaseModeSelSelf', Mask => 0x80, PrintConv => \%limitNolimit, Unknown => 1 }, # CSd3-d
9933
9966
  273 => { Name => 'FlashBurstPriority', PrintConv => { 0 => 'Frame Rate',1 => 'Exposure'}, Unknown => 1 }, # CSe8
9934
- 277 => { Name => 'VerticalFuncButton', PrintConv => \%buttonsZ9}, # CSf2-c
9935
- 281 => { Name => 'Func3Button', PrintConv => \%buttonsZ9}, # CSf2-c
9936
- 285 => { Name => 'VerticalAFOnButton', PrintConv => \%buttonsZ9}, # CSf2-l
9967
+ 277 => { Name => 'VerticalFuncButton', %buttonsZ9}, # CSf2-c
9968
+ 281 => { Name => 'Func3Button', %buttonsZ9}, # CSf2-c
9969
+ 285 => { Name => 'VerticalAFOnButton', %buttonsZ9}, # CSf2-l
9937
9970
  293 => { Name => 'VerticalMultiSelectorPlaybackMode', PrintConv => { 0 => 'Image Scroll L/R', 1 => 'Image Scroll Up/Down' }, Unknown => 1}, # CSf3-j
9938
- 295 => { Name => 'MovieFunc3Button', PrintConv => \%buttonsZ9}, # CSg2-c
9971
+ 295 => { Name => 'MovieFunc3Button', %buttonsZ9}, # CSg2-c
9939
9972
  335 => { Name => 'LimitAF-AreaModeSelDynamic_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
9940
9973
  336 => { Name => 'LimitAF-AreaModeSelDynamic_M', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
9941
9974
  337 => { Name => 'LimitAF-AreaModeSelDynamic_L', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa8
@@ -9947,26 +9980,26 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9947
9980
  356 => { Name => 'EVFImageFrame', PrintConv => \%offOn, Unknown => 1 }, # CSd14
9948
9981
  357 => { Name => 'EVFGrid', PrintConv => \%evfGridsZ9, Unknown => 1 }, # CSd15
9949
9982
  359 => { Name => 'VirtualHorizonStyle', PrintConv => {0 => 'Type A (Cockpit)', 1 => 'Type B (Sides)' }, Unknown => 1}, #CSd16
9950
- 373 => { Name => 'Func4Button', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-e
9951
- 379 => { Name => 'AudioButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-i
9952
- 381 => { Name => 'QualityButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-j
9953
- 399 => { Name => 'VerticalMultiSelector', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf2-k
9954
- 421 => { Name => 'Func1ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-a
9955
- 423 => { Name => 'Func2ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-b
9956
- 425 => { Name => 'Func3ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-c
9957
- 431 => { Name => 'Func4ButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-e
9958
- 437 => { Name => 'MovieRecordButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-m
9959
- 439 => { Name => 'VerticalFuncButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-d
9960
- 441 => { Name => 'AudioButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-g
9961
- 447 => { Name => 'QualityButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-h
9983
+ 373 => { Name => 'Func4Button', %buttonsZ9, Unknown => 1}, # CSf2-e
9984
+ 379 => { Name => 'AudioButton', %buttonsZ9, Unknown => 1}, # CSf2-i
9985
+ 381 => { Name => 'QualityButton', %buttonsZ9, Unknown => 1}, # CSf2-j
9986
+ 399 => { Name => 'VerticalMultiSelector', %buttonsZ9, Unknown => 1}, # CSf2-k
9987
+ 421 => { Name => 'Func1ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-a
9988
+ 423 => { Name => 'Func2ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-b
9989
+ 425 => { Name => 'Func3ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-c
9990
+ 431 => { Name => 'Func4ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-e
9991
+ 437 => { Name => 'MovieRecordButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-m
9992
+ 439 => { Name => 'VerticalFuncButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-d
9993
+ 441 => { Name => 'AudioButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-g
9994
+ 447 => { Name => 'QualityButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-h
9962
9995
  467 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c
9963
- 453 => { Name => 'WhiteBalanceButtonPlaybackMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSf3-i
9996
+ 453 => { Name => 'WhiteBalanceButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-i
9964
9997
  459 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k
9965
9998
  463 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
9966
9999
  469 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10
9967
- 481 => { Name => 'VerticalMovieFuncButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-d
9968
- 505 => { Name => 'VerticalMovieAFOnButton', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-l
9969
- 515 => { Name => 'MovieAFAreaMode', PrintConv => \%buttonsZ9, Unknown => 1}, # CSg2-e
10000
+ 481 => { Name => 'VerticalMovieFuncButton', %buttonsZ9, Unknown => 1}, # CSg2-d
10001
+ 505 => { Name => 'VerticalMovieAFOnButton', %buttonsZ9, Unknown => 1}, # CSg2-l
10002
+ 515 => { Name => 'MovieAFAreaMode', %buttonsZ9, Unknown => 1}, # CSg2-e
9970
10003
  #521 => { Name => 'MovieLimitAF-AreaModeSelWideAF_S', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-a
9971
10004
  #522 => { Name => 'MovieLimitAF-AreaModeSelWideAF_W', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-b
9972
10005
  #523 => { Name => 'MovieLimitAF-AreaModeSelSubjectTrack', PrintConv => \%limitNolimit, Unknown => 1 }, # CSg4-c
@@ -115,6 +115,7 @@ my %olympusLensTypes = (
115
115
  '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
116
116
  '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB
117
117
  '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
118
+ '0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
118
119
  # Sigma lenses
119
120
  '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
120
121
  '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -1835,7 +1836,7 @@ my %indexInfo = (
1835
1836
  1 => 'Sequential shooting AF',
1836
1837
  2 => 'Continuous AF',
1837
1838
  3 => 'Multi AF',
1838
- 4 => 'Face detect', #11
1839
+ 4 => 'Face Detect', #11
1839
1840
  10 => 'MF',
1840
1841
  }, {
1841
1842
  0 => '(none)',
@@ -1843,7 +1844,7 @@ my %indexInfo = (
1843
1844
  0 => 'S-AF',
1844
1845
  2 => 'C-AF',
1845
1846
  4 => 'MF',
1846
- 5 => 'Face detect',
1847
+ 5 => 'Face Detect',
1847
1848
  6 => 'Imager AF',
1848
1849
  7 => 'Live View Magnification Frame',
1849
1850
  8 => 'AF sensor',
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.60';
39
+ $VERSION = '1.61';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -339,6 +339,11 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
339
339
  # int32u DividedHeight2
340
340
  # int32u IDAT_Offset2 [location of IDAT with start of DividedHeight2 segment]
341
341
  },
342
+ caBX => { # C2PA metadata
343
+ Name => 'JUMBF',
344
+ SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
345
+ },
346
+ # cICP - Coding-independent code points (added in 2022 specification)
342
347
  );
343
348
 
344
349
  # PNG IHDR chunk
@@ -536,6 +541,8 @@ my %unreg = ( Notes => 'unregistered' );
536
541
  Label => { %unreg },
537
542
  Make => { %unreg, Groups => { 2 => 'Camera' } },
538
543
  Model => { %unreg, Groups => { 2 => 'Camera' } },
544
+ # parameters (written by Stable Diffusion)
545
+ # aesthetic_score (written by Stable Diffusion)
539
546
  'create-date'=> {
540
547
  Name => 'CreateDate',
541
548
  Groups => { 2 => 'Time' },
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.80';
50
+ $VERSION = '2.81';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -1352,12 +1352,14 @@ my %eeBox2 = (
1352
1352
  },
1353
1353
  { #https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md
1354
1354
  Name => 'SphericalVideoXML',
1355
+ # (this tag is readable/writable as a block through the Extra SphericalVideoXML tags)
1355
1356
  Condition => '$$valPt=~/^\xff\xcc\x82\x63\xf8\x55\x4a\x93\x88\x14\x58\x7a\x02\x52\x1f\xdd/',
1356
1357
  WriteGroup => 'GSpherical', # write only GSpherical XMP tags here
1357
1358
  HandlerType => 'vide', # only write in video tracks
1358
1359
  SubDirectory => {
1359
1360
  TagTable => 'Image::ExifTool::XMP::Main',
1360
1361
  Start => 16,
1362
+ ProcessProc => 'Image::ExifTool::XMP::ProcessGSpherical',
1361
1363
  WriteProc => 'Image::ExifTool::XMP::WriteGSpherical',
1362
1364
  },
1363
1365
  },
@@ -6034,6 +6036,7 @@ my %eeBox2 = (
6034
6036
  plID => { #10 (or TV season)
6035
6037
  Name => 'PlayListID',
6036
6038
  Format => 'int8u', # actually int64u, but split it up
6039
+ Count => 8,
6037
6040
  Writable => 'int32s', #27
6038
6041
  },
6039
6042
  purd => 'PurchaseDate', #7
@@ -26,6 +26,7 @@ sub ProcessFreeGPS($$$);
26
26
  sub ProcessFreeGPS2($$$);
27
27
  sub Process360Fly($$$);
28
28
  sub ProcessFMAS($$$);
29
+ sub ProcessCAMM($$$);
29
30
 
30
31
  my $debug; # set to 1 for extra debugging messages
31
32
 
@@ -236,7 +237,7 @@ my %insvLimit = (
236
237
  camm => [{
237
238
  Name => 'camm0',
238
239
  # (according to the spec. the first 2 bytes are reserved and should be zero,
239
- # but I have a sample where these bytes are non-zero, so allow anything here)
240
+ # but I have samples where these bytes are non-zero, so allow anything here)
240
241
  Condition => '$$valPt =~ /^..\0\0/s',
241
242
  SubDirectory => {
242
243
  TagTable => 'Image::ExifTool::QuickTime::camm0',
@@ -318,7 +319,7 @@ my %insvLimit = (
318
319
 
319
320
  # tags found in 'camm' type 0 timed metadata (ref 4)
320
321
  %Image::ExifTool::QuickTime::camm0 = (
321
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
322
+ PROCESS_PROC => \&ProcessCAMM,
322
323
  GROUPS => { 2 => 'Location' },
323
324
  FIRST_ENTRY => 0,
324
325
  NOTES => q{
@@ -336,7 +337,7 @@ my %insvLimit = (
336
337
 
337
338
  # tags found in 'camm' type 1 timed metadata (ref 4)
338
339
  %Image::ExifTool::QuickTime::camm1 = (
339
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
340
+ PROCESS_PROC => \&ProcessCAMM,
340
341
  GROUPS => { 2 => 'Camera' },
341
342
  FIRST_ENTRY => 0,
342
343
  4 => {
@@ -355,7 +356,7 @@ my %insvLimit = (
355
356
 
356
357
  # tags found in 'camm' type 2 timed metadata (ref PH, Insta360Pro)
357
358
  %Image::ExifTool::QuickTime::camm2 = (
358
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
359
+ PROCESS_PROC => \&ProcessCAMM,
359
360
  GROUPS => { 2 => 'Location' },
360
361
  FIRST_ENTRY => 0,
361
362
  4 => {
@@ -367,7 +368,7 @@ my %insvLimit = (
367
368
 
368
369
  # tags found in 'camm' type 3 timed metadata (ref PH, Insta360Pro)
369
370
  %Image::ExifTool::QuickTime::camm3 = (
370
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
371
+ PROCESS_PROC => \&ProcessCAMM,
371
372
  GROUPS => { 2 => 'Location' },
372
373
  FIRST_ENTRY => 0,
373
374
  4 => {
@@ -379,7 +380,7 @@ my %insvLimit = (
379
380
 
380
381
  # tags found in 'camm' type 4 timed metadata (ref 4)
381
382
  %Image::ExifTool::QuickTime::camm4 = (
382
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
383
+ PROCESS_PROC => \&ProcessCAMM,
383
384
  GROUPS => { 2 => 'Location' },
384
385
  FIRST_ENTRY => 0,
385
386
  4 => {
@@ -391,7 +392,7 @@ my %insvLimit = (
391
392
 
392
393
  # tags found in 'camm' type 5 timed metadata (ref 4)
393
394
  %Image::ExifTool::QuickTime::camm5 = (
394
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
395
+ PROCESS_PROC => \&ProcessCAMM,
395
396
  GROUPS => { 2 => 'Location' },
396
397
  FIRST_ENTRY => 0,
397
398
  4 => {
@@ -416,7 +417,7 @@ my %insvLimit = (
416
417
 
417
418
  # tags found in 'camm' type 6 timed metadata (ref PH/4, Insta360)
418
419
  %Image::ExifTool::QuickTime::camm6 = (
419
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
420
+ PROCESS_PROC => \&ProcessCAMM,
420
421
  GROUPS => { 2 => 'Location' },
421
422
  FIRST_ENTRY => 0,
422
423
  0x04 => {
@@ -482,7 +483,7 @@ my %insvLimit = (
482
483
 
483
484
  # tags found in 'camm' type 7 timed metadata (ref 4)
484
485
  %Image::ExifTool::QuickTime::camm7 = (
485
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
486
+ PROCESS_PROC => \&ProcessCAMM,
486
487
  GROUPS => { 2 => 'Location' },
487
488
  FIRST_ENTRY => 0,
488
489
  4 => {
@@ -1481,8 +1482,12 @@ sub ProcessFreeGPS($$$)
1481
1482
  $lon = GetFloat($dataPt, 0x30);
1482
1483
  $spd = GetFloat($dataPt, 0x34) * $knotsToKph; # (convert knots to km/h)
1483
1484
  $trk = GetFloat($dataPt, 0x38);
1484
- @acc = unpack('x60V3', $$dataPt); # (may be all zeros if not valid)
1485
- map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1485
+ # (may be all zeros or int16u counting from 1 to 6 if not valid)
1486
+ my $tmp = substr($$dataPt, 60, 12);
1487
+ if ($tmp ne "\0\0\0\0\0\0\0\0\0\0\0\0" and $tmp ne "\x01\0\x02\0\x03\0\x04\0\x05\0\x06\0") {
1488
+ @acc = unpack('V3', $tmp);
1489
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1490
+ }
1486
1491
  SetByteOrder('MM');
1487
1492
  $debug and $et->FoundTag(GPSType => '1C');
1488
1493
 
@@ -2773,6 +2778,34 @@ sub ProcessInsta360($;$)
2773
2778
  return 1;
2774
2779
  }
2775
2780
 
2781
+ #------------------------------------------------------------------------------
2782
+ # Process CAMM metadata (ref PH)
2783
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2784
+ # Returns: 1 on success
2785
+ sub ProcessCAMM($$$)
2786
+ {
2787
+ my ($et, $dirInfo, $tagTbl) = @_;
2788
+ my $dataPt = $$dirInfo{DataPt};
2789
+ my $pos = $$dirInfo{DirStart} || 0;
2790
+ my $end = $pos + ($$dirInfo{DirLen} || length($$dataPt) - $pos);
2791
+ # camm record size for each type, including 4-byte header
2792
+ my %size = ( 1 => 12, 2 => 16, 3 => 16, 4 => 16, 5 => 28, 6 => 60, 7 => 16 );
2793
+ my $rtnVal = 0;
2794
+ while ($pos + 4 < $end) {
2795
+ my $type = Get16u($dataPt, $pos + 2);
2796
+ my $size = $size{$type} or $et->WarnOnce("Unknown camm record type $type"), last;
2797
+ $pos + $size > $end and $et->WarnOnce("Truncated camm record $type"), last;
2798
+ my $tagTbl = GetTagTable("Image::ExifTool::QuickTime::camm$type");
2799
+ $$dirInfo{DirStart} = $pos;
2800
+ $$dirInfo{DirLen} = $size;
2801
+ $et->ProcessBinaryData($dirInfo, $tagTbl) and $rtnVal = 1;
2802
+ # not sure if this is according to specification, but I have seen multiple
2803
+ # camm records all in a single sample, so step forward to process the next one
2804
+ $pos += $size;
2805
+ }
2806
+ return $rtnVal;
2807
+ }
2808
+
2776
2809
  #------------------------------------------------------------------------------
2777
2810
  # Process Garmin GPS 'uuid' atom (ref PH)
2778
2811
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -641,7 +641,8 @@ numerical, and generated automatically otherwise.
641
641
  expression, a code reference or a list reference. In this
642
642
  expression, $self, $val and $tag may be used as with
643
643
  ValueConv, but if ValueConv was defined then $val is the
644
- ValueConv value instead of the Raw value. The returned value
644
+ ValueConv value instead of the Raw value. Composite tags
645
+ may also use the @val, @prt and @raw lists. The returned value
645
646
  should always be defined. Note that the print conversion is
646
647
  only done if the PrintConv option is enabled (which it is by
647
648
  default), and if the result of the ValueConv is not a scalar
@@ -10191,10 +10191,10 @@ my %isoSetting2010 = (
10191
10191
  PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
10192
10192
  },
10193
10193
  0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
10194
- 0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk },
10195
- 0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk },
10196
- 0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk },
10197
- 0x800b => { Name => 'Sony_rtmd_0x800b', Format => 'int16u', %hidUnk },
10194
+ 0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, # (FocalLength35efl?, forum14315)
10195
+ 0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, # (FocalLength?, forum14315)
10196
+ 0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, # (FocusRingPosition?, forum14315)
10197
+ 0x800b => { Name => 'Sony_rtmd_0x800b', Format => 'int16u', %hidUnk }, # (ZoomRingPosition?, forum14315)
10198
10198
  # 0x8100 - 16 bytes starting with 0x060e2b340401
10199
10199
  0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
10200
10200
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA $makeMissing);
15
15
  use Image::ExifTool qw(:Utils :Vars);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.33';
18
+ $VERSION = '1.35';
19
19
  @ISA = qw(Exporter);
20
20
 
21
21
  # set this to a language code to generate Lang module with 'MISSING' entries
@@ -31,13 +31,14 @@ my %credits = (
31
31
  de => 'Jens Duttke, Herbert Kauer and Jobi',
32
32
  es => 'Jens Duttke, Santiago del BrE<iacute>o GonzE<aacute>lez and Emilio Sancha',
33
33
  fi => 'Jens Duttke and Jarkko ME<auml>kineva',
34
- fr => 'Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal, Harry Nizard and Alphonse Philippe',
34
+ fr => 'Jens Duttke, Bernard Guillotin, Jean Glasser, Jean Piquemal, Harry Nizard, Alphonse Philippe and Philippe Bonnaure (GraphicConverter)',
35
35
  it => 'Jens Duttke, Ferdinando Agovino, Emilio Dati and Michele Locati',
36
36
  ja => 'Jens Duttke and Kazunari Nishina',
37
37
  ko => 'Jens Duttke and Jeong Beom Kim',
38
38
  nl => 'Jens Duttke, Peter Moonen, Herman Beld and Peter van der Laan',
39
39
  pl => 'Jens Duttke, Przemyslaw Sulek and Kacper Perschke',
40
40
  ru => 'Jens Duttke, Sergey Shemetov, Dmitry Yerokhin, Anton Sukhinov and Alexander',
41
+ sk => 'Peter Bagin',
41
42
  sv => 'Jens Duttke and BjE<ouml>rn SE<ouml>derstrE<ouml>m',
42
43
  'tr' => 'Jens Duttke, Hasan Yildirim and Cihan Ulusoy',
43
44
  zh_cn => 'Jens Duttke and Haibing Zhong',
@@ -401,10 +402,14 @@ sub BuildLangModules($;$)
401
402
  my $val = ucfirst $tval;
402
403
  $val = $tval if $tval =~ /^(cRAW|iTun)/; # special-case non-capitalized values
403
404
  my $cap = ($tval ne $val);
404
- if ($makeMissing and $lang eq 'en') {
405
- $lang = $makeMissing;
406
- $val = 'MISSING';
407
- undef $cap;
405
+ if ($makeMissing) {
406
+ if ($lang eq 'en') {
407
+ $lang = $makeMissing;
408
+ $val = 'MISSING';
409
+ undef $cap;
410
+ }
411
+ } elsif ($val eq 'MISSING') {
412
+ next; # ignore "MISSING" entries
408
413
  }
409
414
  my $isDefault = ($lang eq $Image::ExifTool::defaultLang);
410
415
  unless ($langInfo{$lang} or $isDefault) {