exiftool_vendored 12.34.0 → 12.38.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
15
15
  use strict;
16
16
  use vars qw($VERSION);
17
17
 
18
- $VERSION = '1.17';
18
+ $VERSION = '1.18';
19
19
 
20
20
  my %offOn = ( 0 => 'Off', 1 => 'On' );
21
21
  my %onOff = ( 0 => 'On', 1 => 'Off' );
@@ -3358,6 +3358,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
3358
3358
  47 => 'AF-Area Mode + AF-On (Auto Area AF)',
3359
3359
  49 => 'Sync Release (Master Only)',
3360
3360
  50 => 'Sync Release (Remote Only)',
3361
+ 58 => 'AF-Area Mode + AF-On (Group Area AF - HL)',
3362
+ 59 => 'AF-Area Mode + AF-On (Group Area AF - VL)',
3361
3363
  },
3362
3364
  },
3363
3365
  15.1 => { # CSf1-a
@@ -3401,6 +3403,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
3401
3403
  47 => 'AF-Area Mode + AF-On (Auto Area AF)',
3402
3404
  49 => 'Sync Release (Master Only)',
3403
3405
  50 => 'Sync Release (Remote Only)',
3406
+ 58 => 'AF-Area Mode + AF-On (Group Area AF - HL)',
3407
+ 59 => 'AF-Area Mode + AF-On (Group Area AF - VL)',
3404
3408
  },
3405
3409
  },
