exiftool-vendored.exe 12.69.0 → 12.72.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.
Files changed (43) hide show
  1. package/bin/exiftool_files/Changes +78 -12
  2. package/bin/exiftool_files/README +10 -10
  3. package/bin/exiftool_files/exiftool.pl +32 -27
  4. package/bin/exiftool_files/lib/Image/ExifTool/AAC.pm +175 -0
  5. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
  6. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +18 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +82 -20
  8. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +3 -2
  9. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +54 -6
  10. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +111 -11
  11. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +145 -20
  12. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +76 -10
  15. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +1 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +4 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  19. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +21 -16
  20. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +2 -2
  21. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +203 -102
  22. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +7 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +8 -13
  24. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +10 -1
  25. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +15 -6
  26. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +59 -13
  27. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
  28. package/bin/exiftool_files/lib/Image/ExifTool/README +7 -2
  29. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +53 -9
  30. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +109 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +3 -2
  32. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +177 -37
  33. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6961 -6856
  34. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +580 -344
  35. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -5
  36. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +6 -5
  37. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +19 -4
  38. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  39. package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +9 -3
  40. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +102 -50
  41. package/bin/exiftool_files/lib/Image/ExifTool.pm +74 -36
  42. package/bin/exiftool_files/lib/Image/ExifTool.pod +28 -17
  43. package/package.json +5 -4
@@ -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.23';
35
+ $VERSION = '1.24';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -354,29 +354,32 @@ sub ParsePID($$$$$)
354
354
  my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
355
355
  Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl);
356
356
  $more = 1;
357
- } elsif ($$dataPt =~ /^A([NS])([EW])\0/s) {
358
- # INNOVV TS video (same format is INNOVV MP4)
357
+ } elsif ($$dataPt =~ /^(V00|A([NS])([EW]))\0/s) {
358
+ # INNOVV TS video (same format as INNOVV MP4)
359
359
  SetByteOrder('II');
360
360
  my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
361
- while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
361
+ while ($$dataPt =~ /((V00|A[NS][EW])\0.{28})/g) {
362
362
  my $dat = $1;
363
- my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
364
- my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
365
- my $spd = GetFloat(\$dat, 12) * $knotsToKph;
366
- my $trk = GetFloat(\$dat, 16);
363
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
364
+ if ($2 ne 'V00') {
365
+ my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
366
+ my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
367
+ my $spd = GetFloat(\$dat, 12) * $knotsToKph;
368
+ my $trk = GetFloat(\$dat, 16);
369
+ Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
370
+ $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
371
+ $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
372
+ $et->HandleTag($tagTbl, GPSSpeed => $spd);
373
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
374
+ $et->HandleTag($tagTbl, GPSTrack => $trk);
375
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
376
+ }
367
377
  my @acc = unpack('x20V3', $dat);
368
378
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
369
- Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
370
- $$et{DOC_NUM} = ++$$et{DOC_COUNT};
371
- $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
372
- $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
373
- $et->HandleTag($tagTbl, GPSSpeed => $spd);
374
- $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
375
- $et->HandleTag($tagTbl, GPSTrack => $trk);
376
- $et->HandleTag($tagTbl, GPSTrackRef => 'T');
377
379
  $et->HandleTag($tagTbl, Accelerometer => "@acc");
378
380
  }
379
381
  SetByteOrder('MM');
382
+ $$et{HasINNOV} = 1; # (necessary to skip over empty/unknown INNOV records)
380
383
  $more = 1;
381
384
  } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
382
385
  # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
@@ -478,6 +481,8 @@ sub ParsePID($$$$$)
478
481
  $et->HandleTag($tagTbl, GPSTrackRef => 'T');
479
482
  SetByteOrder('MM');
480
483
  $more = 1;
484
+ } elsif ($$et{HasINNOV}) {
485
+ $more = 1;
481
486
  }
482
487
  delete $$et{DOC_NUM};
483
488
  }
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.14';
24
+ $VERSION = '2.15';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -694,7 +694,7 @@ my $debug; # set to 1 to enable debugging code
694
694
  Name => 'MakerNoteLeica8', # used by the Q (Type 116)
695
695
  # (Q (Typ 116) starts with "LEICA\0\x08\0", Make is "LEICA CAMERA AG")
696
696
  # (SL (Typ 601) and CL start with "LEICA\0\x09\0", Make is "LEICA CAMERA AG")
