exiftool_vendored 12.80.0 → 12.82.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,7 +29,7 @@ use vars qw($VERSION);
29
29
  use Image::ExifTool qw(:Public);
30
30
  use Image::ExifTool::GPS;
31
31
 
32
- $VERSION = '1.74';
32
+ $VERSION = '1.75';
33
33
 
34
34
  sub JITTER() { return 2 } # maximum time jitter
35
35
 
@@ -1221,9 +1221,14 @@ Category: foreach $category (qw{pos track alt orient atemp}) {
1221
1221
  # also Geolocate if specified
1222
1222
  my $nvHash;
1223
1223
  my $geoloc = $et->GetNewValue('Geolocate', \$nvHash);
1224
- if ($geoloc and lc($geoloc) eq 'geotag') {
1225
- $geoloc = ($$nvHash{WantGroup} ? "$$nvHash{WantGroup}:" : '') . 'Geolocate';
1226
- $et->SetNewValue($geoloc => "$$fix{lat},$$fix{lon}");
1224
+ if ($geoloc and $geoloc =~ /\bgeotag\b/i) {
1225
+ my $tag = ($$nvHash{WantGroup} ? "$$nvHash{WantGroup}:" : '') . 'Geolocate';
1226
+ # pass along any regular expressions to qualify geolocation search
1227
+ my $parms = join ',', grep m(/), split /\s*,\s*/, $geoloc;
1228
+ $parms and $parms = ",$parms,both";
1229
+ $et->SetNewValue($tag => "$$fix{lat},$$fix{lon}$parms");
1230
+ # (the Geolocate tag will be restored to its original value
1231
+ # by RestoreNewValues before the next file in batch processing)
1227
1232
  }
1228
1233
  return $err if $qt; # all done if writing to QuickTime only
1229
1234
  # (capture error messages by calling SetNewValue in list context)
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.24';
35
+ $VERSION = '1.25';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -379,7 +379,7 @@ sub ParsePID($$$$$)
379
379
  $et->HandleTag($tagTbl, Accelerometer => "@acc");
380
380
  }
381
381
  SetByteOrder('MM');
382
- $$et{HasINNOV} = 1; # (necessary to skip over empty/unknown INNOV records)
382
+ $$et{FoundGoodGPS} = 1; # (necessary to skip over empty/unknown INNOV records)
383
383
  $more = 1;
384
384
  } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
385
385
  # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
@@ -481,7 +481,35 @@ sub ParsePID($$$$$)
481
481
  $et->HandleTag($tagTbl, GPSTrackRef => 'T');
482
482
  SetByteOrder('MM');
483
483
  $more = 1;
484
- } elsif ($$et{HasINNOV}) {
484
+ } elsif (length($$dataPt) >= 64 and substr($$dataPt, 32, 2) eq '$S') {
485
+ # DOD_LS600W.TS
486
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
487
+ # find the earliest sample time in the cyclical list
488
+ my ($n, $last) = (32, "\0");
489
+ for (my $i=32; $i<length($$dataPt)-32; $i+=32) {
490
+ last unless substr($$dataPt, $n, 2) eq '$S';
491
+ my $dateTime = substr($$dataPt, $i+6, 8);
492
+ $last gt $dateTime and $n = $i, last; # earliest sample if time goes backwards
493
+ $last = $dateTime;
494
+ }
495
+ for (my $i=32; $i<length($$dataPt)-32; $i+=32, $n+=32) {
496
+ $n = 32 if $n > length($$dataPt)-32;
497
+ last unless substr($$dataPt, $n, 2) eq '$S';
498
+ my @a = unpack("x${n}nnnnCCCCnCNNC", $$dataPt);
499
+ $a[8] /= 10; # 1/10 sec
500
+ $a[2] += (36000 - 65536) if $a[2] & 0x8000; # convert signed integer into range 0-36000
501
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
502
+ $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%04.1fZ', @a[3..8]));
503
+ $et->HandleTag($tagTbl, GPSLatitude => $a[10] * 1e-7);
504
+ $et->HandleTag($tagTbl, GPSLongitude => $a[11] * 1e-7);
505
+ $et->HandleTag($tagTbl, GPSSpeed => $a[1] * 0.036); # convert from metres per 100 s
506
+ $et->HandleTag($tagTbl, GPSTrack => $a[2] / 100);
507
+ }
508
+ # Note: 10 bytes after last GPS record look like a single 3-axis accelerometer reading:
509
+ # eg. fd ff 00 00 ff ff 00 00 01 00
510
+ $$et{FoundGoodGPS} = 1; # so we skip over unrecognized packets
511
+ $more = 1;
512
+ } elsif ($$et{FoundGoodGPS}) {
485
513
  $more = 1;
486
514
  }