3406
3410
  16.1 => { # CSf1-p
@@ -17,7 +17,7 @@ use strict;
17
17
  use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
 
20
- $VERSION = '1.04';
20
+ $VERSION = '1.06';
21
21
 
22
22
  sub ProcessNikonSettings($$$);
23
23
 
@@ -161,6 +161,39 @@ my %iSOAutoHiLimitD6 = (
161
161
  45 => 'ISO Hi 5.0',
162
162
  );
163
163
 
164
+ my %iSOAutoHiLimitZ7 = (
165
+ 1 => 'ISO 100',
166
+ 2 => 'ISO 125',
167
+ 4 => 'ISO 160',
168
+ 5 => 'ISO 200',
169
+ 6 => 'ISO 250',
170
+ 8 => 'ISO 320',
171
+ 9 => 'ISO 400',
172
+ 10 => 'ISO 500',
173
+ 12 => 'ISO 640',
174
+ 13 => 'ISO 800',
175
+ 14 => 'ISO 1000',
176
+ 16 => 'ISO 1250',
177
+ 17 => 'ISO 1600',
178
+ 18 => 'ISO 2000',
179
+ 20 => 'ISO 2500',
180
+ 21 => 'ISO 3200',
181
+ 22 => 'ISO 4000',
182
+ 24 => 'ISO 5000',
183
+ 25 => 'ISO 6400',
184
+ 26 => 'ISO 8000',
185
+ 28 => 'ISO 10000',
186
+ 29 => 'ISO 12800',
187
+ 30 => 'ISO 16000',
188
+ 32 => 'ISO 20000',
189
+ 33 => 'ISO 25600',
190
+ 38 => 'ISO Hi 0.3',
191
+ 39 => 'ISO Hi 0.5',
192
+ 40 => 'ISO Hi 0.7',
193
+ 41 => 'ISO Hi 1.0',
194
+ 42 => 'ISO Hi 2.0',
195
+ );
196
+
164
197
  my %lensFuncButtonZ7m2 = (
165
198
  1 => 'AF-On',
166
199
  2 => 'AF Lock Only',
@@ -305,16 +338,21 @@ my %times4s10s20s1m5m20m = (
305
338
 
306
339
  my %yesNo = ( 1 => 'Yes', 2 => 'No' );
307
340
 
308
- my %infoZ72 = (
309
- Condition => '$$self{Model} =~ /^NIKON Z 6_2/i or $$self{Model} =~ /^NIKON Z 7_2/i',
310
- Notes => 'Z7_2',
311
- );
312
-
313
341
  my %infoD6 = (
314
- Condition => '$$self{Model} =~ /^NIKON D6/i',
342
+ Condition => '$$self{Model} =~ /^NIKON D6\b/i',
315
343
  Notes => 'D6',
316
344
  );
317
345
 
346
+ my %infoZ7 = (
347
+ Condition => '$$self{Model} =~ /^NIKON Z (7|7_2)\b/i',
348
+ Notes => 'Z7 and Z7_2',
349
+ );
350
+
351
+ my %infoZSeries = (
352
+ Condition => '$$self{Model} =~ /^NIKON Z (5|50|6|6_2|7|7_2|fc)\b/i',
353
+ Notes => 'Z Series cameras thru November 2021',
354
+ );
355
+
318
356
  # Nikon Settings tags (ref 1, tag ID's ref PH)
319
357
  %Image::ExifTool::NikonSettings::Main = (
320
358
  PROCESS_PROC => \&ProcessNikonSettings,
@@ -329,39 +367,8 @@ my %infoD6 = (
329
367
  %infoD6,
330
368
  },{
331
369
  Name => 'ISOAutoHiLimit',
332
- PrintConv => {
333
- 1 => 'ISO 100',
334
- 2 => 'ISO 125',
335
- 4 => 'ISO 160',
336
- 5 => 'ISO 200',
337
- 6 => 'ISO 250',
338
- 8 => 'ISO 320',
339
- 9 => 'ISO 400',
340
- 10 => 'ISO 500',
341
- 12 => 'ISO 640',
342
- 13 => 'ISO 800',
343
- 14 => 'ISO 1000',
344
- 16 => 'ISO 1250',
345
- 17 => 'ISO 1600',
346
- 18 => 'ISO 2000',
347
- 20 => 'ISO 2500',
348
- 21 => 'ISO 3200',
349
- 22 => 'ISO 4000',
350
- 24 => 'ISO 5000',
351
- 25 => 'ISO 6400',
352
- 26 => 'ISO 8000',
353
- 28 => 'ISO 10000',
354
- 29 => 'ISO 12800',
355
- 30 => 'ISO 16000',
356
- 32 => 'ISO 20000',
357
- 33 => 'ISO 25600',
358
- 38 => 'ISO Hi 0.3',
359
- 39 => 'ISO Hi 0.5',
360
- 40 => 'ISO Hi 0.7',
361
- 41 => 'ISO Hi 1.0',
362
- 42 => 'ISO Hi 2.0',
363
- },
364
- %infoZ72,
370
+ PrintConv => \%iSOAutoHiLimitZ7,
371
+ %infoZ7,
365
372
  }],
366
373
  0x002 => [{
367
374
  Name => 'ISOAutoFlashLimit',
@@ -441,7 +448,7 @@ my %infoD6 = (
441
448
  42 => 'ISO Hi 1.0',
442
449
  43 => 'ISO Hi 2.0',
443
450
  },
444
- %infoZ72,
451
+ %infoZ7,
445
452
  }],
446
453
  0x003 => { # (D6/Z7_2)
447
454
  Name => 'ISOAutoShutterTime',
@@ -542,18 +549,10 @@ my %infoD6 = (
542
549
  37 => 'ISO Hi 1.0',
543
550
  38 => 'ISO Hi 2.0',
544
551
  },
545
- %infoZ72,
552
+ %infoZ7,
546
553
  }],
547
554
  0x00e => { Name => 'MovieISOAutoControlManualMode',PrintConv => \%onOff }, # (D6/Z7_2)
548
- # 0x00f => [{ # this tag should reside here, but unable to confirm
549
- # Name => 'MovieISOAutoManualMode',
550
- # PrintConv => \%iSOAutoHiLimitD6,
551
- # %infoD6,
552
- # },{
553
- # Name => 'MovieISOAutoManualMode',
554
- # PrintConv => \%iSOAutoHiLimitZ7m2,
555
- # %infoZ72,
556
- # }],
555
+ 0x00f => { Name => 'MovieWhiteBalanceSameAsPhoto', PrintConv => \%yesNo }, # (D6/Z7_2)
557
556
  0x01d => [{ # CSa1 (D6)
558
557
  Name => 'AF-CPrioritySel',
559
558
  PrintConv => { # valid for cameras with 4 options for CS1, otherwise 1=Release, 2=Focus
@@ -566,7 +565,7 @@ my %infoD6 = (
566
565
  },{ # CSa1 (Z7_2)
567
566
  Name => 'AF-CPrioritySel',
568
567
  PrintConv => \%releaseFocus,
569
- %infoZ72,
568
+ %infoZSeries,
570
569
  }],
571
570
  0x01e => { Name => 'AF-SPrioritySel', PrintConv => \%releaseFocus }, # CSa2 (D6), CSa2 (Z7_2)
572
571
  0x020 => [{ # CSa4 (D6)
@@ -580,7 +579,7 @@ my %infoD6 = (
580
579
  },{ # CSa4 (Z7_2)
581
580
  Name => 'AFPointSel',
582
581
  PrintConv => { 1 => 'Use All', 2 => 'Use Half' },
583
- %infoZ72,
582
+ %infoZSeries,
584
583
  }],
585
584
  0x022 => { Name => 'AFActivation', PrintConv => { 1 => 'Shutter/AF-On', 2 => 'AF-On Only' } }, # CSa6-a (D6/Z7_2) (missing enable/disable out of focus release) # (D6)
586
585
  0x023 => { Name => 'FocusPointWrap', PrintConv => { 1 => 'Wrap', 2 => 'No Wrap' } }, # CSa16 (D6), CSa8 (Z7_2)
@@ -617,7 +616,7 @@ my %infoD6 = (
617
616
  },{ # CSb3 (Z7_2)
618
617
  Name => 'CenterWeightedAreaSize',
619
618
  PrintConv => { 1 => '12 mm', 2 => 'Average' },
620
- %infoZ72,
619
+ %infoZSeries,
621
620
  }],
622
621
  0x02f => { # CSb7-a (D6), CSb4-a (Z7_2)
623
622
  Name => 'FineTuneOptMatrixMetering',
@@ -681,7 +680,7 @@ my %infoD6 = (
681
680
  7 => '30 min',
682
681
  8 => 'No Limit',
683
682
  },
684
- %infoZ72,
683
+ %infoZSeries,
685
684
  }],
686
685
  0x035 => { # CSc3-a (D6), CSc2-a (Z7_2)
687
686
  Name => 'SelfTimerTime',
@@ -770,7 +769,7 @@ my %infoD6 = (
770
769
  6 => '1/80 s',
771
770
  7 => '1/60 s',
772
771
  },
773
- %infoZ72,
772
+ %infoZSeries,
774
773
  }],
775
774
  0x048 => { # CSe2 (D6/Z7_2)
776
775
  Name => 'FlashShutterSpeed',
@@ -844,7 +843,7 @@ my %infoD6 = (
844
843
  25 => 'Non-CPU Lens',
845
844
  26 => 'None',
846
845
  },
847
- %infoZ72,
846
+ %infoZSeries,
848
847
  }],
849
848
  0x053 => [{ # CSf4-a (D6)
850
849
  Name => 'MultiSelectorShootMode',
@@ -864,7 +863,7 @@ my %infoD6 = (
864
863
  4 => 'Zoom (High)',
865
864
  5 => 'None',
866
865
  },
867
- %infoZ72,
866
+ %infoZSeries,
868
867
  }],
869
868
  0x054 => [{ # CSf4-c (D6)
870
869
  Name => 'MultiSelectorPlaybackMode',
@@ -887,7 +886,7 @@ my %infoD6 = (
887
886
  5 => 'Zoom (High)',
888
887
  6 => 'Choose Folder',
889
888
  },
890
- %infoZ72,
889
+ %infoZSeries,
891
890
  }],
892
891
  0x056 => { # CSf4-b (D6)
893
892
  Name => 'MultiSelectorLiveView',
@@ -975,9 +974,29 @@ my %infoD6 = (
975
974
  1 => 'Manual (dark on light)',
976
975
  2 => 'Manual (light on dark)',
977
976
  },
978
- %infoZ72,
977
+ %infoZSeries,
979
978
  }],