697
- Condition => '$$valPt =~ /^LEICA\0[\x08\x09]\0/',
697
+ Condition => '$$valPt =~ /^LEICA\0[\x08\x09\x0a]\0/',
698
698
  SubDirectory => {
699
699
  TagTable => 'Image::ExifTool::Panasonic::Leica5',
700
700
  Start => '$valuePtr + 8',
@@ -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.27';
68
+ $VERSION = '4.28';
69
69
 
70
70
  sub LensIDConv($$$);
71
71
  sub ProcessNikonAVI($$$);
@@ -949,6 +949,15 @@ my %highFrameRateZ9 = (
949
949
  4 => 'C120',
950
950
  );
951
951
 
952
+ my %imageAreaD6 = (
953
+ 0 => 'FX (36x24)',
954
+ 1 => 'DX (24x16)',
955
+ 2 => '5:4 (30x24)',
956
+ 3 => '1.2x (30x20)',
957
+ 4 => '1:1 (24x24)',
958
+ 6 => '16:9',
959
+ );
960
+
952
961
  my %imageAreaZ9 = (
953
962
  0 => 'FX',
954
963
  1 => 'DX',
@@ -962,8 +971,8 @@ my %imageAreaZ9b = (
962
971
  );
963
972
 
964
973
  my %infoZSeries = (
965
- Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|fc|9)\b/i',
966
- Notes => 'Z Series cameras thru July 2023',
974
+ Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|f|fc|9)\b/i',
975
+ Notes => 'Z Series cameras thru October 2023',
967
976
  );
968
977
 