487
515
  delete $$et{DOC_NUM};
@@ -538,7 +566,7 @@ sub ProcessM2TS($$)
538
566
  my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
539
567
  # PID's that may contain GPS info
540
568
  my %gpsPID = (
541
- 0x0300 => 1, # Novatek INNOVV
569
+ 0x0300 => 1, # Novatek INNOVV, DOD_LS600W
542
570
  0x01e4 => 1, # vsys a6l dashcam
543
571
  0x0e1b => 1, # Jomise T860S-GM dashcam
544
572
  );
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.15';
24
+ $VERSION = '2.16';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -195,7 +195,7 @@ my $debug; # set to 1 to enable debugging code
195
195
  },
196
196
  {
197
197
  Name => 'MakerNoteHP4', # PhotoSmart M627
198
- Condition => '$$valPt =~ /^IIII\x04\0/',
198
+ Condition => '$$valPt =~ /^IIII[\x04|\x05]\0/',
199
199
  NotIFD => 1,
200
200
  SubDirectory => {
201
201
  TagTable => 'Image::ExifTool::HP::Type4',
@@ -245,7 +245,7 @@ my %sRegions = (
245
245
  Copyright => { Groups => { 2 => 'Author' } },
246
246
  Count => { },
247
247
  CurrentBitrate => { },
248
- Description => { },
248
+ Description => { Writable => 'Unicode', Avoid => 1 },
249
249
  DisplayArtist => { },
250
250
  DLNAServerUDN => { },
251
251
  DLNASourceURI => { },
@@ -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.30';
68
+ $VERSION = '4.32';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -678,6 +678,7 @@ sub GetAFPointGrid($$;$);
678
678
  'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
679
679
  'FD 00 44 44 18 18 DF 00' => 'Voigtlander APO-Lanthar 35mm F2', #30
680
680
  'FD 00 59 59 18 18 DF 00' => 'Voigtlander Macro APO-Lanthar 65mm F2', #30
681
+ 'FD 00 48 48 07 07 DF 00' => 'Voigtlander Nokton 40mm F1.2 Aspherical', #30
681
682
  #
682
683
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
683
684
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -890,6 +891,12 @@ my %bracketProgramZ9 = (
890
891
  9 => '9F',
891
892
  );
892
893
 
894
+ my %dialsFrameAdvanceZoomPositionZ9 = (
895
+ 0 => 'Hold',
896
+ 1 => 'Focus Point',
897
+ 2 => 'Face Priority',
898
+ );
899
+
893
900
  my %dynamicAfAreaModesZ9 = (
894
901
  0 => 'Small',
895
902
  1 => 'Medium',
@@ -949,6 +956,7 @@ my %highFrameRateZ9 = (
949
956
  3 => 'C30',
950
957
  5 => 'C60',
951
958
  4 => 'C120',
959
+ 6 => 'C15',
952
960
  );
953
961
 
954
962
  my %imageAreaD6 = (
@@ -1118,6 +1126,12 @@ my %movieFrameSizeZ9 = (
1118
1126
  3 => '7680x4320',
1119
1127
  );
1120
1128
 
1129
+ my %movieSlowMotion = (
1130
+ 0 => 'Off',
1131
+ 1 => 'On (4x)', # 120p recording with playback @ 30p [1920 x 1080; 30p x 4] or 100p recording with playback @ 25p [1920 x 1080; 25p x 4]
1132
+ 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5]
1133
+ );
1134
+
1121
1135
  my %movieToneMapZ9 = (
1122
1136
  0 => 'SDR',
1123
1137
  1 => 'HLG',
@@ -1125,7 +1139,7 @@ my %movieToneMapZ9 = (
1125
1139
  );
1126
1140
 
1127
1141
  my %movieTypeZ9 = (
1128
- 1 => 'H.265 8-bit (MP4)',
1142
+ 1 => 'H.264 8-bit (MP4)',
1129
1143
  2 => 'H.265 8-bit (MOV)',
1130
1144
  3 => 'H.265 10-bit (MOV)',
1131
1145
  4 => 'ProRes 422 HQ 10-bit (MOV)',
@@ -1172,6 +1186,22 @@ my %offLowNormalHighZ7 = (
1172
1186
  3 => 'High',
1173
1187
  );
1174
1188
 
1189
+ my %pixelShiftDelay = (
1190
+ 0 => 'Off',
1191
+ 1 => '1 s',
1192
+ 2 => '2 s',
1193
+ 3 => '3 s',
1194
+ 4 => '5 s',
1195
+ 5 => '10 s',
1196
+ );
1197
+
1198
+ my %pixelShiftNumberShots = (
1199
+ 0 => '4',
1200
+ 1 => '8',
1201
+ 2 => '16',
1202
+ 3 => '32',
1203
+ );
1204
+
1175
1205
  my %portraitImpressionBalanceZ8 = (
1176
1206
  0 => 'Off',
1177
1207
  1 => 'Mode 1',
@@ -5469,7 +5499,7 @@ my %nikonFocalConversions = (
5469
5499
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
5470
5500
  29 => 'Nikkor Z 28mm f/2.8', #IB
5471
5501
  30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
5472
- 31 => 'Nikkor Z 24-120 f/4', #28
5502
+ 31 => 'Nikkor Z 24-120mm f/4 S', #github#250
5473
5503
  32 => 'Nikkor Z 800mm f/6.3 VR S', #28
5474
5504
  35 => 'Nikkor Z 28-75mm f/2.8', #IB
5475
5505
  36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
@@ -8382,7 +8412,7 @@ my %nikonFocalConversions = (
8382
8412
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8383
8413
  VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
8384
8414
  DATAMEMBER => [ 0x04 ],
8385
- IS_SUBDIR => [ 0x30, 0x84, 0x8c ],
8415
+ IS_SUBDIR => [ 0x30, 0x80, 0x84, 0x8c ],
8386
8416
  WRITABLE => 1,
8387
8417
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8388
8418
  NOTES => 'These tags are extracted from encrypted data in images from the Z8.',
@@ -8425,6 +8455,16 @@ my %nikonFocalConversions = (
8425
8455
  Start => '$val',
8426
8456
  },
8427
8457
  },
8458
+ 0x80 => {
8459
+ Name => 'AutoCaptureOffset',
8460
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.00"',
8461
+ Format => 'int32u',
8462
+ AlwaysDecrypt => 1, # (necessary because FirmwareVersion is extracted after decryption time)
8463
+ SubDirectory => {
8464
+ TagTable => 'Image::ExifTool::Nikon::AutoCaptureInfo',
8465
+ Start => '$val',
8466
+ },
8467
+ },
8428
8468
  0x84 => {
8429
8469
  Name => 'OrientOffset',
8430
8470
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
@@ -8709,13 +8749,24 @@ my %nikonFocalConversions = (
8709
8749
  0x10 => [
8710
8750
  {
8711
8751
  Name => 'MenuSettingsOffsetZ8',
8752
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} lt "02.00"',
8712
8753
  Format => 'int32u',
8713
- Notes => 'Firmware versions 1.0.0',
8754
+ Notes => 'Firmware versions 1.0.0 and 1.1.0',
8714
8755
  SubDirectory => {
8715
8756
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8',
8716
8757
  Start => '$dirStart + $val',
8717
8758
  },
8718
8759
  },
8760
+ {
8761
+ Name => 'MenuSettingsOffsetZ8v2',
8762
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.00"',
8763
+ Notes => 'Firmware version 2.0',
8764
+ Format => 'int32u',
8765
+ SubDirectory => {
8766
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8v2',
8767
+ Start => '$dirStart + $val',
8768
+ },
8769
+ },
8719
8770
  ],
8720
8771
  );
8721
8772
 
@@ -9065,15 +9116,7 @@ my %nikonFocalConversions = (
9065
9116
  #463 => SilentPhotography
9066
9117
  502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
9067
9118
  504 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
9068
- 506 => {
9069
- Name => 'MovieSlowMotion',
9070
- Unknown => 1,
9071
- PrintConv => {
9072
- 0 => 'Off',
9073
- 1 => 'On (4x)', # 120p recording with playback @ 30p [1920 x 1080; 30p x 4] or 100p recording with playback @ 25p [1920 x 1080; 25p x 4]
9074
- 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5]
9075
- },
9076
- },
9119
+ 506 => { Name => 'MovieSlowMotion', PrintConv => \%movieSlowMotion, Unknown => 1 },
9077
9120
  510 => {
9078
9121
  Name => 'MovieType',
9079
9122
  Unknown => 1,
@@ -9284,7 +9327,7 @@ my %nikonFocalConversions = (
9284
9327
  },
9285
9328
  618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9286
9329
  622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9287
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9330
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9288
9331
  730 => {
9289
9332
  Name => 'MovieImageArea',
9290
9333
  Unknown => 1,
@@ -9333,7 +9376,7 @@ my %nikonFocalConversions = (
9333
9376
  Format => 'undef[730]',
9334
9377
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ8' },
9335
9378
  },
9336
- 1682 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9379
+ 1698 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9337
9380
  1684 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
9338
9381
  1690 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
9339
9382
  1712 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
@@ -9384,6 +9427,260 @@ my %nikonFocalConversions = (
9384
9427
  1890 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
9385
9428
  1899 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
9386
9429
  );
9430
+ %Image::ExifTool::Nikon::MenuSettingsZ8v2 = (
9431
+ %binaryDataAttrs,
9432
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9433
+ DATAMEMBER => [ 152, 200, 204, 244, 440, 548, 554, 570, 596, 2046 ],
9434
+ IS_SUBDIR => [ 943 ],
9435
+ NOTES => 'These tags are used by the Z8 firmware 1.00.',
9436
+ 72 => {
9437
+ Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
9438
+ PrintConv => \%highFrameRateZ9,
9439
+ },
9440
+ 152 => {
9441
+ Name => 'MultipleExposureMode',
9442
+ RawConv => '$$self{MultipleExposureMode} = $val',
9443
+ PrintConv => \%multipleExposureModeZ9,
9444
+ },
9445
+ 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
9446
+ 184 => {
9447
+ Name => 'IntervalDurationHours',
9448
+ Format => 'int32u',
9449
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9450
+ },
9451
+ 188 => {
9452
+ Name => 'IntervalDurationMinutes',
9453
+ Format => 'int32u',
9454
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9455
+ },
9456
+ 192 => {
9457
+ Name => 'IntervalDurationSeconds',
9458
+ Format => 'int32u',
9459
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9460
+ },
9461
+ 200 => {
9462
+ Name => 'Intervals',
9463
+ Format => 'int32u',
9464
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
9465
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9466
+ },
9467
+ 204 => {
9468
+ Name => 'ShotsPerInterval',
9469
+ Format => 'int32u',
9470
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
9471
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9472
+ },
9473
+ 208 => {
9474
+ Name => 'IntervalExposureSmoothing',
9475
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9476
+ Format => 'int8u',
9477
+ PrintConv => \%offOn,
9478
+ },
9479
+ 210 => {
9480
+ Name => 'IntervalPriority',
9481
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9482
+ Format => 'int8u',
9483
+ PrintConv => \%offOn,
9484
+ },
9485
+ 244 => {
9486
+ Name => 'FocusShiftNumberShots', #1-300
9487
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
9488
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9489
+ },
9490
+ 248 => {
9491
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
9492
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9493
+ },
9494
+ 252 => {
9495
+ Name => 'FocusShiftInterval',
9496
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9497
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
9498
+ },
9499
+ 256 => {
9500
+ Name => 'FocusShiftExposureLock',
9501
+ Unknown => 1,
9502
+ PrintConv => \%offOn,
9503
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9504
+ },
9505
+ 286 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
9506
+ 288 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
9507
+ 324 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
9508
+ 338 => { Name => 'AutoISO', PrintConv => \%offOn },
9509
+ 340 => {
9510
+ Name => 'ISOAutoHiLimit',
9511
+ Format => 'int16u',
9512
+ Unknown => 1,
9513
+ ValueConv => '($val-104)/8',
9514
+ ValueConvInv => '8 * ($val + 104)',
9515
+ PrintConv => \%iSOAutoHiLimitZ7,
9516
+ },
9517
+ 342 => {
9518
+ Name => 'ISOAutoFlashLimit',
9519
+ Format => 'int16u',
9520
+ Unknown => 1,
9521
+ ValueConv => '($val-104)/8',
9522
+ ValueConvInv => '8 * ($val + 104)',
9523
+ PrintConv => \%iSOAutoHiLimitZ7,
9524
+ },
9525
+ 350 => {
9526
+ Name => 'ISOAutoShutterTime', # shutter speed is 2 ** (-$val/24)
9527
+ ValueConv => '$val / 8',
9528
+ Format => 'int16s',
9529
+ PrintConv => \%iSOAutoShutterTimeZ9,
9530
+ },
9531
+ 432 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
9532
+ 434 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, # value can be set from both the Photo Shoot Menu and the Video Shooting Menu
9533
+ 436 => { Name => 'FlickerReductionShooting',PrintConv => \%offOn },
9534
+ 440 => {
9535
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
9536
+ RawConv => '$$self{FlashControlMode} = $val',
9537
+ PrintConv => \%flashControlModeZ7,
9538
+ },
9539
+ 548 => { Name => 'AFAreaMode', RawConv => '$$self{AFAreaMode} = $val', PrintConv => \%aFAreaModeZ9},
9540
+ 550 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
9541
+ 554 => {
9542
+ Name => 'BracketSet',
9543
+ RawConv => '$$self{BracketSet} = $val',
9544
+ PrintConv => \%bracketSetZ9,
9545
+ },
9546
+ 556 => {
9547
+ Name => 'BracketProgram',
9548
+ Condition => '$$self{BracketSet} < 3',
9549
+ Notes => 'AE and/or Flash Bracketing',
9550
+ PrintConv => \%bracketProgramZ9,
9551
+ },
9552
+ 558 => {
9553
+ Name => 'BracketIncrement',
9554
+ Condition => '$$self{BracketSet} < 3',
9555
+ Notes => 'AE and/or Flash Bracketing',
9556
+ PrintConv => \%bracketIncrementZ9,
9557
+ },
9558
+ 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 },
9559
+ #572 HDRSaveRaw 0=> No; 1=> Yes
9560
+ 576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
9561
+ 582 => { Name => 'HDRLevel', Condition => '$$self{HDR} ne 0', PrintConv => \%hdrLevelZ8 },
9562
+ 586 => { Name => 'Slot2JpgSize', PrintConv => { 0 => 'Large (8256x5504)', 1 => 'Medium (6192x4128)', 2 => 'Small (4128x2752)' }, Unknown => 1},
9563
+ 592 => { Name => 'DXCropAlert', PrintConv => \%offOn },
9564
+ 594 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
9565
+ 596 => {
9566
+ Name => 'DynamicAFAreaSize',
9567
+ Condition => '$$self{AFAreaMode} == 2',
9568
+ RawConv => '$$self{DynamicAFAreaSize} = $val',
9569
+ PrintConv => \%dynamicAfAreaModesZ9,
9570
+ },
9571
+ 618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9572
+ 622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9573
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9574
+ 730 => {
9575
+ Name => 'MovieImageArea',
9576
+ Unknown => 1,
9577
+ Mask => 0x01, # without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
9578
+ PrintConv => \%imageAreaZ9b,
9579
+ },
9580
+ #736 => { Name => 'MovieSlowMotion', PrintConv => \%movieSlowMotion, Unknown => 1 }, #only valid for MovieType H.264 8-bit
9581
+ 740 => { Name => 'MovieType', PrintConv => \%movieTypeZ9, Unknown => 1 },
9582
+ 742 => {
9583
+ Name => 'MovieISOAutoHiLimit',
9584
+ Format => 'int16u',
9585
+ Unknown => 1,
9586
+ ValueConv => '($val-104)/8',
9587
+ ValueConvInv => '8 * ($val + 104)',
9588
+ PrintConv => \%iSOAutoHiLimitZ7,
9589
+ },
9590
+ 744 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1 },
9591
+ 746 => {
9592
+ Name => 'MovieISOAutoManualMode',
9593
+ Format => 'int16u',
9594
+ Unknown => 1,
9595
+ ValueConv => '($val-104)/8',
9596
+ ValueConvInv => '8 * ($val + 104)',
9597
+ PrintConv => \%iSOAutoHiLimitZ7,
9598
+ },
9599
+ 820 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
9600
+ 822 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
9601
+ 828 => { Name => 'MovieFlickerReduction', PrintConv => \%movieFlickerReductionZ9 },
9602
+ 830 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, Unknown => 1 },
9603
+ 832 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
9604
+ 834 => { Name => 'MovieAFAreaMode', PrintConv => \%aFAreaModeZ9 },
9605
+ 836 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1 },
9606
+ 840 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9607
+ 842 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'Auto', 2 => 'Manual' }, Unknown => 1 },
9608
+ 844 => { Name => 'MicrophoneSensitivity', Unknown => 1 }, # 1-20
9609
+ 846 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9610
+ 848 => { Name => 'MicrophoneFrequencyResponse',PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
9611
+ 850 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
9612
+ 878 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
9613
+ 880 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
9614
+ 886 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
9615
+ 887 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
9616
+ 888 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1 },
9617
+ 896 => { Name => 'MovieHighResZoom', PrintConv => \%offOn, Unknown => 1 },
9618
+ 943 => {
9619
+ Name => 'CustomSettingsZ8',
9620
+ Format => 'undef[755]',
9621
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ8' },
9622
+ },
9623
+ 1698 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9624
+ 1700 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
9625
+ 1706 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
9626
+ 1728 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
9627
+ 1732 => { Name => 'NonCPULens1FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1}, #should probably hide altogther if $val is 0
9628
+ 1734 => { Name => 'NonCPULens2FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9629
+ 1736 => { Name => 'NonCPULens3FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9630
+ 1738 => { Name => 'NonCPULens4FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9631
+ 1740 => { Name => 'NonCPULens5FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9632
+ 1742 => { Name => 'NonCPULens6FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9633
+ 1744 => { Name => 'NonCPULens7FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9634
+ 1746 => { Name => 'NonCPULens8FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9635
+ 1748 => { Name => 'NonCPULens9FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9636
+ 1750 => { Name => 'NonCPULens10FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9637
+ 1752 => { Name => 'NonCPULens11FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9638
+ 1754 => { Name => 'NonCPULens12FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9639
+ 1756 => { Name => 'NonCPULens13FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9640
+ 1758 => { Name => 'NonCPULens14FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9641
+ 1760 => { Name => 'NonCPULens15FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9642
+ 1762 => { Name => 'NonCPULens16FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9643
+ 1764 => { Name => 'NonCPULens17FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9644
+ 1766 => { Name => 'NonCPULens18FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9645
+ 1768 => { Name => 'NonCPULens19FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9646
+ 1770 => { Name => 'NonCPULens20FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9647
+ 1812 => { Name => 'NonCPULens1MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9648
+ 1816 => { Name => 'NonCPULens2MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9649
+ 1820 => { Name => 'NonCPULens3MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9650
+ 1824 => { Name => 'NonCPULens4MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9651
+ 1828 => { Name => 'NonCPULens5MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9652
+ 1832 => { Name => 'NonCPULens6MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9653
+ 1836 => { Name => 'NonCPULens7MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9654
+ 1840 => { Name => 'NonCPULens8MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9655
+ 1844 => { Name => 'NonCPULens9MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9656
+ 1848 => { Name => 'NonCPULens10MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9657
+ 1852 => { Name => 'NonCPULens11MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9658
+ 1856 => { Name => 'NonCPULens12MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9659
+ 1860 => { Name => 'NonCPULens13MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9660
+ 1864 => { Name => 'NonCPULens14MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9661
+ 1868 => { Name => 'NonCPULens15MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9662
+ 1872 => { Name => 'NonCPULens16MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9663
+ 1876 => { Name => 'NonCPULens17MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9664
+ 1880 => { Name => 'NonCPULens18MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9665
+ 1884 => { Name => 'NonCPULens19MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9666
+ 1888 => { Name => 'NonCPULens20MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9667
+ 1824 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
9668
+ 1842 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
9669
+ 1843 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
9670
+ 1878 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
9671
+ 1906 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
9672
+ 1915 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
9673
+ 2046 => { Name => 'PixelShiftShooting', RawConv => '$$self{PixelShiftShooting} = $val', PrintConv => \%multipleExposureModeZ9 }, #off/on/on (series)
9674
+ 2048 => { Name => 'PixelShiftNumberShots', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftNumberShots },
9675
+ 2050 => { Name => 'PixelShiftDelay', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftDelay },
9676
+ 2052 => { Name => 'PlaybackButton', %buttonsZ9 }, #CSf2
9677
+ 2054 => { Name => 'WBButton', %buttonsZ9}, #CSf2
9678
+ 2056 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
9679
+ 2058 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ9}, #CSf2
9680
+ 2060 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ9}, #CSf2
9681
+ 2062 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ9}, #CSf2
9682
+ 2064 => { Name => 'BracketButtonPlaybackMode', %buttonsZ9}, #CSf2
9683
+ );
9387
9684
  %Image::ExifTool::Nikon::MenuSettingsZ9 = (
9388
9685
  %binaryDataAttrs,
9389
9686
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -9733,7 +10030,7 @@ my %nikonFocalConversions = (
9733
10030
  RawConv => '$$self{DynamicAFAreaSize} = $val',
9734
10031
  PrintConv => \%dynamicAfAreaModesZ9,
9735
10032
  },
9736
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
10033
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9737
10034
  646 => {
9738
10035
  Name => 'MovieImageArea',
9739
10036
  Unknown => 1,
@@ -9833,7 +10130,7 @@ my %nikonFocalConversions = (
9833
10130
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9834
10131
  DATAMEMBER => [ 154, 204, 208, 248, 328, 444, 548, 554, 570, 596 ],
9835
10132
  IS_SUBDIR => [ 847 ],
9836
- NOTES => 'These tags are used by the Z9 firmware 3.00.',
10133
+ NOTES => 'These tags are used by the Z9 firmware 4.0.0 and 4.1.0',
9837
10134
  72 => {
9838
10135
  Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
9839
10136
  PrintConv => \%highFrameRateZ9,
@@ -9970,7 +10267,7 @@ my %nikonFocalConversions = (
9970
10267
  RawConv => '$$self{DynamicAFAreaSize} = $val',
9971
10268
  PrintConv => \%dynamicAfAreaModesZ9,
9972
10269
  },
9973
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
10270
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9974
10271
  646 => {
9975
10272
  Name => 'MovieImageArea',
9976
10273
  Unknown => 1,
@@ -10116,6 +10413,18 @@ my %nikonFocalConversions = (
10116
10413
  Format => 'fixed32u',
10117
10414
  PrintConv => '$val ? sprintf("%.1f sec",$val/1000) : "Off"',
10118
10415
  },
10416
+ 2052 => { #CSf2-m3
10417
+ Name => 'CommandDialFrameAdvanceZoom',
10418
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10419
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
10420
+ Unknown => 1
10421
+ },
10422
+ 2054 => { #CSf2-n3
10423
+ Name => 'SubCommandDialFrameAdvanceZoom',
10424
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10425
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
10426
+ Unknown => 1
10427
+ },
10119
10428
  2056 => { Name => 'PlaybackButton', %buttonsZ9}, #CSf2
10120
10429
  2058 => { Name => 'WBButton', %buttonsZ9}, #CSf2
10121
10430
  2060 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
@@ -11406,7 +11715,7 @@ my %nikonFocalConversions = (
11406
11715
  },
11407
11716
  );
11408
11717
 
11409
- # MakerNotes0x56 - burst info for Z9
11718
+ # MakerNotes0x56 - burst info for Z8 and Z9
11410
11719
  %Image::ExifTool::Nikon::MakerNotes0x56 = (
11411
11720
  %binaryDataAttrs,
11412
11721
  GROUPS => { 0 => 'MakerNotes' },
@@ -11416,7 +11725,7 @@ my %nikonFocalConversions = (
11416
11725
  Writable => 0,
11417
11726
  },
11418
11727
  4 => {
11419
- 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. 0 for single-frame.
11728
+ 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.
11420
11729
  Format => 'int16u'
11421
11730
  },
11422
11731
  );
@@ -11440,7 +11749,7 @@ my %nikonFocalConversions = (
11440
11749
  Name => 'VignetteInfo', # Z-series vignette correction information
11441
11750
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VignetteInfo' },
11442
11751
  },
11443
- # 0x07 - undef[104]
11752
+ # 0x07 - undef[104] #possibly Z-series diffration correction information (#28)
11444
11753
  # 0x08 - undef[24]
11445
11754
  # 0x09 - undef[36]
11446
11755
  );