980
979
  0x074 => { Name => 'FlickAdvanceDirection', PrintConv => { 1 => 'Right to Left', 2 => 'Left to Right' } }, # CSf12-3 (D6)
980
+ 0x075 => { # Settings menu # (D6,Z7_2)
981
+ Name => 'HDMIOutputResolution',
982
+ PrintConv => {
983
+ 1 => 'Auto',
984
+ 2 => '2160p',
985
+ 3 => '1080p',
986
+ 4 => '1080i',
987
+ 5 => '720p',
988
+ 6 => '576p',
989
+ 7 => '480p',
990
+ },
991
+ },
992
+ 0x077 => { # Settings menu # (D6,Z7_2)
993
+ Name => 'HDMIOutputRange',
994
+ PrintConv => {
995
+ 1 => 'Auto',
996
+ 2 => 'Limit',
997
+ 3 => 'Full',
998
+ },
999
+ },
981
1000
  0x080 => [{
982
1001
  Name => 'RemoteFuncButton',
983
1002
  PrintConv => {
@@ -1010,7 +1029,7 @@ my %infoD6 = (
1010
1029
  10 => 'None',
1011
1030
  11 => 'LiveView Info Display On/Off',
1012
1031
  },
1013
- %infoZ72,
1032
+ %infoZSeries,
1014
1033
  }],
1015
1034
  0x08b => [{ # CSf6-a-1 and CSf6-a-2 (D6), CSf5-a-1 and CSf5-a-2 (Z7_2), (continued from above)
1016
1035
  Name => 'CmdDialsReverseRotation',
@@ -1051,6 +1070,7 @@ my %infoD6 = (
1051
1070
  8 => '180',
1052
1071
  },
1053
1072
  },
1073
+ 0x092 => { Name => 'HDMIExternalRecorder', PrintConv => \%onOff }, # Settings Menu/HDMI/Advanced entry (D6 & Z7_2)
1054
1074
  0x093 => { # CSa3-a (D6), CSa3 (Z7_2)
1055
1075
  Name => 'BlockShotAFResponse',
1056
1076
  PrintConv => {
@@ -1077,7 +1097,7 @@ my %infoD6 = (
1077
1097
  1 => 'Focus Point',
1078
1098
  2 => 'Off',
1079
1099
  },
1080
- %infoZ72,
1100
+ %infoZSeries,
1081
1101
  }],
1082
1102
  0x099 => { Name => 'DynamicAreaAFAssist',PrintConv => \%onOff }, # CSa17-c (D6), CSa9-b (Z7_2)
1083
1103
  0x09a => { Name => 'ExposureCompStepSize', PrintConv => \%thirdHalfFull }, # CSb3 (D6)
@@ -1100,7 +1120,7 @@ my %infoD6 = (
1100
1120
  },{ # CSf2-a (Z7_2)
1101
1121
  Name => 'Func1Button',
1102
1122
  PrintConv => \%funcButtonZ7m2,
1103
- %infoZ72,
1123
+ %infoZSeries,
1104
1124
  }],
1105
1125
  0x0a2 => [{ # CSf3-c (D6)
1106
1126
  Name => 'Func2Button',
@@ -1109,7 +1129,7 @@ my %infoD6 = (
1109
1129
  },{ # CSf2-b (Z7_2)
1110
1130
  Name => 'Func2Button',
1111
1131
  PrintConv => \%funcButtonZ7m2,
1112
- %infoZ72,
1132
+ %infoZSeries,
1113
1133
  }],
1114
1134
  0x0a3 => [{ # CSf3-f (D6)
1115
1135
  Name => 'AF-OnButton',
@@ -1161,7 +1181,7 @@ my %infoD6 = (
1161
1181
  11 => 'Zoom (High)',
1162
1182
  12 => 'None'
1163
1183
  },
1164
- %infoZ72,
1184
+ %infoZSeries,
1165
1185
  }],
1166
1186
  0x0a4 => { Name => 'SubSelector', PrintConv => \%tagSubSelector }, # CSf3-g-1 # (D6), CSf2-d-1 # (Z7_2)
1167
1187
  0x0a5 => [{ # CSf3-h (D6)
@@ -1234,7 +1254,7 @@ my %infoD6 = (
1234
1254
  24 => 'Non-CPU Lens',
1235
1255
  25 => 'None',
1236
1256
  },
1237
- %infoZ72,
1257
+ %infoZSeries,
1238
1258
  }],
1239
1259
  0x0a7 => [{ # CSf3-n (D6)
1240
1260
  Name => 'LensFunc1Button',
@@ -1274,7 +1294,7 @@ my %infoD6 = (
1274
1294
  },{ # CSf2-g (Z7_2)
1275
1295
  Name => 'LensFunc1Button',
1276
1296
  PrintConv => \%lensFuncButtonZ7m2,
1277
- %infoZ72,
1297
+ %infoZSeries,
1278
1298
  }],
1279
1299
  0x0a8 => { Name => 'CmdDialsApertureSetting', PrintConv => { 1 => 'Sub-command Dial', 2 => 'Aperture Ring' } }, # CSf6-c (D6)
1280
1300
  0x0a9 => { Name => 'MultiSelector', PrintConv => \%tagMultiSelector }, # CSf7 (D6)
@@ -1335,7 +1355,7 @@ my %infoD6 = (
1335
1355
  23 => 'Rating (1)', # no mapping for 24 on the Z7_2. Possibly intended for Rating = 'Candidate for Deletion'?
1336
1356
  25 => 'None',
1337
1357
  },
1338
- %infoZ72,
1358
+ %infoZSeries,
1339
1359
  }],
1340
1360
  0x0b3 => [{ # CSg2-b (D6)
1341
1361
  Name => 'MovieFunc1Button',
@@ -1379,7 +1399,7 @@ my %infoD6 = (
1379
1399
  23 => 'Rating (1)', # no mapping for 24 on the Z7_2. Possibly intended for Rating = 'Candidate for Deletion'?
1380
1400
  25 => 'None',
1381
1401
  },
1382
- %infoZ72,
1402
+ %infoZSeries,
1383
1403
  }],
1384
1404
  0x0b5 => { # CSg2-c (D6)
1385
1405
  Name => 'MovieFunc2Button',
@@ -1426,7 +1446,7 @@ my %infoD6 = (
1426
1446
  12 => 'Image Area',
1427
1447
  13 => 'None',
1428
1448
  },
1429
- %infoZ72,
1449
+ %infoZSeries,
1430
1450
  }],
