exiftool_vendored 12.80.0 → 12.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  );