exiftool_vendored 12.80.0 → 12.81.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.31';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -890,6 +890,12 @@ my %bracketProgramZ9 = (
890
890
  9 => '9F',
891
891
  );
892
892
 
893
+ my %dialsFrameAdvanceZoomPositionZ9 = (
894
+ 0 => 'Hold',
895
+ 1 => 'Focus Point',
896
+ 2 => 'Face Priority',
897
+ );
898
+
893
899
  my %dynamicAfAreaModesZ9 = (
894
900
  0 => 'Small',
895
901
  1 => 'Medium',
@@ -949,6 +955,7 @@ my %highFrameRateZ9 = (
949
955
  3 => 'C30',
950
956
  5 => 'C60',
951
957
  4 => 'C120',
958
+ 6 => 'C15',
952
959
  );
953
960
 
954
961
  my %imageAreaD6 = (
@@ -1118,6 +1125,12 @@ my %movieFrameSizeZ9 = (
1118
1125
  3 => '7680x4320',
1119
1126
  );
1120
1127
 
1128
+ my %movieSlowMotion = (
1129
+ 0 => 'Off',
1130
+ 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]
1131
+ 2 => 'On (5x)', # 120p recording with playback @ 24p [1920 x 1080; 20p x 5]
1132
+ );
1133
+
1121
1134
  my %movieToneMapZ9 = (
1122
1135
  0 => 'SDR',
1123
1136
  1 => 'HLG',
@@ -1125,7 +1138,7 @@ my %movieToneMapZ9 = (
1125
1138
  );
1126
1139
 
1127
1140
  my %movieTypeZ9 = (
1128
- 1 => 'H.265 8-bit (MP4)',
1141
+ 1 => 'H.264 8-bit (MP4)',
1129
1142
  2 => 'H.265 8-bit (MOV)',
1130
1143
  3 => 'H.265 10-bit (MOV)',
1131
1144
  4 => 'ProRes 422 HQ 10-bit (MOV)',
@@ -1172,6 +1185,22 @@ my %offLowNormalHighZ7 = (
1172
1185
  3 => 'High',
1173
1186
  );
1174
1187
 
1188
+ my %pixelShiftDelay = (
1189
+ 0 => 'Off',
1190
+ 1 => '1 s',
1191
+ 2 => '2 s',
1192
+ 3 => '3 s',
1193
+ 4 => '5 s',
1194
+ 5 => '10 s',
1195
+ );
1196
+
1197
+ my %pixelShiftNumberShots = (
1198
+ 0 => '4',
1199
+ 1 => '8',
1200
+ 2 => '16',
1201
+ 3 => '32',
1202
+ );
1203
+
1175
1204
  my %portraitImpressionBalanceZ8 = (
1176
1205
  0 => 'Off',
1177
1206
  1 => 'Mode 1',
@@ -8382,7 +8411,7 @@ my %nikonFocalConversions = (
8382
8411
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8383
8412
  VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
8384
8413
  DATAMEMBER => [ 0x04 ],
8385
- IS_SUBDIR => [ 0x30, 0x84, 0x8c ],
8414
+ IS_SUBDIR => [ 0x30, 0x80, 0x84, 0x8c ],
8386
8415
  WRITABLE => 1,
8387
8416
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8388
8417
  NOTES => 'These tags are extracted from encrypted data in images from the Z8.',
@@ -8425,6 +8454,16 @@ my %nikonFocalConversions = (
8425
8454
  Start => '$val',
8426
8455
  },
8427
8456
  },
8457
+ 0x80 => {
8458
+ Name => 'AutoCaptureOffset',
8459
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.00"',
8460
+ Format => 'int32u',
8461
+ AlwaysDecrypt => 1, # (necessary because FirmwareVersion is extracted after decryption time)
8462
+ SubDirectory => {
8463
+ TagTable => 'Image::ExifTool::Nikon::AutoCaptureInfo',
8464
+ Start => '$val',
8465
+ },
8466
+ },
8428
8467
  0x84 => {
8429
8468
  Name => 'OrientOffset',
8430
8469
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
@@ -8709,13 +8748,24 @@ my %nikonFocalConversions = (
8709
8748
  0x10 => [
8710
8749
  {
8711
8750
  Name => 'MenuSettingsOffsetZ8',
8751
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} lt "02.00"',
8712
8752
  Format => 'int32u',
8713
- Notes => 'Firmware versions 1.0.0',
8753
+ Notes => 'Firmware versions 1.0.0 and 1.1.0',
8714
8754
  SubDirectory => {
8715
8755
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8',
8716
8756
  Start => '$dirStart + $val',
8717
8757
  },
8718
8758
  },
8759
+ {
8760
+ Name => 'MenuSettingsOffsetZ8v2',
8761
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "02.00"',
8762
+ Notes => 'Firmware version 2.0',
8763
+ Format => 'int32u',
8764
+ SubDirectory => {
8765
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ8v2',
8766
+ Start => '$dirStart + $val',
8767
+ },
8768
+ },
8719
8769
  ],
8720
8770
  );
8721
8771
 
@@ -9065,15 +9115,7 @@ my %nikonFocalConversions = (
9065
9115
  #463 => SilentPhotography
9066
9116
  502 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
9067
9117
  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
- },
9118
+ 506 => { Name => 'MovieSlowMotion', PrintConv => \%movieSlowMotion, Unknown => 1 },
9077
9119
  510 => {
9078
9120
  Name => 'MovieType',
9079
9121
  Unknown => 1,
@@ -9284,7 +9326,7 @@ my %nikonFocalConversions = (
9284
9326
  },
9285
9327
  618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9286
9328
  622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9287
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9329
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9288
9330
  730 => {
9289
9331
  Name => 'MovieImageArea',
9290
9332
  Unknown => 1,
@@ -9333,7 +9375,7 @@ my %nikonFocalConversions = (
9333
9375
  Format => 'undef[730]',
9334
9376
  SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ8' },
9335
9377
  },
9336
- 1682 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9378
+ 1698 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9337
9379
  1684 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
9338
9380
  1690 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
9339
9381
  1712 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
@@ -9384,6 +9426,260 @@ my %nikonFocalConversions = (
9384
9426
  1890 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
9385
9427
  1899 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
9386
9428
  );
9429
+ %Image::ExifTool::Nikon::MenuSettingsZ8v2 = (
9430
+ %binaryDataAttrs,
9431
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9432
+ DATAMEMBER => [ 152, 200, 204, 244, 440, 548, 554, 570, 596, 2046 ],
9433
+ IS_SUBDIR => [ 943 ],
9434
+ NOTES => 'These tags are used by the Z8 firmware 1.00.',
9435
+ 72 => {
9436
+ Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
9437
+ PrintConv => \%highFrameRateZ9,
9438
+ },
9439
+ 152 => {
9440
+ Name => 'MultipleExposureMode',
9441
+ RawConv => '$$self{MultipleExposureMode} = $val',
9442
+ PrintConv => \%multipleExposureModeZ9,
9443
+ },
9444
+ 154 => {Name => 'MultiExposureShots', Condition => '$$self{MultipleExposureMode} != 0'}, #range 2-9
9445
+ 184 => {
9446
+ Name => 'IntervalDurationHours',
9447
+ Format => 'int32u',
9448
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9449
+ },
9450
+ 188 => {
9451
+ Name => 'IntervalDurationMinutes',
9452
+ Format => 'int32u',
9453
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9454
+ },
9455
+ 192 => {
9456
+ Name => 'IntervalDurationSeconds',
9457
+ Format => 'int32u',
9458
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9459
+ },
9460
+ 200 => {
9461
+ Name => 'Intervals',
9462
+ Format => 'int32u',
9463
+ RawConv => '$$self{IntervalShootingIntervals} = $val',
9464
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9465
+ },
9466
+ 204 => {
9467
+ Name => 'ShotsPerInterval',
9468
+ Format => 'int32u',
9469
+ RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
9470
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9471
+ },
9472
+ 208 => {
9473
+ Name => 'IntervalExposureSmoothing',
9474
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9475
+ Format => 'int8u',
9476
+ PrintConv => \%offOn,
9477
+ },
9478
+ 210 => {
9479
+ Name => 'IntervalPriority',
9480
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0',
9481
+ Format => 'int8u',
9482
+ PrintConv => \%offOn,
9483
+ },
9484
+ 244 => {
9485
+ Name => 'FocusShiftNumberShots', #1-300
9486
+ RawConv => '$$self{FocusShiftNumberShots} = $val',
9487
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9488
+ },
9489
+ 248 => {
9490
+ Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
9491
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9492
+ },
9493
+ 252 => {
9494
+ Name => 'FocusShiftInterval',
9495
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9496
+ PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
9497
+ },
9498
+ 256 => {
9499
+ Name => 'FocusShiftExposureLock',
9500
+ Unknown => 1,
9501
+ PrintConv => \%offOn,
9502
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9503
+ },
9504
+ 286 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
9505
+ 288 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
9506
+ 324 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
9507
+ 338 => { Name => 'AutoISO', PrintConv => \%offOn },
9508
+ 340 => {
9509
+ Name => 'ISOAutoHiLimit',
9510
+ Format => 'int16u',
9511
+ Unknown => 1,
9512
+ ValueConv => '($val-104)/8',
9513
+ ValueConvInv => '8 * ($val + 104)',
9514
+ PrintConv => \%iSOAutoHiLimitZ7,
9515
+ },
9516
+ 342 => {
9517
+ Name => 'ISOAutoFlashLimit',
9518
+ Format => 'int16u',
9519
+ Unknown => 1,
9520
+ ValueConv => '($val-104)/8',
9521
+ ValueConvInv => '8 * ($val + 104)',
9522
+ PrintConv => \%iSOAutoHiLimitZ7,
9523
+ },
9524
+ 350 => {
9525
+ Name => 'ISOAutoShutterTime', # shutter speed is 2 ** (-$val/24)
9526
+ ValueConv => '$val / 8',
9527
+ Format => 'int16s',
9528
+ PrintConv => \%iSOAutoShutterTimeZ9,
9529
+ },
9530
+ 432 => { Name => 'MovieVignetteControl', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
9531
+ 434 => { Name => 'DiffractionCompensation', PrintConv => \%offOn }, # value can be set from both the Photo Shoot Menu and the Video Shooting Menu
9532
+ 436 => { Name => 'FlickerReductionShooting',PrintConv => \%offOn },
9533
+ 440 => {
9534
+ Name => 'FlashControlMode', # this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
9535
+ RawConv => '$$self{FlashControlMode} = $val',
9536
+ PrintConv => \%flashControlModeZ7,
9537
+ },
9538
+ 548 => { Name => 'AFAreaMode', RawConv => '$$self{AFAreaMode} = $val', PrintConv => \%aFAreaModeZ9},
9539
+ 550 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
9540
+ 554 => {
9541
+ Name => 'BracketSet',
9542
+ RawConv => '$$self{BracketSet} = $val',
9543
+ PrintConv => \%bracketSetZ9,
9544
+ },
9545
+ 556 => {
9546
+ Name => 'BracketProgram',
9547
+ Condition => '$$self{BracketSet} < 3',
9548
+ Notes => 'AE and/or Flash Bracketing',
9549
+ PrintConv => \%bracketProgramZ9,
9550
+ },
9551
+ 558 => {
9552
+ Name => 'BracketIncrement',
9553
+ Condition => '$$self{BracketSet} < 3',
9554
+ Notes => 'AE and/or Flash Bracketing',
9555
+ PrintConv => \%bracketIncrementZ9,
9556
+ },
9557
+ 570 => { Name => 'HDR', RawConv => '$$self{HDR} = $val', PrintConv => \%multipleExposureModeZ9 },
9558
+ #572 HDRSaveRaw 0=> No; 1=> Yes
9559
+ 576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
9560
+ 582 => { Name => 'HDRLevel', Condition => '$$self{HDR} ne 0', PrintConv => \%hdrLevelZ8 },
9561
+ 586 => { Name => 'Slot2JpgSize', PrintConv => { 0 => 'Large (8256x5504)', 1 => 'Medium (6192x4128)', 2 => 'Small (4128x2752)' }, Unknown => 1},
9562
+ 592 => { Name => 'DXCropAlert', PrintConv => \%offOn },
9563
+ 594 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
9564
+ 596 => {
9565
+ Name => 'DynamicAFAreaSize',
9566
+ Condition => '$$self{AFAreaMode} == 2',
9567
+ RawConv => '$$self{DynamicAFAreaSize} = $val',
9568
+ PrintConv => \%dynamicAfAreaModesZ9,
9569
+ },
9570
+ 618 => { Name => 'ToneMap', PrintConv => { 0 => 'SDR', 1 => 'HLG' }, Unknown => 1 },
9571
+ 622 => { Name => 'PortraitImpressionBalance', PrintConv => \%portraitImpressionBalanceZ8 },
9572
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9573
+ 730 => {
9574
+ Name => 'MovieImageArea',
9575
+ Unknown => 1,
9576
+ Mask => 0x01, # without the mask 4 => 'FX' 5 => DX only the 2nd Z-series field encountered with a mask.
9577
+ PrintConv => \%imageAreaZ9b,
9578
+ },
9579
+ #736 => { Name => 'MovieSlowMotion', PrintConv => \%movieSlowMotion, Unknown => 1 }, #only valid for MovieType H.264 8-bit
9580
+ 740 => { Name => 'MovieType', PrintConv => \%movieTypeZ9, Unknown => 1 },
9581
+ 742 => {
9582
+ Name => 'MovieISOAutoHiLimit',
9583
+ Format => 'int16u',
9584
+ Unknown => 1,
9585
+ ValueConv => '($val-104)/8',
9586
+ ValueConvInv => '8 * ($val + 104)',
9587
+ PrintConv => \%iSOAutoHiLimitZ7,
9588
+ },
9589
+ 744 => { Name => 'MovieISOAutoControlManualMode', PrintConv => \%offOn, Unknown => 1 },
9590
+ 746 => {
9591
+ Name => 'MovieISOAutoManualMode',
9592
+ Format => 'int16u',
9593
+ Unknown => 1,
9594
+ ValueConv => '($val-104)/8',
9595
+ ValueConvInv => '8 * ($val + 104)',
9596
+ PrintConv => \%iSOAutoHiLimitZ7,
9597
+ },
9598
+ 820 => { Name => 'MovieActiveD-Lighting', PrintConv => \%activeDLightingZ7, Unknown => 1 },
9599
+ 822 => { Name => 'MovieHighISONoiseReduction', PrintConv => \%offLowNormalHighZ7, Unknown => 1 },
9600
+ 828 => { Name => 'MovieFlickerReduction', PrintConv => \%movieFlickerReductionZ9 },
9601
+ 830 => { Name => 'MovieMeteringMode', PrintConv => \%meteringModeZ7, Unknown => 1 },
9602
+ 832 => { Name => 'MovieFocusMode', PrintConv => \%focusModeZ7, Unknown => 1 },
9603
+ 834 => { Name => 'MovieAFAreaMode', PrintConv => \%aFAreaModeZ9 },
9604
+ 836 => { Name => 'MovieVRMode', PrintConv => \%vRModeZ9, Unknown => 1 },
9605
+ 840 => { Name => 'MovieElectronicVR', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9606
+ 842 => { Name => 'MovieSoundRecording', PrintConv => { 0 => 'Off', 1 => 'Auto', 2 => 'Manual' }, Unknown => 1 },
9607
+ 844 => { Name => 'MicrophoneSensitivity', Unknown => 1 }, # 1-20
9608
+ 846 => { Name => 'MicrophoneAttenuator', PrintConv => \%offOn, Unknown => 1 }, # distinct from MoveieVRMode
9609
+ 848 => { Name => 'MicrophoneFrequencyResponse',PrintConv => { 0 => 'Wide Range', 1 => 'Vocal Range' }, Unknown => 1 },
9610
+ 850 => { Name => 'WindNoiseReduction', PrintConv => \%offOn, Unknown => 1 },
9611
+ 878 => { Name => 'MovieFrameSize', PrintConv => \%movieFrameSizeZ9, Unknown => 1 },
9612
+ 880 => { Name => 'MovieFrameRate', PrintConv => \%movieFrameRateZ7, Unknown => 1 },
9613
+ 886 => { Name => 'MicrophoneJackPower', PrintConv => \%offOn, Unknown => 1 },
9614
+ 887 => { Name => 'MovieDXCropAlert', PrintConv => \%offOn, Unknown => 1 },
9615
+ 888 => { Name => 'MovieSubjectDetection', PrintConv => \%subjectDetectionZ9, Unknown => 1 },
9616
+ 896 => { Name => 'MovieHighResZoom', PrintConv => \%offOn, Unknown => 1 },
9617
+ 943 => {
9618
+ Name => 'CustomSettingsZ8',
9619
+ Format => 'undef[755]',
9620
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsZ8' },
9621
+ },
9622
+ 1698 => { Name => 'Language', PrintConv => \%languageZ9, Unknown => 1 },
9623
+ 1700 => { Name => 'TimeZone', PrintConv => \%timeZoneZ9 },
9624
+ 1706 => { Name => 'MonitorBrightness', PrintConv => \%monitorBrightnessZ9, Unknown => 1 }, # settings: -5 to +5. Added with firmware 3.0: Lo1, Lo2, Hi1, Hi2
9625
+ 1728 => { Name => 'AFFineTune', PrintConv => \%offOn, Unknown => 1 },
9626
+ 1732 => { Name => 'NonCPULens1FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1}, #should probably hide altogther if $val is 0
9627
+ 1734 => { Name => 'NonCPULens2FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9628
+ 1736 => { Name => 'NonCPULens3FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9629
+ 1738 => { Name => 'NonCPULens4FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9630
+ 1740 => { Name => 'NonCPULens5FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9631
+ 1742 => { Name => 'NonCPULens6FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9632
+ 1744 => { Name => 'NonCPULens7FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9633
+ 1746 => { Name => 'NonCPULens8FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9634
+ 1748 => { Name => 'NonCPULens9FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9635
+ 1750 => { Name => 'NonCPULens10FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9636
+ 1752 => { Name => 'NonCPULens11FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9637
+ 1754 => { Name => 'NonCPULens12FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9638
+ 1756 => { Name => 'NonCPULens13FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9639
+ 1758 => { Name => 'NonCPULens14FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9640
+ 1760 => { Name => 'NonCPULens15FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9641
+ 1762 => { Name => 'NonCPULens16FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9642
+ 1764 => { Name => 'NonCPULens17FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9643
+ 1766 => { Name => 'NonCPULens18FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9644
+ 1768 => { Name => 'NonCPULens19FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9645
+ 1770 => { Name => 'NonCPULens20FocalLength', Format => 'int16u', PrintConv => 'sprintf("%.1fmm",$val/10)', Unknown => 1},
9646
+ 1812 => { Name => 'NonCPULens1MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9647
+ 1816 => { Name => 'NonCPULens2MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9648
+ 1820 => { Name => 'NonCPULens3MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9649
+ 1824 => { Name => 'NonCPULens4MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9650
+ 1828 => { Name => 'NonCPULens5MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9651
+ 1832 => { Name => 'NonCPULens6MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9652
+ 1836 => { Name => 'NonCPULens7MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9653
+ 1840 => { Name => 'NonCPULens8MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9654
+ 1844 => { Name => 'NonCPULens9MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9655
+ 1848 => { Name => 'NonCPULens10MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9656
+ 1852 => { Name => 'NonCPULens11MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9657
+ 1856 => { Name => 'NonCPULens12MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9658
+ 1860 => { Name => 'NonCPULens13MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9659
+ 1864 => { Name => 'NonCPULens14MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9660
+ 1868 => { Name => 'NonCPULens15MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9661
+ 1872 => { Name => 'NonCPULens16MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9662
+ 1876 => { Name => 'NonCPULens17MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9663
+ 1880 => { Name => 'NonCPULens18MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9664
+ 1884 => { Name => 'NonCPULens19MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9665
+ 1888 => { Name => 'NonCPULens20MaxAperture', Format => 'int32u', PrintConv => 'sprintf("%.1fmm",$val/100)', Unknown => 1},
9666
+ 1824 => { Name => 'HDMIOutputResolution', PrintConv => \%hDMIOutputResolutionZ9 },
9667
+ 1842 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
9668
+ 1843 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
9669
+ 1878 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
9670
+ 1906 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
9671
+ 1915 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
9672
+ 2046 => { Name => 'PixelShiftShooting', RawConv => '$$self{PixelShiftShooting} = $val', PrintConv => \%multipleExposureModeZ9 }, #off/on/on (series)
9673
+ 2048 => { Name => 'PixelShiftNumberShots', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftNumberShots },
9674
+ 2050 => { Name => 'PixelShiftDelay', Condition => '$$self{PixelShiftShooting} > 0', PrintConv => \%pixelShiftDelay },
9675
+ 2052 => { Name => 'PlaybackButton', %buttonsZ9 }, #CSf2
9676
+ 2054 => { Name => 'WBButton', %buttonsZ9}, #CSf2
9677
+ 2056 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
9678
+ 2058 => { Name => 'LensFunc1ButtonPlaybackMode', %buttonsZ9}, #CSf2
9679
+ 2060 => { Name => 'LensFunc2ButtonPlaybackMode', %buttonsZ9}, #CSf2
9680
+ 2062 => { Name => 'PlaybackButtonPlaybackMode', %buttonsZ9}, #CSf2
9681
+ 2064 => { Name => 'BracketButtonPlaybackMode', %buttonsZ9}, #CSf2
9682
+ );
9387
9683
  %Image::ExifTool::Nikon::MenuSettingsZ9 = (
9388
9684
  %binaryDataAttrs,
9389
9685
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -9733,7 +10029,7 @@ my %nikonFocalConversions = (
9733
10029
  RawConv => '$$self{DynamicAFAreaSize} = $val',
9734
10030
  PrintConv => \%dynamicAfAreaModesZ9,
9735
10031
  },
9736
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
10032
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9737
10033
  646 => {
9738
10034
  Name => 'MovieImageArea',
9739
10035
  Unknown => 1,
@@ -9833,7 +10129,7 @@ my %nikonFocalConversions = (
9833
10129
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9834
10130
  DATAMEMBER => [ 154, 204, 208, 248, 328, 444, 548, 554, 570, 596 ],
9835
10131
  IS_SUBDIR => [ 847 ],
9836
- NOTES => 'These tags are used by the Z9 firmware 3.00.',
10132
+ NOTES => 'These tags are used by the Z9 firmware 4.0.0 and 4.1.0',
9837
10133
  72 => {
9838
10134
  Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
9839
10135
  PrintConv => \%highFrameRateZ9,
@@ -9970,7 +10266,7 @@ my %nikonFocalConversions = (
9970
10266
  RawConv => '$$self{DynamicAFAreaSize} = $val',
9971
10267
  PrintConv => \%dynamicAfAreaModesZ9,
9972
10268
  },
9973
- 636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
10269
+ 636 => { Name => 'HighFrequencyFlickerReduction', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
9974
10270
  646 => {
9975
10271
  Name => 'MovieImageArea',
9976
10272
  Unknown => 1,
@@ -10116,6 +10412,18 @@ my %nikonFocalConversions = (
10116
10412
  Format => 'fixed32u',
10117
10413
  PrintConv => '$val ? sprintf("%.1f sec",$val/1000) : "Off"',
10118
10414
  },
10415
+ 2052 => { #CSf2-m3
10416
+ Name => 'CommandDialFrameAdvanceZoom',
10417
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10418
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
10419
+ Unknown => 1
10420
+ },
10421
+ 2054 => { #CSf2-n3
10422
+ Name => 'SubCommandDialFrameAdvanceZoom',
10423
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10424
+ PrintConv => \%dialsFrameAdvanceZoomPositionZ9,
10425
+ Unknown => 1
10426
+ },
10119
10427
  2056 => { Name => 'PlaybackButton', %buttonsZ9}, #CSf2
10120
10428
  2058 => { Name => 'WBButton', %buttonsZ9}, #CSf2
10121
10429
  2060 => { Name => 'BracketButton', %buttonsZ9}, #CSf2
@@ -11406,7 +11714,7 @@ my %nikonFocalConversions = (
11406
11714
  },
11407
11715
  );
11408
11716
 
11409
- # MakerNotes0x56 - burst info for Z9
11717
+ # MakerNotes0x56 - burst info for Z8 and Z9
11410
11718
  %Image::ExifTool::Nikon::MakerNotes0x56 = (
11411
11719
  %binaryDataAttrs,
11412
11720
  GROUPS => { 0 => 'MakerNotes' },
@@ -11416,7 +11724,7 @@ my %nikonFocalConversions = (
11416
11724
  Writable => 0,
11417
11725
  },
11418
11726
  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.
11727
+ 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
11728
  Format => 'int16u'
11421
11729
  },
11422
11730
  );
@@ -11440,7 +11748,7 @@ my %nikonFocalConversions = (
11440
11748
  Name => 'VignetteInfo', # Z-series vignette correction information
11441
11749
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VignetteInfo' },
11442
11750
  },
11443
- # 0x07 - undef[104]
11751
+ # 0x07 - undef[104] #possibly Z-series diffration correction information (#28)
11444
11752
  # 0x08 - undef[24]
11445
11753
  # 0x09 - undef[36]
11446
11754
  );