969
978
  my %iSOAutoHiLimitZ7 = (
@@ -1987,7 +1996,7 @@ my %base64coord = (
1987
1996
  },
1988
1997
  0x0044 => { #28
1989
1998
  Name => 'JPGCompression',
1990
- RawConv => '($val) ? $val : undef', # undef for raw files
1999
+ RawConv => '($val) ? $val : undef', # undef for raw files
1991
2000
  PrintConv => {
1992
2001
  1 => 'Size Priority',
1993
2002
  3 => 'Optimal Quality',
@@ -2582,9 +2591,21 @@ my %base64coord = (
2582
2591
  DirOffset => 4,
2583
2592
  },
2584
2593
  },
2585
- { # (D5200/D7100=0218, D5300=0219, D610/Df=0220, D3300=0221, CoolpixA=0601)
2586
- Name => 'ColorBalanceUnknown02',
2587
- Condition => '$$valPt =~ /^0[26]/',
2594
+ { #PH (NC)
2595
+ # (D5300=0219, D3300=0221, D4S=0222, D750/D810=0223, D3400/D3500/D5500/D5600/D7200=0224)
2596
+ Condition => '$$valPt =~ /^02(19|2[1234])/',
2597
+ Name => 'ColorBalance0219',
2598
+ SubDirectory => {
2599
+ TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
2600
+ ProcessProc => \&ProcessNikonEncrypted,
2601
+ WriteProc => \&ProcessNikonEncrypted,
2602
+ DecryptStart => 4,
2603
+ DirOffset => 0x7c,
2604
+ },
2605
+ },
2606
+ { # (D610/Df=0220, CoolpixA=0601)
2607
+ Name => 'ColorBalanceUnknown1',
2608
+ Condition => '$$valPt =~ /^0(220|6)/',
2588
2609
  SubDirectory => {
2589
2610
  TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
2590
2611
  ProcessProc => \&ProcessNikonEncrypted,
@@ -2592,11 +2613,12 @@ my %base64coord = (
2592
2613
  DecryptStart => 284,
2593
2614
  },
2594
2615
  },
2595
- { # (1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, 1AW1=0403, Z6/Z7=0800)
2596
- Name => 'ColorBalanceUnknown04',
2597
- Condition => '$$valPt =~ /^0[48]/',
2616
+ { # (D5200/D7200=0218, D5/D500=0225, D7500=0226, D850=0227, D6/D780=0228,
2617
+ # 1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, 1AW1=0403, Z6/Z7=0800)
2618
+ Name => 'ColorBalanceUnknown2',
2619
+ Condition => '$$valPt =~ /^0(18|[248])/',
2598
2620
  SubDirectory => {
2599
- TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
2621
+ TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown2',
2600
2622
  ProcessProc => \&ProcessNikonEncrypted,
2601
2623
  WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
2602
2624
  DecryptStart => 4,
@@ -4956,6 +4978,16 @@ my %nrwLevels = (
4956
4978
  },
4957
4979
  );
4958
4980
 
4981
+ %Image::ExifTool::Nikon::ColorBalanceUnknown2 = (
4982
+ %binaryDataAttrs,
4983
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4984
+ FORMAT => 'int16u',
4985
+ 0 => {
4986
+ Name => 'ColorBalanceVersion',
4987
+ Format => 'undef[4]',
4988
+ },
4989
+ );
4990
+
4959
4991
  %Image::ExifTool::Nikon::Type2 = (
4960
4992
  WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
4961
4993
  CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
@@ -5448,7 +5480,7 @@ my %nikonFocalConversions = (
5448
5480
  43 => 'NIKKOR Z DX 24mm f/1.7', #28
5449
5481
  44 => 'NIKKOR Z 70-180mm f/2.8', #28
5450
5482
  45 => 'NIKKOR Z 600mm f/6.3 VR S', #28
5451
- 48 => 'Nikkor Z 135mm f/1.8 S Plena', #28
5483
+ 46 => 'Nikkor Z 135mm f/1.8 S Plena', #28
5452
5484
  32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
5453
5485
  32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
5454
5486
  },
@@ -5910,9 +5942,9 @@ my %nikonFocalConversions = (
5910
5942
  0x10 => { #28
5911
5943
  Name => 'ImageArea',
5912
5944
  PrintConv => {
5913
- 0 => 'FX (36.0 x 23.9 mm)',
5914
- 1 => 'DX (23.5 x 15.6 mm)',
5915
- 2 => '5:4 (30.0 x 23.9 mm)',
5945
+ 0 => 'FX (36x24)',
5946
+ 1 => 'DX (24x16)',
5947
+ 2 => '5:4 (30x24)',
5916
5948
  },
5917
5949
  },
5918
5950
  0x25d => {
@@ -7305,6 +7337,10 @@ my %nikonFocalConversions = (
7305
7337
  Format => 'int16u',
7306
7338
  Hidden => 1,
7307
7339
  },
7340
+ 0x2b => {
7341
+ Name => 'ImageArea',
7342
+ PrintConv => \%imageAreaD6,
7343
+ },
7308
7344
  );
7309
7345
 
7310
7346
  %Image::ExifTool::Nikon::IntervalInfoD6 = (
@@ -8195,7 +8231,7 @@ my %nikonFocalConversions = (
8195
8231
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8196
8232
  VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
8197
8233
  DATAMEMBER => [ 0x04 ],
8198
- IS_SUBDIR => [ 0x30, 0x38, 0x98, 0xa0 ],
8234
+ IS_SUBDIR => [ 0x30, 0x38, 0x88, 0x98, 0xa0 ],
8199
8235
  WRITABLE => 1,
8200
8236
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8201
8237
  NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
@@ -8245,9 +8281,19 @@ my %nikonFocalConversions = (
8245
8281
  Start => '$val',
8246
8282
  }
8247
8283
  },
8284
+ 0x88 => {
8285
+ Name => 'OrientationOffset',
8286
+ Format => 'int32u',
8287
+ Condition => '$$self{Model} =~ /^NIKON Z f\b/i',
8288
+ SubDirectory => {
8289
+ TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
8290
+ Start => '$val',
8291
+ }
8292
+ },
8248
8293
  0x98 => {
8249
8294
  Name => 'OrientationOffset',
8250
8295
  Format => 'int32u',
8296
+ Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|fc)\b/i', #models other then the Z f
8251
8297
  SubDirectory => {
8252
8298
  TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
8253
8299
  Start => '$val',
@@ -8286,6 +8332,10 @@ my %nikonFocalConversions = (
8286
8332
  Format => 'int16u',
8287
8333
  Hidden => 1,
8288
8334
  },
8335
+ 0x2b => {
8336
+ Name => 'ImageArea',
8337
+ PrintConv => \%imageAreaD6,
8338
+ },
8289
8339
  );
8290
8340
 
8291
8341
  %Image::ExifTool::Nikon::PortraitInfoZ7II = (
@@ -8486,8 +8536,8 @@ my %nikonFocalConversions = (
8486
8536
  %binaryDataAttrs,
8487
8537
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8488
8538
  DATAMEMBER => [ 0x20, 0x28, 0x2a ],
8489
- #0x0019 => HDRFrame # For JPG 0=> Not HDR; 1=> file is the blended exposure. For raw files: 0=> Not from an HDR capture sequence; otherwise frame number in the HDR capture sequence -- 'Save Individual Pictures (RAW)' must be enabled.
8490
- #0x001A => MultipleExposureFrame # For JPG 0=> Not a multiple exposure; 1=> file is the blended exposure. For raw files: 0=> Not a multiple exposure capture; otherwise frame number in the capture sequence -- 'Save Individual Pictures (RAW)' must be enabled.
8539
+ #0x0019 => HDRFrame # For JPG 0=> Not HDR; 1=> file is the blended exposure. For raw files: 0=> Not from an HDR capture sequence; otherwise frame number in the HDR capture sequence -- 'Save Individual Pictures (RAW)' must be enabled.
8540
+ #0x001A => MultipleExposureFrame # For JPG 0=> Not a multiple exposure; 1=> file is the blended exposure. For raw files: 0=> Not a multiple exposure capture; otherwise frame number in the capture sequence -- 'Save Individual Pictures (RAW)' must be enabled.
8491
8541
  0x0020 => {
8492
8542
  Name => 'FocusShiftShooting',
8493
8543
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
@@ -8514,7 +8564,7 @@ my %nikonFocalConversions = (
8514
8564
  0x002a => {
8515
8565
  Name => 'IntervalFrame',
8516
8566
  RawConv => '$$self{IntervalFrame} = $val',
8517
- Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
8567
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0', #not valid for C30/C60/C120
8518
8568
  Format => 'int16u',
8519
8569
  Hidden => 1,
8520
8570
  },
@@ -8526,24 +8576,18 @@ my %nikonFocalConversions = (
8526
8576
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8527
8577
  DATAMEMBER => [ 0x0bea, 0x0beb ],
8528
8578
  0x0be8 => {
8529
- Name => 'AFAreaInitialXPosition', #stored as a representation of the horizontal position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
8530
- Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and defined $$self{AFAreaMode} and $$self{AFAreaMode} < 2 ', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
8579
+ Name => 'AFAreaInitialXPosition', #the horizontal position of the center the focus box prior to any subject detection or tracking. Origin is Top Left.
8580
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8531
8581
  Format => 'int8s',
8532
8582
  PrintConv => q{
8533
- #in FX mode and Single-point, the 29 horizontal focus points are spaced 259 pixels apart starting at pixel 502 and ending at 7754. Spacing is the same for Wide(L/C1/C2) with different start points.
8534
- #in FX mode and Dynamic(L), the 27 horizontal focus points are spaced 259 pixels apart starting at pixel 761 and ending at 7495
8535
- #in FX mode and Dynamic(M), the 29 horizontal focus points are spaced 259 pixels apart starting at pixel 502 and ending at 7754
8536
- #in DX mode and Single-point, the 19 horizontal focus points are spaced 388 pixels apart starting at pixel 636 and ending at 7620. [These correspond to FX positions and match the corresponding values in AFAreaMode tag AFAreaXPosition].
8537
- #in DX mode and Wide(S), the 17 horizontal focus points are spaced 393 pixels apart starting at pixel 591 and ending at 7272.
8538
- #in DX mode and Dynamic(L), the 17 horizontal focus points are spaced 388 pixels apart starting at pixel 1024 and ending at 7232
8539
- #in DX mode and Dynamic(M), the 19 horizontal focus points are spaced 388 pixels apart starting at pixel 636 and ending at 7620
8540
-
8541
- my $areaMode = $$self{VALUE}{PhotoShootingMenuBankImageArea};
8583
+ my $imageArea = $$self{ImageArea};
8542
8584
  my $afAreaMode = $$self{VALUE}{AFAreaMode};
8543
- my $dynamicAFAreaSize = $$self{VALUE}{DynamicAFAreaSize};
8585
+ my $dynamicAFAreaSize = ( defined $$self{DynamicAFAreaSize} ? $$self{DynamicAFAreaSize} : 0 );
8544
8586
 
8545
- my $FX = 0;
8546
- my $DX = 1;
8587
+ my $FX = 0; #image size 8256 x 5504
8588
+ my $DX = 1; #image size 5392 x 3592
8589
+ my $WideScreen = 4; #16:9 image area, image size 8256x4640
8590
+ my $OneToOne = 8; #1:1 image area, image size 5504x5504
8547
8591
 
8548
8592
  my $Single = 1;
8549
8593
  my $Dynamic = 2;
@@ -8557,54 +8601,51 @@ my %nikonFocalConversions = (
8557
8601
  my $DynamicM = 1;
8558
8602
  my $DynamicL = 2;
8559
8603
 
8560
- my $start = 502; #FX - all flavors
8561
- $start = 636 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) + 3D + Auto
8562
- $start = 591 if $areaMode == $DX and $afAreaMode == $WideS ; #DX Wide(S)
8604
+ my $start = 502; #FX, 16:9 & 1:1 formats
8605
+ my $increment = 259; #FX, & 16:9 formats
8563
8606
 
8564
- my $increment = 259; #FX - all flavors
8565
- $increment = 388 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) + 3D + Auto
8566
- $increment = 393 if $areaMode == $DX and $afAreaMode == $WideS ; #DX Wide(S)
8607
+ $start = $start + 5 * $increment if $imageArea == $OneToOne; # need to provide additional offset for the cropped horizontal pixels in 1:1 (19 vs 29 horizontal focus positions)
8608
+ $start = $start - $increment if $val < 49 and ($imageArea == $FX or $imageArea == $WideScreen); #calculations for the left side of the frames are offset by 1 position from the right side
8609
+ $start = $start - $increment if $imageArea == $OneToOne and $afAreaMode == $Auto;
8567
8610
 
8568
- my $divisor = 4;
8569
- $divisor = 6 if $areaMode == $DX ;
8611
+ if ($imageArea == $DX) { # DX results are in FX coordinate system to match reporting of ($AFAreaXPosition , $AFAreaYPosition)
8612
+ $start = 636;
8613
+ $increment = 388;
8614
+ if ( $afAreaMode == $WideS ) { #Wide S focus box width is an unusual size
8615
+ $start = 591;
8616
+ $increment = 393;
8617
+ }
8618
+ $start = $start - $increment if $afAreaMode == $Auto ;
8619
+ }
8620
+
8621
+ my $divisor = 3.99; #subtract .01 to ensure $val of 2n+2 rounds up
8622
+ $divisor = 4.01 if $val >= 50; #...but round up on the right side of the frame
8623
+ $divisor = 6 if $imageArea == $DX or $imageArea == $OneToOne;
8570
8624
 
8571
- my $offsetVal = 0;
8572
- $offsetVal = 12 if $areaMode == $FX and $afAreaMode == $Dynamic ; #FX Dynamic (L/M) - force positive values so perl rounding toward zero isn't an issue
8573
- $offsetVal = 18 if $areaMode == $DX and $afAreaMode == $Dynamic ; #DX Dynamic (L/M)
8625
+ my $roundedValOverDivisor = sprintf("%.0f", $val / $divisor); #round to nearest int
8574
8626
 
8575
- my $offsetSum = -1;
8576
- $offsetSum = -4 if $afAreaMode == $Dynamic ; # Dynamic (L/M)
8627
+ my $focusBoxWidth = $$self{AFAreaInitialWidth} ; #wider focus boxes (e.g., DynM, DynL and some Wide C1/C2) will start and end closer to the center of the frame
8628
+ $focusBoxWidth = int($focusBoxWidth * 2 / 3) if $imageArea == $DX or $imageArea == $OneToOne ;
8577
8629
 
8578
- my $ncol = $$self{AFAreaInitialWidth};
8579
- $ncol = int($ncol * 2 / 3) if $areaMode == $DX ; #DX
8630
+ my $skipPositions = int($focusBoxWidth / 2); #jump over half the width of the focus box
8580
8631
 
8581
- #some sample mappings:
8582
- #FX Wide(S/L/C1/C2) [6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117] to 502, 761, 1020, 1279, 1538, 1797, 2056, 2315, 2574, 2833, 3092, 3351, 3610, 3869, 4128, 4387, 4646, 4905, 5164, 5423, 5682, 5941, 6200, 6459, 6718, 6977, 7236, 7495, 7754]
8583
- #DX Wide(L/C1/C2) map for Wide(L)/C1/C2 [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 67, 73, 79, 85, 91, 97, 103, 109, 115] to [636, 1024, 1412, 1800, 2188, 2576, 2964, 3352, 3740, 4128, 4516, 4904, 5292, 5680, 6068, 6456, 6844, 7232, 7620]
8584
- #DX Wide(S) for Wide(S) [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 67, 73, 79, 85, 91, 97, 103] to [984, 1377, 1770, 2163, 2556, 2949, 3342, 3735, 4128, 4521, 4914, 5307, 5700, 6093, 6486, 6879, 7272]
8585
- #FX Dynamic (L) map [-9, -5, -1, 2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93] to [761, 1020, 1279, 1538, 1797, 2056, 2315, 2574, 2833, 3092, 3351, 3610, 3869, 4128, 4387, 4646, 4905, 5164, 5423, 5682, 5941, 6200, 6459, 6718, 6977, 7236, 7495]
8632
+ my $result = $start + $increment * ($roundedValOverDivisor + $skipPositions - 1 ) ;
8586
8633
 
8587
- return $start + $increment * (int(($val + $offsetVal) / $divisor) + int($ncol / 2) + $offsetSum) ; #do not use simple int() becuase it rounds negative fractions toward zero resulting in duplicate values - instead use the 10xdivisor to force positive values
8634
+ return $result;
8588
8635
  },
8589
8636
  },
8590
8637
  0x0be9 => {
8591
- Name =>'AFAreaInitialYPosition', #stored as a representation of the vertical position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
8592
- Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and defined $$self{AFAreaMode} and $$self{AFAreaMode} < 2', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
8638
+ Name =>'AFAreaInitialYPosition', #the vertical position of the center the focus box prior to any subject detection or tracking. Origin is Top Left.
8639
+ Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:9
8593
8640
  Format => 'int8s',
8594
8641
  PrintConv => q{
8595
- #in FX mode and Single-point, the 17 vertical focus points are spaced 291 pixels apart starting at pixel 424 and ending at 5080. Spacing is the same for Wide(L/C1/C2)
8596
- #in FX mode and Dynamic(L), the 15 vertical focus points are spaced 291 pixels apart starting at pixel 715 and ending at 4789
8597
- #in FX mode and Dynamic(M), the 17 vertical l focus points are spaced 291 pixels apart starting at pixel 424 and ending at 5080
8598
- #in DX mode and Single-point, the 11 vertical focus points are spaced 436 pixels apart starting at pixel 572 and ending at 4932. [These correspond to FX positions and match the corresponding values in AFAreaMode tag AFAreaYPosition].
8599
- #in DX Mode and Wide(S) the 9 vertical focus points are spaced 442 pixels apart starting at pixel 542 and ending at 4520
8600
- #in DX mode and Dynamic(L), the 9 vertical focus points are spaced 436 pixels apart starting at pixel 1008 and ending at 4496
8601
-
8602
- my $areaMode = $$self{VALUE}{PhotoShootingMenuBankImageArea};
8642
+ my $imageArea = $$self{ImageArea};
8603
8643
  my $afAreaMode = $$self{VALUE}{AFAreaMode};
8604
- my $dynamicAFAreaSize = $$self{VALUE}{DynamicAFAreaSize};
8605
8644
 
8606
- my $FX = 0;
8607
- my $DX = 1;
8645
+ my $FX = 0; #image size 8256 x 5504
8646
+ my $DX = 1; #image size 5392 x 3592
8647
+ my $WideScreen = 4; #16:9 image area, image size 8256x4640
8648
+ my $OneToOne = 8; #1:1 image area, image size 5504x5504
8608
8649
 
8609
8650
  my $Single = 1;
8610
8651
  my $Dynamic = 2;
@@ -8618,49 +8659,42 @@ my %nikonFocalConversions = (
8618
8659
  my $DynamicM = 1;
8619
8660
  my $DynamicL = 2;
8620
8661
 
8621
- my $start = 424; #FX - all flavors
8622
- $start = 572 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic(L/M/S) + 3D + Auto
8623
- $start = 542 if $areaMode == $DX and $afAreaMode == 3 ; #DX Wide(S)
8662
+ my $start = 424; #FX, 16:9 & 1:1 formats
8663
+ my $increment = 291; #FX, & 16:9 formats
8664
+ $start = $start + $increment if $imageArea == $WideScreen and $val > 0;
8624
8665
 
8625
- my $increment = 291; #FX - all flavors
8626
- $increment = 436 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) +3D + Auto
8627
- $increment = 442 if $areaMode == $DX and $afAreaMode == 3 ; #DX Wide(S)
8628
-
8629
- my $divisor = 7;
8630
- $divisor = 10 if $areaMode == $DX ; #DX
8666
+ if ($imageArea == $DX) { # DX results are in FX coordinate system to match reporting of ($AFAreaXPosition , $AFAreaYPosition)
8667
+ $start = 572;
8668
+ $increment = 436;
8669
+ if ( $afAreaMode == $WideS ) { #Wide S focus box is a strange size
8670
+ $start = 542;
8671
+ $increment = 442;
8672
+ }
8673
+ }
8631
8674
 
8632
- my $offsetVal = -1;
8633
- $offsetVal = 39 if $afAreaMode == $Dynamic and ( $dynamicAFAreaSize == $DynamicL ) ; #Dynamic (L) - force positive values so perl rounding toward zero isn't an issue
8634
- $offsetVal = 40 if $afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicM ; #Dynamic (M)
8635
- $offsetVal = 40 if $areaMode == $FX and (($afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicS) or $afAreaMode == $ThreeD) ; #FX Dynamic (S) or 3D
8636
- $offsetVal = 38 if $areaMode == $DX and ($afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicS ) ; #DX Dynamic (S)or 3D
8675
+ my $divisor = 6.67;
8676
+ $divisor = 10.01 if $imageArea == $DX ; #extra .01 to ensure $val of 10*n+5 rounds down
8677
+ $divisor = 8.01 if $imageArea == $WideScreen ;
8637
8678
 
8638
- my $offsetSum = 0;
8639
- $offsetSum = -6 if $areaMode == $FX and ($afAreaMode == $Dynamic or $afAreaMode == $ThreeD); #FX Dynamic (L/M/S) or 3D
8640
- $offsetSum = -4 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $ThreeD ); #DX Dynamic (L/M/S) or 3D
8679
+ my $roundedValOverDivisor = sprintf("%.0f", $val / $divisor); #round to nearest int
8641
8680
 
8642
- my $nrow = $$self{AFAreaInitialHeight};
8643
- $nrow = int($nrow * 2 / 3) if $areaMode == $DX; #DX
8681
+ my $focusBoxHeight = $$self{AFAreaInitialHeight} ; #wider focus boxes (e.g., DynM, DynL and some Wide C1/C2) will start and end closer to the center of the frame
8682
+ $focusBoxHeight = int($focusBoxHeight * 2 / 3) if $imageArea == $DX ;
8644
8683
 
8645
- #some sample mappings:
8646
- #FX Wide(S/L/C1/C2) map [7, 13, 20, 27, 33, 40, 47, 53, 60, 67, 74, 80, 87, 94, 100, 107, 114] to [424, 715, 1006, 1297, 1588, 1879, 2170, 2461, 2752, 3043, 3334, 3625, 3916, 4207, 4498, 4789, 5080]
8647
- #DX Wide(L/C1/C2) map [7, 17, 28, 38, 48, 58, 69, 79, 89, 100, 110] to [572, 1008, 1444, 1880, 2316, 2752, 3188, 3624, 4060, 4496, 4932]
8648
- #DX Wide(S) map for Wide(S) [7, 17, 28, 38, 48, 58, 69, 79, 89] to [984, 1426, 1868, 2310, 2752, 3194, 3636, 4078, 4520]
8649
- #FX Dynamic (L) map [-19, -13, -6, 0, 7, 13, 20, 27, 33, 40, 47, 53, 60, 67, 74] to [715, 1006, 1297, 1588, 1879, 2170, 2461, 2752, 3043, 3334, 3625, 3916, 4207, 4498, 4789]
8684
+ my $skipPositions = int($focusBoxHeight / 2); #jump over half the height of the focus box
8650
8685
 
8651
- return $start + $increment * (int(($val + $offsetVal) / $divisor) + int($nrow / 2) + $offsetSum) ;;
8686
+ my $result = $start + $increment * ($roundedValOverDivisor + $skipPositions - 1 ) ;
8687
+ return $result;
8652
8688
  },
8653
8689
  },
8654
8690
  0x0bea => {
8655
8691
  Name => 'AFAreaInitialWidth',
8656
8692
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8657
- ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
8658
8693
  RawConv => '$$self{AFAreaInitialWidth} = 1 + int ($val / 4)', #convert from [3, 11, 19, 35, 51, 75] to [1, 3, 5, 9 13, 19] to match camera options for C1/C2 focus modes .. input/output of 11/3 is for Wide(S)
8659
8694
  },
8660
8695
  0x0beb => {
8661
8696
  Name => 'AFAreaInitialHeight',
8662
8697
  Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
8663
- ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
8664
8698
  RawConv => '$$self{AFAreaInitialHeight} = 1 + int ($val / 7) ', #convert from [6, 20, 33, 46, 73] to [1, 3, 5, 7, 11] to match camera options for C1/C2 focus modes .. input/output of 33/5 is for Wide(L)
8665
8699
  },
8666
8700
  );
@@ -9351,7 +9385,7 @@ my %nikonFocalConversions = (
9351
9385
  %Image::ExifTool::Nikon::MenuSettingsZ9 = (
9352
9386
  %binaryDataAttrs,
9353
9387
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9354
- DATAMEMBER => [ 140, 188, 192, 232, 424, 528, 534, 576 ],
9388
+ DATAMEMBER => [ 140, 188, 192, 232, 308, 424, 528, 534, 576 ],
9355
9389
  IS_SUBDIR => [ 799 ],
9356
9390
  NOTES => 'These tags are used by the Z9.',
9357
9391
  #90 ISO
@@ -9396,7 +9430,7 @@ my %nikonFocalConversions = (
9396
9430
  },
9397
9431
  274 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
9398
9432
  276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, #single tag from both Photo & Video menus
9399
- 308 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
9433
+ 308 => { Name => 'PhotoShootingMenuBankImageArea', RawConv => '$$self{ImageArea} = $val', PrintConv => \%imageAreaZ9 },
9400
9434
  #310 ImageQuality
9401
9435
  322 => { Name => 'AutoISO', PrintConv => \%offOn },
9402
9436
  324 => {
@@ -9562,7 +9596,7 @@ my %nikonFocalConversions = (
9562
9596
  %Image::ExifTool::Nikon::MenuSettingsZ9v3 = (
9563
9597
  %binaryDataAttrs,
9564
9598
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9565
- DATAMEMBER => [ 154, 204, 208, 248, 444, 548, 554, 596 ],
9599
+ DATAMEMBER => [ 154, 204, 208, 248, 328, 444, 548, 554, 596 ],
9566
9600
  IS_SUBDIR => [ 847 ],
9567
9601
  NOTES => 'These tags are used by the Z9 firmware 3.00.',
9568
9602
  72 => {
@@ -9609,7 +9643,7 @@ my %nikonFocalConversions = (
9609
9643
  },
9610
9644
  290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
9611
9645
  292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
9612
- 328 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
9646
+ 328 => { Name => 'PhotoShootingMenuBankImageArea', RawConv => '$$self{ImageArea} = $val', PrintConv => \%imageAreaZ9 },
9613
9647
  342 => { Name => 'AutoISO', PrintConv => \%offOn },
9614
9648
  344 => {
9615
9649
  Name => 'ISOAutoHiLimit',
@@ -9795,7 +9829,7 @@ my %nikonFocalConversions = (
9795
9829
  %Image::ExifTool::Nikon::MenuSettingsZ9v4 = (
9796
9830
  %binaryDataAttrs,
9797
9831
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
9798
- DATAMEMBER => [ 154, 204, 208, 248, 444, 548, 554, 570, 596 ],
9832
+ DATAMEMBER => [ 154, 204, 208, 248, 328, 444, 548, 554, 570, 596 ],
9799
9833
  IS_SUBDIR => [ 847 ],
9800
9834
  NOTES => 'These tags are used by the Z9 firmware 3.00.',
9801
9835
  72 => {
@@ -9842,7 +9876,7 @@ my %nikonFocalConversions = (
9842
9876
  },
9843
9877
  290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
9844
9878
  292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
9845
- 328 => { Name => 'PhotoShootingMenuBankImageArea', PrintConv => \%imageAreaZ9 },
9879
+ 328 => { Name => 'PhotoShootingMenuBankImageArea', RawConv => '$$self{ImageArea} = $val', PrintConv => \%imageAreaZ9 },
9846
9880
  #334 JPGCompression 0 => 'Size Priority', 1 => 'Optimal Quality',
9847
9881
  342 => { Name => 'AutoISO', PrintConv => \%offOn },
9848
9882
  344 => {
@@ -11396,13 +11430,80 @@ my %nikonFocalConversions = (
11396
11430
  # 0x02 - undef[148]
11397
11431
  # 0x03 - undef[284]
11398
11432
  # 0x04 - undef[148,212]
11399
- # 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28)
11400
- # 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28)
11433
+ 0x05 => { #28
11434
+ Name => 'DistortionInfo', # Z-series distortion correction information
11435
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::DistortionInfo' },
11436
+ },
11437
+ 0x06 => { #28
11438
+ Name => 'VignetteInfo', # Z-series vignette correction information
11439
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::VignetteInfo' },
11440
+ },
11401
11441
  # 0x07 - undef[104]
11402
11442
  # 0x08 - undef[24]
11403
11443
  # 0x09 - undef[36]
11404
11444
  );
11405
11445
 
11446
+ # Z-series distortion correction information (correction model is appears to be a cubic polynomial) (ref 28)
11447
+ %Image::ExifTool::Nikon::DistortionInfo = (
11448
+ %binaryDataAttrs,
11449
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
11450
+ 0 => {
11451
+ Name => 'DistortionCorrectionVersion',
11452
+ Format => 'string[4]',
11453
+ },
11454
+ 4 => {
11455
+ Name => 'DistortionCorrection', #used by ACR to determine whether the built-in lens profile is applied
11456
+ Format => 'int8u',
11457
+ PrintConv => {
11458
+ 1 => 'On (Optional)',
11459
+ 2 => 'Off',
11460
+ 3 => 'On (Required)',
11461
+ },
11462
+ },
11463
+ #0x10 Degree of radial distortion correction polynomial? (always 4? - decodes for the first 3 coefficients follow, the 4th at 0x2c/0x30 seems to always be 0)
11464
+ 0x14 => {
11465
+ Name => 'RadialDistortionCoefficient1',
11466
+ Format => 'rational64s',
11467
+ PrintConv => 'sprintf("%.5f",$val)',
11468
+ },
11469
+ 0x1c => {
11470
+ Name => 'RadialDistortionCoefficient2',
11471
+ Format => 'rational64s',
11472
+ PrintConv => 'sprintf("%.5f",$val)',
11473
+ },
11474
+ 0x24 => {
11475
+ Name => 'RadialDistortionCoefficient3',
11476
+ Format => 'rational64s',
11477
+ PrintConv => 'sprintf("%.5f",$val)',
11478
+ },
11479
+ );
11480
+
11481
+ # Z-series vignette correction information (correction model seems to be using a 6th order even polynomial) (ref 28)
11482
+ %Image::ExifTool::Nikon::VignetteInfo = (
11483
+ %binaryDataAttrs,
11484
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
11485
+ 0 => {
11486
+ Name => 'VignetteCorrectionVersion',
11487
+ Format => 'string[4]',
11488
+ },
11489
+ #0x10 Degree of vignette correction polynomial? (always 8? - decodes for the first 3 coefficents follow, the 4th at 0x4c/0x50 seems to always be 0)
11490
+ 0x24 => {
11491
+ Name => 'VignetteCoefficient1',
11492
+ Format => 'rational64s',
11493
+ PrintConv => 'sprintf("%.5f",$val)',
11494
+ },
11495
+ 0x34 => {
11496
+ Name => 'VignetteCoefficient2',
11497
+ Format => 'rational64s',
11498
+ PrintConv => 'sprintf("%.5f",$val)',
11499
+ },
11500
+ 0x44 => {
11501
+ Name => 'VignetteCoefficient3',
11502
+ Format => 'rational64s',
11503
+ PrintConv => 'sprintf("%.5f",$val)',
11504
+ },
11505
+ );
11506
+
11406
11507
  # tags in Nikon QuickTime videos (PH - observations with Coolpix S3)
11407
11508
  # (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
11408
11509
  %Image::ExifTool::Nikon::MOV = (