exiftool_vendored 12.54.0 → 12.56.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -64,7 +64,7 @@ use Image::ExifTool::Exif;
64
64
  use Image::ExifTool::GPS;
65
65
  use Image::ExifTool::XMP;
66
66
 
67
- $VERSION = '4.16';
67
+ $VERSION = '4.18';
68
68
 
69
69
  sub LensIDConv($$$);
70
70
  sub ProcessNikonAVI($$$);
@@ -919,6 +919,14 @@ my %hDMIOutputResolutionZ9 = (
919
919
  #7 => '480p',
920
920
  );
921
921
 
922
+ my %highFrameRateZ9 = (
923
+ 0 => 'Off',
924
+ 1 => 'CH',
925
+ 3 => 'C30',
926
+ 5 => 'C60',
927
+ 4 => 'C120',
928
+ );
929
+
922
930
  my %imageAreaZ9 = (
923
931
  0 => 'FX',
924
932
  1 => 'DX',
@@ -1651,7 +1659,7 @@ my %base64coord = (
1651
1659
  0x0019 => { #5
1652
1660
  Name => 'ExposureBracketValue',
1653
1661
  Writable => 'rational64s',
1654
- PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
1662
+ PrintConv => '$val !~ /undef/ ? Image::ExifTool::Exif::PrintFraction($val) : "n/a" ', #undef observed for Z9 jpgs at C30/C60/C90 [data is 0/0 rather than the usual 0/6]
1655
1663
  PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
1656
1664
  },
1657
1665
  0x001a => { #PH
@@ -1803,6 +1811,7 @@ my %base64coord = (
1803
1811
  0x0034 => { #forum9646
1804
1812
  Name => 'ShutterMode',
1805
1813
  Writable => 'int16u',
1814
+ RawConv => '$$self{ShutterMode} = $val',
1806
1815
  PrintConv => {
1807
1816
  0 => 'Mechanical',
1808
1817
  16 => 'Electronic',
@@ -1811,6 +1820,7 @@ my %base64coord = (
1811
1820
  64 => 'Electronic (Movie)', #JanSkoda (Z6II)
1812
1821
  80 => 'Auto (Mechanical)', #JanSkoda (Z6II)
1813
1822
  81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II)
1823
+ 96 => 'Electronic (High Speed)', #28 Z9 at C30/C60/C120 frame rates
1814
1824
  },
1815
1825
  },
1816
1826
  0x0035 => [{ #32
@@ -1874,6 +1884,14 @@ my %base64coord = (
1874
1884
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MakerNotes0x51' },
1875
1885
  },
1876
1886
  #0x0053 #28 possibly a secondary DistortionControl block (in addition to DistortInfo)? Certainly offset 0x04 within block contains tag AutoDistortionControl for Z72 and D6 (1=>On; 2=> Off)
1887
+ 0x0056 => { #28 (Z9)
1888
+ Name => 'MakerNotes0x56',
1889
+ Writable => 'undef',
1890
+ Hidden => 1,
1891
+ Permanent => 0,
1892
+ Flags => [ 'Binary', 'Protected' ],
1893
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::MakerNotes0x56' },
1894
+ },
1877
1895
  #0x005e #28 possibly DiffractionCompensation block? Certainly offset 0x04 within block contains tag DiffractionCompensation
1878
1896
  0x0080 => { Name => 'ImageAdjustment', Writable => 'string' },
1879
1897
  0x0081 => { Name => 'ToneComp', Writable => 'string' }, #2
@@ -2003,6 +2021,7 @@ my %base64coord = (
2003
2021
  6 => 'White-Balance Bracketing',
2004
2022
  7 => 'IR Control',
2005
2023
  8 => 'D-Lighting Bracketing', #forum6281 (NC)
2024
+ 11 => 'Pre-capture', #28 Z9 pre-release burst
2006
2025
  });
2007
2026
  ],
2008
2027
  },
@@ -4292,10 +4311,10 @@ my %base64coord = (
4292
4311
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4293
4312
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
4294
4313
  },
4295
- Format => 'int16u',
4314
+ Format => 'int16u', # (decodes same byte as 0x2f)
4296
4315
  },
4297
4316
  0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4298
- Name => 'AFFocusPointXPosition',
4317
+ Name => 'FocusPositionHorizontal',
4299
4318
  Condition => q{
4300
4319
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4301
4320
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
@@ -4309,7 +4328,7 @@ my %base64coord = (
4309
4328
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4310
4329
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
4311
4330
  },
4312
- Format => 'int16u',
4331
+ Format => 'int16u', # (decodes same byte as 0x31)
4313
4332
  },{ #PH (D500, see forum11190)
4314
4333
  Name => 'AFPointsInFocus',
4315
4334
  Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
@@ -4322,7 +4341,7 @@ my %base64coord = (
4322
4341
  },
4323
4342
  ],
4324
4343
  0x31 => { #28 (Z7)
4325
- Name => 'AFFocusPointYPosition',
4344
+ Name => 'FocusPositionVertical',
4326
4345
  Condition => q{
4327
4346
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4328
4347
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
@@ -4452,6 +4471,21 @@ my %base64coord = (
4452
4471
  Writable => 0,
4453
4472
  RawConv => '$$self{AFInfo2Version} = $val',
4454
4473
  },
4474
+ 5 => { #28
4475
+ Name => 'AFAreaMode', #reflects the mode active when the shutter is tripped, not the position of the Focus Mode button (which is recorded in MenuSettingsZ9 tag also named AfAreaMode)
4476
+ PrintConv => {
4477
+ 192 => 'Pinpoint',
4478
+ 193 => 'Single',
4479
+ 195 => 'Wide (S)',
4480
+ 196 => 'Wide (L)',
4481
+ 197 => 'Auto',
4482
+ 204 => 'Dynamic Area (S)',
4483
+ 205 => 'Dynamic Area (M)',
4484
+ 206 => 'Dynamic Area (L)',
4485
+ 207 => '3D-tracking',
4486
+ 208 => 'Wide (C1/C2)',
4487
+ },
4488
+ },
4455
4489
  0x3e => {
4456
4490
  Name => 'AFImageWidth',
4457
4491
  Format => 'int16u',
@@ -4460,6 +4494,11 @@ my %base64coord = (
4460
4494
  Name => 'AFImageHeight',
4461
4495
  Format => 'int16u',
4462
4496
  },
4497
+ 0x42 => { #28
4498
+ Name => 'AFAreaXPosition', #top left image corner is the origin
4499
+ Format => 'int16u', # (decodes same byte as 0x43)
4500
+ RawConv => '$val ? $val : undef',
4501
+ },
4463
4502
  0x43 => {
4464
4503
  Name => 'FocusPositionHorizontal',
4465
4504
  Notes => q{
@@ -4471,6 +4510,11 @@ my %base64coord = (
4471
4510
  # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
4472
4511
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
4473
4512
  },
4513
+ 0x44 => { #28
4514
+ Name => 'AFAreaYPosition',
4515
+ Format => 'int16u', # (decodes same byte as 0x45)
4516
+ RawConv => '$val ? $val : undef',
4517
+ },
4474
4518
  0x45 => {
4475
4519
  Name => 'FocusPositionVertical',
4476
4520
  # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
@@ -5260,6 +5304,7 @@ my %nikonFocalConversions = (
5260
5304
  22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
5261
5305
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
5262
5306
  24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
5307
+ 25 => 'Nikkor Z 40mm f/2', #28
5263
5308
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
5264
5309
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
5265
5310
  29 => 'Nikkor Z 28mm f/2.8', #IB
@@ -5267,7 +5312,10 @@ my %nikonFocalConversions = (
5267
5312
  31 => 'Nikkor Z 24-120 f/4', #28
5268
5313
  32 => 'Nikkor Z 800mm f/6.3 VR S', #28
5269
5314
  36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
5315
+ 37 => 'Nikkor Z 600mm f/4 TC VR S', #28
5270
5316
  39 => 'Nikkor Z 17-28mm f/2.8', #IB
5317
+ 32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
5318
+ 32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
5271
5319
  },
5272
5320
  },
5273
5321
  0x35 => { #28
@@ -8309,9 +8357,9 @@ my %nikonFocalConversions = (
8309
8357
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
8310
8358
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8311
8359
  VARS => { ID_LABEL => 'Index' },
8312
- DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
8313
- 0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
8314
- IS_SUBDIR => [ 0xec4b ],
8360
+ DATAMEMBER => [ 0x04, 0x30, 0x84, 0x8c,0x93, 0xb4, 0xbc, 0xbe,
8361
+ 0x4410, 0x4411, 0x80c4, 0x8149, 0x814a ],
8362
+ IS_SUBDIR => [ 0x44ec, 0x8225 ],
8315
8363
  WRITABLE => 1,
8316
8364
  FIRST_ENTRY => 0,
8317
8365
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8348,20 +8396,12 @@ my %nikonFocalConversions = (
8348
8396
  Hidden => 1,
8349
8397
  },
8350
8398
  0x30 => {
8351
- Name => 'Offset3', #offset3 - length 2528 (Z9 firmware 1.0)
8352
- DataMember => 'Offset3',
8399
+ Name => 'SequenceOffset', #offset3 - length 2528 (Z9 firmware 1.0)
8400
+ DataMember => 'SequenceOffset',
8353
8401
  Format => 'int32u',
8354
8402
  Writable => 0,
8355
8403
  Hidden => 1,
8356
- RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
8357
- },
8358
- 0x38 => {
8359
- Name => 'Offset5', #offset5 - length 2488 (Z9 firmware 1.0)
8360
- DataMember => 'Offset5',
8361
- Format => 'int32u',
8362
- Writable => 0,
8363
- Hidden => 1,
8364
- RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
8404
+ RawConv => '$$self{SequenceOffset} = $val || 0x10000000; undef', # (ignore if 0)
8365
8405
  },
8366
8406
  0x84 => {
8367
8407
  Name => 'OrientationOffset', #offset24 - length 108 (Z9 firmware 1.0)
@@ -8372,23 +8412,25 @@ my %nikonFocalConversions = (
8372
8412
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
8373
8413
  },
8374
8414
  0x8c => {
8375
- Name => 'Offset26', #offset26 - length 1895 (Z9 firmware 1.0)
8376
- DataMember => 'Offset26',
8415
+ Name => 'MenuOffset', #offset26 - length 1895 (Z9 firmware 1.0)
8416
+ DataMember => 'MenuOffset6',
8377
8417
  Format => 'int32u',
8378
8418
  Writable => 0,
8379
8419
  Hidden => 1,
8380
- RawConv => '$$self{Offset26} = $val || 0x10000000; undef', # (ignore if 0)
8420
+ RawConv => '$$self{MenuOffset} = $val || 0x10000000; undef', # (ignore if 0)
8381
8421
  },
8382
- ### 0x6c70 - Offset3 info start (Z9 firmware 1.00)
8383
- 0x6c6f => {
8384
- Name => 'Offset3Hook',
8422
+ ### 0x0094 - SequenceOffset info start (Z9 firmware 1.00)
8423
+ 0x0093 => {
8424
+ Name => 'SequenceOffsetHook',
8425
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8385
8426
  Hidden => 1,
8386
8427
  RawConv => 'undef',
8387
- # account for variable location of Offset3 data
8388
- Hook => '$varSize = $$self{Offset3} - 0x6c70',
8428
+ # account for variable location of SequenceOffset data
8429
+ Hook => '$varSize = $$self{SequenceOffset} - 0x0094',
8389
8430
  },
8390
- 0x6c90 => {
8431
+ 0x00b4 => {
8391
8432
  Name => 'FocusShiftShooting',
8433
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8392
8434
  RawConv => '$$self{FocusShiftShooting} = $val',
8393
8435
  PrintConv => q{
8394
8436
  return 'Off' if $val == 0 ;
@@ -8396,8 +8438,9 @@ my %nikonFocalConversions = (
8396
8438
  return "On: $i"
8397
8439
  },
8398
8440
  },
8399
- 0x6c98 => {
8441
+ 0x00bc => {
8400
8442
  Name => 'IntervalShooting',
8443
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8401
8444
  RawConv => '$$self{IntervalShooting} = $val',
8402
8445
  Format => 'int16u',
8403
8446
  PrintConv => q{
@@ -8408,32 +8451,73 @@ my %nikonFocalConversions = (
8408
8451
  #$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
8409
8452
  },
8410
8453
  },
8411
- 0x6c9a => {
8454
+ 0x00be => {
8455
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8412
8456
  Name => 'IntervalFrame',
8413
8457
  RawConv => '$$self{IntervalFrame} = $val',
8414
- Condition => '$$self{IntervalShooting} > 0',
8458
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8415
8459
  Format => 'int16u',
8416
8460
  Hidden => 1,
8417
8461
  },
8418
- ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8419
- 0xeaea => {
8462
+ ### 0x4400 - Offset26 info start (Z9 firmware 3.01 C30/C60/C120 )
8463
+ 0x4410 => {
8464
+ Name => 'MenuSettingsZ9Offset',
8465
+ Condition => '$$self{ShutterMode} eq 96', # C30/C60/C120 jpgs only
8466
+ Writable => 0,
8467
+ Hidden => 1,
8468
+ # offset to MenuSettingsZ9 is relative to start of Offset26 block
8469
+ RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{MenuOffset}; undef', # (ignore if 0)
8470
+ },
8471
+ 0x4411 => {
8472
+ Name => 'Hook5',
8473
+ Condition => '$$self{ShutterMode} eq 96', # C30/C60/C120 jpgs only
8474
+ Hidden => 1,
8475
+ RawConv => 'undef',
8476
+ # account for variable location of menu settings data
8477
+ Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0x44ec',
8478
+ },
8479
+ 0x44ec => [
8480
+ {
8481
+ Name => 'MenuSettingsZ9',
8482
+ Condition => '$$self{ShutterMode} eq 96 and $$self{FirmwareVersion} lt "03.00"', # C30/C60/C120 jpgs only
8483
+ Format => 'undef[1646]',
8484
+ Notes => 'Firmware versions 2.11 and earlier',
8485
+ SubDirectory => {
8486
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
8487
+ },
8488
+ },
8489
+ {
8490
+ Name => 'MenuSettingsZ9',
8491
+ Notes => 'Firmware versions 3.0 and later',
8492
+ Condition => '$$self{ShutterMode} eq 96', # C30/C60/C120 jpgs only
8493
+ Format => 'undef[1948]',
8494
+ SubDirectory => {
8495
+ TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9Firmware3',
8496
+ },
8497
+ },
8498
+ ],
8499
+ ### 0x80c5 - OrientationInfo start (Z9 firmware 3.01)
8500
+ 0x80c4 => {
8420
8501
  Name => 'OrientationHook',
8502
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8421
8503
  Hidden => 1,
8422
8504
  RawConv => 'undef',
8423
8505
  # account for variable location of OrientationInfo data
8424
- Hook => '$varSize = $$self{OrientationOffset} - 0xeaeb',
8506
+ Hook => '$varSize = $$self{OrientationOffset} - 0x80c5',
8425
8507
  },
8426
- 0xeaeb => {
8508
+ 0x80c5 => {
8427
8509
  Name => 'RollAngle',
8428
- Format => 'fixed32u',
8510
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8511
+ Format => 'fixed32u',
8429
8512
  Notes => 'converted to degrees of clockwise camera roll',
8430
8513
  ValueConv => '$val <= 180 ? $val : $val - 360',
8431
8514
  ValueConvInv => '$val >= 0 ? $val : $val + 360',
8432
8515
  PrintConv => 'sprintf("%.1f", $val)',
8433
8516
  PrintConvInv => '$val',
8434
8517
  },
8435
- 0xeaef => {
8518
+ 0x80c9 => {
8436
8519
  Name => 'PitchAngle',
8520
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8437
8521
  Format => 'fixed32u',
8438
8522
  Notes => 'converted to degrees of upward camera tilt',
8439
8523
  ValueConv => '$val <= 180 ? $val : $val - 360',
@@ -8441,8 +8525,9 @@ my %nikonFocalConversions = (
8441
8525
  PrintConv => 'sprintf("%.1f", $val)',
8442
8526
  PrintConvInv => '$val',
8443
8527
  },
8444
- 0xeaf3 => {
8528
+ 0x80cd => {
8445
8529
  Name => 'YawAngle',
8530
+ Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8446
8531
  Format => 'fixed32u',
8447
8532
  Notes => 'the camera yaw angle when shooting in portrait orientation',
8448
8533
  ValueConv => '$val <= 180 ? $val : $val - 360',
@@ -8450,25 +8535,27 @@ my %nikonFocalConversions = (
8450
8535
  PrintConv => 'sprintf("%.1f", $val)',
8451
8536
  PrintConvInv => '$val',
8452
8537
  },
8453
- ### 0xeb5f - Offset26 info start (Z9 firmware 1.00)
8454
- 0xeb6f => {
8538
+ ### 0x8139 - Offset26 info start (Z9 firmware 3.01)
8539
+ 0x8149 => {
8455
8540
  Name => 'MenuSettingsZ9Offset',
8541
+ Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
8456
8542
  Writable => 0,
8457
8543
  Hidden => 1,
8458
8544
  # offset to MenuSettingsZ9 is relative to start of Offset26 block
8459
- RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{Offset26}; undef', # (ignore if 0)
8545
+ RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{MenuOffset}; undef', # (ignore if 0)
8460
8546
  },
8461
- 0xeb70 => {
8547
+ 0x814a => {
8462
8548
  Name => 'Hook5',
8549
+ Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
8463
8550
  Hidden => 1,
8464
8551
  RawConv => 'undef',
8465
8552
  # account for variable location of menu settings data
8466
- Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0xec4b',
8553
+ Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0x8225',
8467
8554
  },
8468
- 0xec4b => [
8555
+ 0x8225 => [
8469
8556
  {
8470
8557
  Name => 'MenuSettingsZ9',
8471
- Condition => '$$self{FirmwareVersion} lt "03.00"',
8558
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FirmwareVersion} lt "03.00"', # C30/C60/C120 jpgs handled at 0x4410
8472
8559
  Format => 'undef[1646]',
8473
8560
  Notes => 'Firmware versions 2.11 and earlier',
8474
8561
  SubDirectory => {
@@ -8478,6 +8565,7 @@ my %nikonFocalConversions = (
8478
8565
  {
8479
8566
  Name => 'MenuSettingsZ9',
8480
8567
  Notes => 'Firmware versions 3.0 and later',
8568
+ Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
8481
8569
  Format => 'undef[1948]',
8482
8570
  SubDirectory => {
8483
8571
  TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9Firmware3',
@@ -8726,34 +8814,34 @@ my %nikonFocalConversions = (
8726
8814
  Name => 'Intervals',
8727
8815
  Format => 'int32u',
8728
8816
  RawConv => '$$self{IntervalShootingIntervals} = $val',
8729
- Condition => '$$self{IntervalShooting} > 0',
8817
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8730
8818
  },
8731
8819
  192 => {
8732
8820
  Name => 'ShotsPerInterval',
8733
8821
  Format => 'int32u',
8734
8822
  RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8735
- Condition => '$$self{IntervalShooting} > 0',
8823
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8736
8824
  },
8737
8825
  #220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
8738
8826
  232 => {
8739
8827
  Name => 'FocusShiftNumberShots', #1-300
8740
8828
  RawConv => '$$self{FocusShiftNumberShots} = $val',
8741
- Condition => '$$self{FocusShiftShooting} > 0',
8829
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8742
8830
  },
8743
8831
  236 => {
8744
8832
  Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8745
- Condition => '$$self{FocusShiftShooting} > 0',
8833
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8746
8834
  },
8747
8835
  240 => {
8748
8836
  Name => 'FocusShiftInterval',
8749
- Condition => '$$self{FocusShiftShooting} > 0',
8837
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8750
8838
  PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8751
8839
  },
8752
8840
  244 => {
8753
8841
  Name => 'FocusShiftExposureLock',
8754
8842
  Unknown => 1,
8755
8843
  PrintConv => \%offOn,
8756
- Condition => '$$self{FocusShiftShooting} > 0',
8844
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8757
8845
  },
8758
8846
  274 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
8759
8847
  276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, #single tag from both Photo & Video menus
@@ -8913,12 +9001,17 @@ my %nikonFocalConversions = (
8913
9001
  1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
8914
9002
  1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
8915
9003
  );
9004
+
8916
9005
  %Image::ExifTool::Nikon::MenuSettingsZ9Firmware3 = ( #starts at Offset26 + 248
8917
9006
  %binaryDataAttrs,
8918
9007
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8919
9008
  DATAMEMBER => [ 154, 204, 208, 248, 444, 554 ],
8920
9009
  IS_SUBDIR => [ 847 ],
8921
9010
  NOTES => 'These tags are used by the Z9 firmware 3.00.',
9011
+ 72 => {
9012
+ Name => 'HighFrameRate', #CH and C30/C60/C120 but not CL
9013
+ PrintConv => \%highFrameRateZ9,
9014
+ },
8922
9015
  154 => {
8923
9016
  Name => 'MultipleExposureMode',
8924
9017
  RawConv => '$$self{MultipleExposureMode} = $val',
@@ -8929,33 +9022,33 @@ my %nikonFocalConversions = (
8929
9022
  Name => 'Intervals',
8930
9023
  Format => 'int32u',
8931
9024
  RawConv => '$$self{IntervalShootingIntervals} = $val',
8932
- Condition => '$$self{IntervalShooting} > 0',
9025
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8933
9026
  },
8934
9027
  208 => {
8935
9028
  Name => 'ShotsPerInterval',
8936
9029
  Format => 'int32u',
8937
9030
  RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
8938
- Condition => '$$self{IntervalShooting} > 0',
9031
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8939
9032
  },
8940
9033
  248 => {
8941
9034
  Name => 'FocusShiftNumberShots', #1-300
8942
9035
  RawConv => '$$self{FocusShiftNumberShots} = $val',
8943
- Condition => '$$self{FocusShiftShooting} > 0',
9036
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8944
9037
  },
8945
9038
  252 => {
8946
9039
  Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
8947
- Condition => '$$self{FocusShiftShooting} > 0',
9040
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8948
9041
  },
8949
9042
  256 => {
8950
9043
  Name => 'FocusShiftInterval',
8951
- Condition => '$$self{FocusShiftShooting} > 0',
9044
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8952
9045
  PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
8953
9046
  },
8954
9047
  260 => {
8955
9048
  Name => 'FocusShiftExposureLock',
8956
9049
  Unknown => 1,
8957
9050
  PrintConv => \%offOn,
8958
- Condition => '$$self{FocusShiftShooting} > 0',
9051
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8959
9052
  },
8960
9053
  290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
8961
9054
  292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
@@ -9107,340 +9200,33 @@ my %nikonFocalConversions = (
9107
9200
  Name => 'FocusShiftAutoReset',
9108
9201
  Unknown => 1,
9109
9202
  PrintConv => \%offOn,
9110
- Condition => '$$self{FocusShiftShooting} > 0',
9203
+ Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
9111
9204
  },
9112
- #1824 ReleaseTimingIndicatorTypeADelay CSd14-b 0 => '1/200' ... 15 => '1/6'
9113
- #1826 VerticalISOButton CSf2
9114
- #1828 ExposureCompensationButton CSf2
9115
- #1830 ISOButton CSf2
9116
- #1890 ViewModeShowEffectsOfSettings CSd9-a 0=>'Always', 1=> 'Only When Flash Not Used'
9117
- #1892 DispButton CSf2
9118
- #1936 FocusPointDisplayOption3DTrackingColor CSa11-d 0=> 'White', 1= => 'Red'
9119
- );
9120
-
9121
- # Flash information (ref JD)
9122
- %Image::ExifTool::Nikon::FlashInfo0100 = (
9123
- %binaryDataAttrs,
9124
- DATAMEMBER => [ 9.2, 15, 16 ],
9125
- GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9126
- NOTES => q{
9127
- These tags are used by the D2H, D2Hs, D2X, D2Xs, D50, D70, D70s, D80 and
9128
- D200.
9129
- },
9130
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
9131
- 0 => {
9132
- Name => 'FlashInfoVersion',
9133
- Format => 'string[4]',
9134
- Writable => 0,
9135
- },
9136
- 4 => { #PH
9137
- Name => 'FlashSource',
9205
+ 1810 => { #CSd4-a
9206
+ Name => 'PreReleaseBurstLength',
9138
9207
  PrintConv => {
9139
9208
  0 => 'None',
9140
- 1 => 'External',
9141
- 2 => 'Internal',
9142
- },
9143
- },
9144
- # 5 - values: 46,48,50,54,78
9145
- 6 => {
9146
- Format => 'int8u[2]',
9147
- Name => 'ExternalFlashFirmware',
9148
- SeparateTable => 'FlashFirmware',
9149
- PrintConv => \%flashFirmware,
9150
- },
9151
- 8 => {
9152
- Name => 'ExternalFlashFlags',
9153
- PrintConv => { 0 => '(none)',
9154
- BITMASK => {
9155
- 0 => 'Fired', #28
9156
- 2 => 'Bounce Flash', #PH
9157
- 4 => 'Wide Flash Adapter',
9158
- 5 => 'Dome Diffuser', #28
9159
- },
9160
- },
9161
- },
9162
- 9.1 => {
9163
- Name => 'FlashCommanderMode',
9164
- Mask => 0x80,
9165
- PrintConv => { 0 => 'Off', 1 => 'On' },
9166
- },
9167
- 9.2 => {
9168
- Name => 'FlashControlMode',
9169
- Mask => 0x7f,
9170
- DataMember => 'FlashControlMode',
9171
- RawConv => '$$self{FlashControlMode} = $val',
9172
- PrintConv => \%flashControlMode,
9173
- SeparateTable => 'FlashControlMode',
9174
- },
9175
- 10 => [
9176
- {
9177
- Name => 'FlashOutput',
9178
- Condition => '$$self{FlashControlMode} >= 0x06',
9179
- ValueConv => '2 ** (-$val/6)',
9180
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9181
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9182
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9183
- },
9184
- {
9185
- Name => 'FlashCompensation',
9186
- Format => 'int8s',
9187
- Priority => 0,
9188
- ValueConv => '-$val/6',
9189
- ValueConvInv => '-6 * $val',
9190
- PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
9191
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
9192
- },
9193
- ],
9194
- 11 => {
9195
- Name => 'FlashFocalLength',
9196
- RawConv => '$val ? $val : undef',
9197
- PrintConv => '"$val mm"',
9198
- PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9199
- },
9200
- 12 => {
9201
- Name => 'RepeatingFlashRate',
9202
- RawConv => '$val ? $val : undef',
9203
- PrintConv => '"$val Hz"',
9204
- PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9205
- },
9206
- 13 => {
9207
- Name => 'RepeatingFlashCount',
9208
- RawConv => '$val ? $val : undef',
9209
- },
9210
- 14 => { #PH
9211
- Name => 'FlashGNDistance',
9212
- SeparateTable => 1,
9213
- PrintConv => \%flashGNDistance,
9214
- },
9215
- 15 => {
9216
- Name => 'FlashGroupAControlMode',
9217
- Mask => 0x0f,
9218
- DataMember => 'FlashGroupAControlMode',
9219
- RawConv => '$$self{FlashGroupAControlMode} = $val',
9220
- PrintConv => \%flashControlMode,
9221
- SeparateTable => 'FlashControlMode',
9222
- },
9223
- 16 => {
9224
- Name => 'FlashGroupBControlMode',
9225
- Mask => 0x0f,
9226
- DataMember => 'FlashGroupBControlMode',
9227
- RawConv => '$$self{FlashGroupBControlMode} = $val',
9228
- PrintConv => \%flashControlMode,
9229
- SeparateTable => 'FlashControlMode',
9230
- },
9231
- 17 => [
9232
- {
9233
- Name => 'FlashGroupAOutput',
9234
- Condition => '$$self{FlashGroupAControlMode} >= 0x06',
9235
- ValueConv => '2 ** (-$val/6)',
9236
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9237
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9238
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9239
- },
9240
- {
9241
- Name => 'FlashGroupACompensation',
9242
- Format => 'int8s',
9243
- ValueConv => '-$val/6',
9244
- ValueConvInv => '-6 * $val',
9245
- PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9246
- PrintConvInv => '$val',
9247
- },
9248
- ],
9249
- 18 => [
9250
- {
9251
- Name => 'FlashGroupBOutput',
9252
- Condition => '$$self{FlashGroupBControlMode} >= 0x06',
9253
- ValueConv => '2 ** (-$val/6)',
9254
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9255
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9256
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9209
+ 1 => '0.3 Sec',
9210
+ 2 => '0.5 Sec',
9211
+ 3 => '1 Sec',
9257
9212
  },
9258
- {
9259
- Name => 'FlashGroupBCompensation',
9260
- Format => 'int8s',
9261
- ValueConv => '-$val/6',
9262
- ValueConvInv => '-6 * $val',
9263
- PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9264
- PrintConvInv => '$val',
9265
- },
9266
- ],
9267
- );
9268
-
9269
- # Flash information for D40, D40x, D3 and D300 (ref JD)
9270
- %Image::ExifTool::Nikon::FlashInfo0102 = (
9271
- %binaryDataAttrs,
9272
- DATAMEMBER => [ 9.2, 16.1, 17.1, 17.2 ],
9273
- GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9274
- NOTES => q{
9275
- These tags are used by the D3 (firmware 1.x), D40, D40X, D60 and D300
9276
- (firmware 1.00).
9277
9213
  },
9278
- # NOTE: Must set ByteOrder in SubDirectory if any multi-byte integer tags added
9279
- 0 => {
9280
- Name => 'FlashInfoVersion',
9281
- Format => 'string[4]',
9282
- Writable => 0,
9283
- },
9284
- 4 => { #PH
9285
- Name => 'FlashSource',
9214
+ 1812 => { #CSd4-b
9215
+ Name => 'PostReleaseBurstLength',
9286
9216
  PrintConv => {
9287
- 0 => 'None',
9288
- 1 => 'External',
9289
- 2 => 'Internal',
9290
- },
9291
- },
9292
- # 5 - values: 46,48,50,54,78
9293
- 6 => {
9294
- Format => 'int8u[2]',
9295
- Name => 'ExternalFlashFirmware',
9296
- SeparateTable => 'FlashFirmware',
9297
- PrintConv => \%flashFirmware,
9298
- },
9299
- 8 => {
9300
- Name => 'ExternalFlashFlags',
9301
- PrintConv => { BITMASK => {
9302
- 0 => 'Fired', #28
9303
- 2 => 'Bounce Flash', #PH
9304
- 4 => 'Wide Flash Adapter',
9305
- 5 => 'Dome Diffuser', #28
9306
- }},
9307
- },
9308
- 9.1 => {
9309
- Name => 'FlashCommanderMode',
9310
- Mask => 0x80,
9311
- PrintConv => { 0 => 'Off', 1 => 'On' },
9312
- },
9313
- 9.2 => {
9314
- Name => 'FlashControlMode',
9315
- Mask => 0x7f,
9316
- DataMember => 'FlashControlMode',
9317
- RawConv => '$$self{FlashControlMode} = $val',
9318
- PrintConv => \%flashControlMode,
9319
- SeparateTable => 'FlashControlMode',
9320
- },
9321
- 10 => [
9322
- {
9323
- Name => 'FlashOutput',
9324
- Condition => '$$self{FlashControlMode} >= 0x06',
9325
- ValueConv => '2 ** (-$val/6)',
9326
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9327
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9328
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9217
+ 0 => '1 Sec',
9218
+ 1 => '2 Sec',
9219
+ 2 => '3 Sec',
9220
+ 3 => 'Max',
9329
9221
  },
9330
- {
9331
- Name => 'FlashCompensation',
9332
- # this is the compensation from the camera (0x0012) for "Built-in" FlashType, or
9333
- # the compensation from the external unit (0x0017) for "Optional" FlashType - PH
9334
- Format => 'int8s',
9335
- Priority => 0,
9336
- ValueConv => '-$val/6',
9337
- ValueConvInv => '-6 * $val',
9338
- PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
9339
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
9340
- },
9341
- ],
9342
- 12 => {
9343
- Name => 'FlashFocalLength',
9344
- RawConv => '$val ? $val : undef',
9345
- PrintConv => '"$val mm"',
9346
- PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9347
- },
9348
- 13 => {
9349
- Name => 'RepeatingFlashRate',
9350
- RawConv => '$val ? $val : undef',
9351
- PrintConv => '"$val Hz"',
9352
- PrintConvInv => '$val=~/(\d+)/; $1 || 0',
9353
- },
9354
- 14 => {
9355
- Name => 'RepeatingFlashCount',
9356
- RawConv => '$val ? $val : undef',
9357
- },
9358
- 15 => { #PH
9359
- Name => 'FlashGNDistance',
9360
- SeparateTable => 1,
9361
- PrintConv => \%flashGNDistance,
9362
- },
9363
- 16.1 => {
9364
- Name => 'FlashGroupAControlMode',
9365
- Mask => 0x0f,
9366
- Notes => 'note: group A tags may apply to the built-in flash settings for some models',
9367
- DataMember => 'FlashGroupAControlMode',
9368
- RawConv => '$$self{FlashGroupAControlMode} = $val',
9369
- PrintConv => \%flashControlMode,
9370
- SeparateTable => 'FlashControlMode',
9371
- },
9372
- 17.1 => {
9373
- Name => 'FlashGroupBControlMode',
9374
- Mask => 0xf0,
9375
- Notes => 'note: group B tags may apply to group A settings for some models',
9376
- DataMember => 'FlashGroupBControlMode',
9377
- RawConv => '$$self{FlashGroupBControlMode} = $val',
9378
- PrintConv => \%flashControlMode,
9379
- SeparateTable => 'FlashControlMode',
9380
9222
  },
9381
- 17.2 => { #PH
9382
- Name => 'FlashGroupCControlMode',
9383
- Mask => 0x0f,
9384
- Notes => 'note: group C tags may apply to group B settings for some models',
9385
- DataMember => 'FlashGroupCControlMode',
9386
- RawConv => '$$self{FlashGroupCControlMode} = $val',
9387
- PrintConv => \%flashControlMode,
9388
- SeparateTable => 'FlashControlMode',
9389
- },
9390
- 18 => [
9391
- {
9392
- Name => 'FlashGroupAOutput',
9393
- Condition => '$$self{FlashGroupAControlMode} >= 0x06',
9394
- ValueConv => '2 ** (-$val/6)',
9395
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9396
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9397
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9398
- },
9399
- {
9400
- Name => 'FlashGroupACompensation',
9401
- Format => 'int8s',
9402
- ValueConv => '-$val/6',
9403
- ValueConvInv => '-6 * $val',
9404
- PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9405
- PrintConvInv => '$val',
9406
- },
9407
- ],
9408
- 19 => [
9409
- {
9410
- Name => 'FlashGroupBOutput',
9411
- Condition => '$$self{FlashGroupBControlMode} >= 0x60',
9412
- ValueConv => '2 ** (-$val/6)',
9413
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9414
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9415
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9416
- },
9417
- {
9418
- Name => 'FlashGroupBCompensation',
9419
- Format => 'int8s',
9420
- ValueConv => '-$val/6',
9421
- ValueConvInv => '-6 * $val',
9422
- PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9423
- PrintConvInv => '$val',
9424
- },
9425
- ],
9426
- 20 => [ #PH
9427
- {
9428
- Name => 'FlashGroupCOutput',
9429
- Condition => '$$self{FlashGroupCControlMode} >= 0x06',
9430
- ValueConv => '2 ** (-$val/6)',
9431
- ValueConvInv => '$val>0 ? -6*log($val)/log(2) : 0',
9432
- PrintConv => '$val>0.99 ? "Full" : sprintf("%.0f%%",$val*100)',
9433
- PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
9434
- },
9435
- {
9436
- Name => 'FlashGroupCCompensation',
9437
- Format => 'int8s',
9438
- ValueConv => '-$val/6',
9439
- ValueConvInv => '-6 * $val',
9440
- PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
9441
- PrintConvInv => '$val',
9442
- },
9443
- ],
9223
+ #1824 ReleaseTimingIndicatorTypeADelay CSd14-b 0 => '1/200' ... 15 => '1/6'
9224
+ #1826 VerticalISOButton CSf2
9225
+ #1828 ExposureCompensationButton CSf2
9226
+ #1830 ISOButton CSf2
9227
+ #1890 ViewModeShowEffectsOfSettings CSd9-a 0=>'Always', 1=> 'Only When Flash Not Used'
9228
+ #1892 DispButton CSf2
9229
+ #1936 FocusPointDisplayOption3DTrackingColor CSa11-d 0=> 'White', 1= => 'Red'
9444
9230
  );
9445
9231
 
9446
9232
  # Flash information (ref JD)
@@ -10724,6 +10510,21 @@ my %nikonFocalConversions = (
10724
10510
  },
10725
10511
  );
10726
10512
 
10513
+ # MakerNotes0x56 - burst info for Z9
10514
+ %Image::ExifTool::Nikon::MakerNotes0x56 = (
10515
+ %binaryDataAttrs,
10516
+ GROUPS => { 0 => 'MakerNotes' },
10517
+ 0 => {
10518
+ Name => 'FirmwareVersion',
10519
+ Format => 'string[4]',
10520
+ Writable => 0,
10521
+ },
10522
+ 4 => {
10523
+ 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.
10524
+ Format => 'int16u'
10525
+ },
10526
+ );
10527
+
10727
10528
  # extra info found in IFD0 of NEF files (ref PH, Z6/Z7)
10728
10529
  %Image::ExifTool::Nikon::NEFInfo = (
10729
10530
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -11869,6 +11670,7 @@ sub PrintAFPointsLeftRight($$)
11869
11670
  {
11870
11671
  my ($col, $ncol) = @_;
11871
11672
  my $center = 1 + ($ncol + 1)/2;
11673
+ return 'n/a' if $col == 0; #out of focus
11872
11674
  return 'C' if $col == $center;
11873
11675
  return sprintf('%d', $center - $col) . 'L of Center' if $col < $center;
11874
11676
  return sprintf('%d', $col - $center) . 'R of Center' if $col > $center;
@@ -11882,6 +11684,7 @@ sub PrintAFPointsUpDown($$)
11882
11684
  {
11883
11685
  my ($row, $nrow) = @_;
11884
11686
  my $center = 1 + ($nrow + 1)/2;
11687
+ return 'n/a' if $row == 0; #out of focus
11885
11688
  return 'C' if $row == $center;
11886
11689
  return sprintf('%d', $center - $row) . 'U from Center' if $row < $center;
11887
11690
  return sprintf('%d', $row - $center) . 'D from Center' if $row > $center;