1431
1451
  0x0b8 => { Name => 'LimitAFAreaModeSelD9', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-a (D6)
1432
1452
  0x0b9 => { Name => 'LimitAFAreaModeSelD25', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa14-b (D6)
@@ -1549,6 +1569,29 @@ my %infoD6 = (
1549
1569
  0x0fb => { Name => 'SecondarySlotFunction', PrintConv => \%tagSecondarySlotFunction }, # (D6)
1550
1570
  0x0fc => { Name => 'SilentPhotography', PrintConv => \%onOff }, # (D6,Z7_2) # tag is associated with Silent LiveView Photography (as distinguisehed from Silent Interval or Silent Focus Shift)
1551
1571
  0x0fd => { Name => 'ExtendedShutterSpeeds', PrintConv => \%onOff }, # CSd7 (D6), CSd6 (Z7_2)
1572
+ 0x102 => { # (Z7_2)
1573
+ Name => 'HDMIBitDepth',
1574
+ RawConv => '$$self{HDMIBitDepth} = $val',
1575
+ PrintConv => {
1576
+ 1 => '8 Bit',
1577
+ 2 => '10 Bit',
1578
+ #5 => 'Auto', #observed on the Z50 - needs confirmation
1579
+ },
1580
+ },
1581
+ 0x103 => { # (Z7_2)
1582
+ Name => 'HDMIOutputHDR',
1583
+ Condition => '$$self{HDMIBitDepth} == 2', # HDR(HLC) output option only available only for 10 bit
1584
+ RawConv => '$$self{HDMIOutputHDR} = $val',
1585
+ PrintConv => {
1586
+ 2 => 'On', # unusual decode perhaps due to sharing sub-menu with tag HDMIOutputN-Log?
1587
+ 3 => 'Off',
1588
+ },
1589
+ },
1590
+ 0x104 => { # valid for 10 bit with either N-Log or HDR/HLG selected (Z7_2)
1591
+ Name => 'HDMIViewAssist',
1592
+ Condition => '$$self{HDMIBitDepth} == 2',
1593
+ PrintConv => \%onOff
1594
+ },
1552
1595
  0x109 => { # (D6,Z7_2)
1553
1596
  Name => 'BracketSet',
1554
1597
  RawConv => '$$self{BracketSet} = $val',
@@ -1640,6 +1683,11 @@ my %infoD6 = (
1640
1683
  8 => 'Off, Low, Normal, High, Extra High',
1641
1684
  },
1642
1685
  },
1686
+ 0x10e => { # (D6/Z7_2)
1687
+ Name => 'MonitorBrightness',
1688
+ # settings: -5 to +5
1689
+ ValueConv => '$val - 6',
1690
+ },
1643
1691
  0x116 => { Name => 'GroupAreaC1', PrintConv =>\%groupAreaCustom }, # CSa10-a (new with D6) # (D6)
1644
1692
  0x117 => { Name => 'AutoAreaAFStartingPoint', PrintConv => \%enableDisable }, # CSa12 (D6)
1645
1693
  0x118 => { Name => 'FocusPointPersistence', PrintConv => { 1 => 'Auto', 2 => 'Off' } }, # CSa13 (new with D6) # (D6)
@@ -1823,8 +1871,9 @@ my %infoD6 = (
1823
1871
  },
1824
1872
  },
1825
1873
  0x151 => { Name => 'LensFunc2Button', PrintConv => \%lensFuncButtonZ7m2 }, # CSf2-h (Z7_2)
1874
+ #0x153 => { Name => 'ViewfinderBrightness', } #(Z7_2) # commented out to reduce output volume. Range [-5,+5]. PrintConv matches MonitorBrightness.
1826
1875
  0x158 => { Name => 'USBPowerDelivery', PrintConv => \%enableDisable }, # (Z7_2)
1827
- 0x15b => { Name => 'GroupAreaC2', PrintConv =>\%groupAreaCustom }, # CSa10-b (new with D6) # (D6)
1876
+ 0x159 => { Name => 'EnergySavingMode', PrintConv =>\%onOff }, # (Z7_2)
1828
1877
  0x15c => { Name => 'BracketingBurstOptions',PrintConv => \%enableDisable }, # CSe9 (D6)
1829
1878
  # 0x15d => CSf3-j-2 (D6) 'Same as Multi-Selector with Info(U/D) & Playback(R/L)' and 'Same as Multi-Selector with Info(R/L) & Playback(U/D)' (skipped to reduce volume of output)
1830
1879
  0x15e => { Name => 'PrimarySlot', PrintConv => { 1 => 'CFexpress/XQD Card', 2 => 'SD Card' } }, # (Z7_2)
@@ -1900,10 +1949,12 @@ my %infoD6 = (
1900
1949
  13 => 'None',
1901
1950
  },
1902
1951
  },
1952
+ #0x168 => { Name => 'ControlPanelBrightness', # (Z7_2) #commented to reduce output volume
1903
1953
  0x169 => { Name => 'LimitAF-AreaModeSelAutoPeople', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-h (Z7_2)
1904
1954
  0x16a => { Name => 'LimitAF-AreaModeSelAutoAnimals', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-h (Z7_2)
1905
1955
  0x16b => { Name => 'LimitAF-AreaModeSelWideLPeople', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-e (Z7_2)
1906
1956
  0x16c => { Name => 'LimitAF-AreaModeSelWideLAnimals', PrintConv => \%limitNolimit, Unknown => 1 }, # CSa7-f (Z7_2)
1957
+ 0x16d => { Name => 'SaveFocus', PrintConv => \%onOff }, # (Z7_2)
1907
1958
  0x16e => { # (Z7_2)
1908
1959
  Name => 'AFAreaMode',
1909
1960
  RawConv => '$$self{AFAreaMode} = $val',
@@ -1919,6 +1970,19 @@ my %infoD6 = (
1919
1970
  10 => 'Auto (Animals)',
1920
1971
  },
1921
1972
  },
1973
+ 0x16f => { # (Z7_2)
1974
+ Name => 'MovieAFAreaMode',
1975
+ PrintConv => {
1976
+ 1 => 'Single-point',
1977
+ 2 => 'Wide (S)',
1978
+ 3 => 'Wide (L)',
1979
+ 4 => 'Wide (L-people)',
1980
+ 5 => 'Wide (L-animals)',
1981
+ 6 => 'Auto',
1982
+ 7 => 'Auto (People)',
1983
+ 8 => 'Auto (Animals)',
1984
+ },
1985
+ },
1922
1986
  0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0)
1923
1987
  0x171 => { # CSb8 (D6 firmware v1.3.0)
1924
1988
  Name => 'KeepExposureWithTeleconverter',
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::GPS;
17
17
 
18
- $VERSION = '1.02';
18
+ $VERSION = '1.03';
19
19
 
20
20
  # supported EXR value format types (other types are extracted as undef binary data)
21
21
  my %formatType = (
@@ -172,12 +172,13 @@ sub ProcessEXR($$)
172
172
  my $ver = unpack('x4V', $buff);
173
173
  $et->HandleTag($tagTablePtr, '_ver', $ver & 0xff);
174
174
  $et->HandleTag($tagTablePtr, '_lay', $ver & 0x200);
175
+ my $maxLen = ($ver & 0x400) ? 255 : 31;
175
176
 
176
177
  # extract attributes
177
178
  for (;;) {
178
179
  $raf->Read($buff, 68) or last;
179
180
  last if $buff =~ /^\0/;
180
- unless ($buff =~ /^([^\0]{1,31})\0([^\0]{1,31})\0(.{4})/sg) {
181
+ unless ($buff =~ /^([^\0]{1,$maxLen})\0([^\0]{1,$maxLen})\0(.{4})/sg) {
181
182
  $et->Warn('EXR format error');
182
183
  last;
183
184
  }
@@ -189,6 +190,7 @@ sub ProcessEXR($$)
189
190
  my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
190
191
  unless ($tagInfo) {
191
192
  my $name = ucfirst $tag;
193
+ $name =~ s/([^a-zA-Z])([a-z])/$1\U$2/g; # capitalize first letter of each word
192
194
  $name =~ tr/-_a-zA-Z0-9//dc;
193
195
  if (length $name <= 1) {
194
196
  if (length $name) {
@@ -259,6 +259,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
259
259
  },
260
260
  tRNS => {
261
261
  Name => 'Transparency',
262
+ # may have as many entries as the PLTE table, but who wants to see all that?
262
263
  ValueConv => q{
263
264
  return \$val if length($val) > 6;
264
265
  join(" ",unpack($Image::ExifTool::PNG::colorType == 3 ? "C*" : "n*", $val));
@@ -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.71';
50
+ $VERSION = '2.73';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -482,6 +482,17 @@ my %eeBox2 = (
482
482
  # (Pittasoft Blackview dashcam MP4 videos)
483
483
  Condition => '$$valPt =~ /^\0\0..(cprt|sttm|ptnm|ptrh|thum|gps |3gf )/s',
484
484
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Pittasoft' },
485
+ },{
486
+ Name => 'ThumbnailImage',
487
+ # (DJI Zenmuse XT2 thermal camera)
488
+ Groups => { 2 => 'Preview' },
489
+ Condition => '$$valPt =~ /^.{4}mdat\xff\xd8\xff/s',
490
+ RawConv => q{
491
+ my $len = unpack('N', $val);
492
+ return undef if $len <= 8 or $len > length($val);
493
+ return substr($val, 8, $len-8);
494
+ },
495
+ Binary => 1,
485
496
  },{
486
497
  Unknown => 1,
487
498
  Binary => 1,
@@ -6359,7 +6370,7 @@ my %eeBox2 = (
6359
6370
  'player.movie.visual.tint' => 'Tint',
6360
6371
  'player.movie.visual.contrast' => 'Contrast',
6361
6372
  'player.movie.audio.gain' => 'AudioGain',
6362
- 'player.movie.audio.treble' => 'Trebel',
6373
+ 'player.movie.audio.treble' => 'Treble',
6363
6374
  'player.movie.audio.bass' => 'Bass',
6364
6375
  'player.movie.audio.balance' => 'Balance',
6365
6376
  'player.movie.audio.pitchshift' => 'PitchShift',
@@ -6454,6 +6465,7 @@ my %eeBox2 = (
6454
6465
  %Image::ExifTool::QuickTime::iTunesInfo = (
6455
6466
  PROCESS_PROC => \&ProcessMOV,
6456
6467
  GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
6468
+ VARS => { LONG_TAGS => 0 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6457
6469
  NOTES => q{
6458
6470
  ExifTool will extract any iTunesInfo tags that exist, even if they are not
6459
6471
  defined in this table. These tags belong to the family 1 "iTunes" group,
@@ -99,7 +99,7 @@ my %insvLimit = (
99
99
  The tags below are extracted from timed metadata in QuickTime and other
100
100
  formats of video files when the ExtractEmbedded option is used. Although
101
101
  most of these tags are combined into the single table below, ExifTool
102
- currently reads 57 different formats of timed GPS metadata from video files.
102
+ currently reads 59 different formats of timed GPS metadata from video files.
103
103
  },
104
104
  VARS => { NO_ID => 1 },
105
105
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -1581,6 +1581,31 @@ sub ProcessFreeGPS($$$)
1581
1581
  substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
1582
1582
  # (other values are currently unknown)
1583
1583
 
1584
+ } elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
1585
+
1586
+ # Vantrue S1 dashcam
1587
+ # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
1588
+ # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
1589
+ # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
1590
+ # 0030: 68 6f 72 73 6f 6e 74 65 63 68 00 00 00 00 00 00 [horsontech......]
1591
+ # 0040: 41 4e 45 00 15 00 00 00 07 00 00 00 02 00 00 00 [ANE.............]
1592
+ # 0050: 03 00 00 00 35 00 00 00 05 00 00 00 4f 74 4c 44 [....5.......OtLD]
1593
+ # 0060: e2 77 a0 45 89 c1 98 42 71 bd ac 42 02 ab 0d 43 [.w.E...Bq..B...C]
1594
+ # 0070: 05 00 00 00 7f 00 00 00 07 01 00 00 00 00 00 00 [................]
1595
+ ($latRef, $lonRef) = ($1, $2);
1596
+ ($yr,$mon,$day,$hr,$min,$sec,@acc) = unpack('x68V6x20V3', $$dataPt);
1597
+ return 0 unless $mon>=1 and $mon<=12 and $day>=1 and $day<=31;
1598
+ $yr += 2000 if $yr < 2000;
1599
+ # (not sure about acc scaling)
1600
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc;
1601
+ SetByteOrder('II');
1602
+ $lon = GetFloat($dataPt, 0x5c);
1603
+ $lat = GetFloat($dataPt, 0x60);
1604
+ $spd = GetFloat($dataPt, 0x64) * $knotsToKph;
1605
+ $trk = GetFloat($dataPt, 0x68);
1606
+ $alt = GetFloat($dataPt, 0x6c);
1607
+ SetByteOrder('MM');
1608
+
1584
1609
  } else {
1585
1610
 
1586
1611
  # decode binary GPS format (Viofo A119S, ref 2)
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.47';
37
+ $VERSION = '3.48';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -198,6 +198,8 @@ sub PrintInvLensSpec($;$$);
198
198
  49466 => 'Tamron 150-500mm F5-6.7 Di III VC VXD', #JR (Model A057)
199
199
  49467 => 'Tamron 11-20mm F2.8 Di III-A RXD', #JR (Model B060)
200
200
  49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061)
201
+ 49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
202
+ 49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
201
203
 
202
204
  49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
203
205
  49473.1 => 'Viltrox 23mm F1.4 E', #JR
@@ -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.31';
18
+ $VERSION = '1.32';
19
19
  @ISA = qw(Exporter);
20
20
 
21
21
  # set this to a language code to generate Lang module with 'MISSING' entries
@@ -58,6 +58,12 @@ my %translateLang = (
58
58
  my $numbersFirst = 1; # set to -1 to sort numbers last, or 2 to put negative numbers last
59
59
  my $caseInsensitive; # used internally by sort routine
60
60
 
61
+ # write groups that don't represent real family 1 group names
62
+ my %fakeWriteGroup = (
63
+ Comment => 1, # (JPEG Comment)
64
+ colr => 1, # (Jpeg2000 'colr' box)
65
+ );
66
+
61
67
  #------------------------------------------------------------------------------
62
68
  # Utility to print tag information database as an XML list
63
69
  # Inputs: 0) output file name (undef to send to console),
@@ -178,9 +184,8 @@ PTILoop: for ($index=0; $index<@infoArray; ++$index) {
178
184
  }
179
185
  my @groups = $et->GetGroup($tagInfo);
180
186
  my $writeGroup = $$tagInfo{WriteGroup} || $$table{WRITE_GROUP};
181
- if ($writeGroup and $writeGroup ne 'Comment') {
182
- $groups[1] = $writeGroup; # use common write group for group 1
183
- }
187
+ # use common write group for group 1 (unless fake)
188
+ $groups[1] = $writeGroup if $writeGroup and not $fakeWriteGroup{$writeGroup};
184
189
  # add group names if different from table defaults
185
190
  my $grp = '';
186
191
  for ($fam=0; $fam<3; ++$fam) {