exiftool_vendored 11.98.0 → 12.10.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +198 -2
  3. data/bin/MANIFEST +8 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -42
  7. data/bin/exiftool +102 -75
  8. data/bin/lib/Image/ExifTool.pm +163 -111
  9. data/bin/lib/Image/ExifTool.pod +127 -93
  10. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  11. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +21 -10
  13. data/bin/lib/Image/ExifTool/Canon.pm +202 -14
  14. data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
  15. data/bin/lib/Image/ExifTool/DPX.pm +56 -2
  16. data/bin/lib/Image/ExifTool/DarwinCore.pm +22 -3
  17. data/bin/lib/Image/ExifTool/EXE.pm +8 -5
  18. data/bin/lib/Image/ExifTool/Exif.pm +15 -6
  19. data/bin/lib/Image/ExifTool/Font.pm +9 -2
  20. data/bin/lib/Image/ExifTool/GIF.pm +6 -1
  21. data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
  22. data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
  23. data/bin/lib/Image/ExifTool/GoPro.pm +48 -22
  24. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  25. data/bin/lib/Image/ExifTool/ID3.pm +91 -12
  26. data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
  27. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  28. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  29. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  30. data/bin/lib/Image/ExifTool/M2TS.pm +19 -19
  31. data/bin/lib/Image/ExifTool/MacOS.pm +154 -38
  32. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  33. data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
  34. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
  35. data/bin/lib/Image/ExifTool/Nikon.pm +164 -20
  36. data/bin/lib/Image/ExifTool/Olympus.pm +39 -17
  37. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  38. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  39. data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
  40. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
  41. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  42. data/bin/lib/Image/ExifTool/Pentax.pm +3 -1
  43. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  44. data/bin/lib/Image/ExifTool/QuickTime.pm +289 -37
  45. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
  46. data/bin/lib/Image/ExifTool/README +26 -22
  47. data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
  48. data/bin/lib/Image/ExifTool/RTF.pm +12 -7
  49. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  50. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  51. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  52. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  53. data/bin/lib/Image/ExifTool/Sony.pm +426 -40
  54. data/bin/lib/Image/ExifTool/TagLookup.pm +5799 -5671
  55. data/bin/lib/Image/ExifTool/TagNames.pod +584 -97
  56. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  57. data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
  58. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -18
  59. data/bin/lib/Image/ExifTool/Writer.pl +47 -24
  60. data/bin/lib/Image/ExifTool/XMP.pm +99 -17
  61. data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
  62. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  63. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  64. data/bin/perl-Image-ExifTool.spec +42 -41
  65. data/lib/exiftool_vendored/version.rb +1 -1
  66. metadata +8 -7
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
62
62
  use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
 
65
- $VERSION = '3.82';
65
+ $VERSION = '3.89';
66
66
 
67
67
  sub LensIDConv($$$);
68
68
  sub ProcessNikonAVI($$$);
@@ -349,6 +349,7 @@ sub GetAFPointGrid($$;$);
349
349
  'FE 47 00 00 24 24 4B 06' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #JD
350
350
  '26 48 11 11 30 30 1C 02' => 'Sigma 8mm F4 EX Circular Fisheye',
351
351
  '79 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX Circular Fisheye', #JD
352
+ 'DB 40 11 11 2C 2C 1C 06' => 'Sigma 8mm F3.5 EX DG Circular Fisheye', #30
352
353
  'DC 48 19 19 24 24 4B 06' => 'Sigma 10mm F2.8 EX DC HSM Fisheye',
353
354
  'C2 4C 24 24 14 14 4B 06' => 'Sigma 14mm F1.8 DG HSM | A', #IB
354
355
  '48 48 24 24 24 24 4B 02' => 'Sigma 14mm F2.8 EX Aspherical HSM',
@@ -449,6 +450,7 @@ sub GetAFPointGrid($$;$);
449
450
  # '92 3E 2D 88 2C 40 4B 0E' (22mm)
450
451
  # '92 40 2D 88 2C 40 4B 0E' (18mm)
451
452
  '26 48 31 49 24 24 1C 02' => 'Sigma 20-40mm F2.8',
453
+ '7B 48 37 44 18 18 4B 06' => 'Sigma 24-35mm F2.0 DG HSM | A', #30
452
454
  '02 3A 37 50 31 3D 02 00' => 'Sigma 24-50mm F4-5.6 UC',
453
455
  '26 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
454
456
  'B6 48 37 56 24 24 1C 02' => 'Sigma 24-60mm F2.8 EX DG',
@@ -513,6 +515,7 @@ sub GetAFPointGrid($$;$);
513
515
  'CE 34 76 A0 38 40 4B 0E' => 'Sigma 150-500mm F5-6.3 DG OS APO HSM', #JD
514
516
  '81 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | S', #Jaap Voets
515
517
  '82 34 76 A6 38 40 4B 0E' => 'Sigma 150-600mm F5-6.3 DG OS HSM | C',
518
+ 'C4 4C 73 73 14 14 4B 46' => 'Sigma 135mm F1.8 DG HSM | A', #forum3833
516
519
  '26 40 7B A0 34 40 1C 02' => 'Sigma APO 170-500mm F5-6.3 Aspherical RF',
517
520
  'A7 49 80 A0 24 24 4B 06' => 'Sigma APO 200-500mm F2.8 EX DG',
518
521
  '48 3C 8E B0 3C 3C 4B 02' => 'Sigma APO 300-800mm F5.6 EX DG HSM',
@@ -579,6 +582,7 @@ sub GetAFPointGrid($$;$);
579
582
  '4D 41 3C 8E 2B 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di LD Aspherical (IF) (A061)',
580
583
  '4D 41 3C 8E 2C 40 62 02' => 'Tamron AF 28-300mm f/3.5-6.3 XR LD Aspherical (IF) (185D)',
581
584
  'F9 40 3C 8E 2C 40 40 0E' => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical (IF) Macro (A20)',
585
+ 'C9 3C 44 76 25 31 DF 4E' => 'Tamron 35-150mm f/2.8-4 Di VC OSD (A043)', #30
582
586
  '00 47 53 80 30 3C 00 06' => 'Tamron AF 55-200mm f/4-5.6 Di II LD (A15)',
583
587
  'F7 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
584
588
  'FE 53 5C 80 24 24 84 06' => 'Tamron SP AF 70-200mm f/2.8 Di LD (IF) Macro (A001)',
@@ -653,6 +657,7 @@ sub GetAFPointGrid($$;$);
653
657
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
654
658
  #
655
659
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
660
+ '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
656
661
  '00 48 32 32 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/21 ZF.2',
657
662
  '00 54 38 38 18 18 00 00' => 'Carl Zeiss Distagon T* 2/25 ZF.2',
658
663
  '00 54 3C 3C 18 18 00 00' => 'Carl Zeiss Distagon T* 2/28 ZF.2',
@@ -710,6 +715,7 @@ sub GetAFPointGrid($$;$);
710
715
  '00 48 80 80 30 30 00 00' => 'Nikkor 200mm f/4 AiS',
711
716
  '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
712
717
  '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
718
+ '4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
713
719
  );
714
720
 
715
721
  # text encoding used in LocationInfo (ref PH)
@@ -877,6 +883,38 @@ my %afPoints39 = (
877
883
  10 => 'E3', 20 => 'B9', 30 => 'D4',
878
884
  );
879
885
 
886
+ # AF point indices for models with 105 focus points, eg. D6 (ref 28)
887
+ # - 7 rows (A-G) with 15 columns (1-15), center is D8
888
+ my %afPoints105 = (
889
+ 1 => 'D8', 28 => 'G7', 55 => 'F13', 82 => 'E4',
890
+ 2 => 'C8', 29 => 'D6', 56 => 'G13', 83 => 'F4',
891
+ 3 => 'B8', 30 => 'C6', 57 => 'D14', 84 => 'G4',
892
+ 4 => 'A8', 31 => 'B6', 58 => 'C14', 85 => 'D3',
893
+ 5 => 'E8', 32 => 'A6', 59 => 'B14', 86 => 'C3',
894
+ 6 => 'F8', 33 => 'E6', 60 => 'A14', 87 => 'B3',
895
+ 7 => 'G8', 34 => 'F6', 61 => 'E14', 88 => 'A3',
896
+ 8 => 'D9', 35 => 'G6', 62 => 'F14', 89 => 'E3',
897
+ 9 => 'C9', 36 => 'D11', 63 => 'G14', 90 => 'F3',
898
+ 10 => 'B9', 37 => 'C11', 64 => 'D15', 91 => 'G3',
899
+ 11 => 'A9', 38 => 'B11', 65 => 'C15', 92 => 'D2',
900
+ 12 => 'E9', 39 => 'A11', 66 => 'B15', 93 => 'C2',
901
+ 13 => 'F9', 40 => 'E11', 67 => 'A15', 94 => 'B2',
902
+ 14 => 'G9', 41 => 'F11', 68 => 'E15', 95 => 'A2',
903
+ 15 => 'D10', 42 => 'G11', 69 => 'F15', 96 => 'E2',
904
+ 16 => 'C10', 43 => 'D12', 70 => 'G15', 97 => 'F2',
905
+ 17 => 'B10', 44 => 'C12', 71 => 'D5', 98 => 'G2',
906
+ 18 => 'A10', 45 => 'B12', 72 => 'C5', 99 => 'D1',
907
+ 19 => 'E10', 46 => 'A12', 73 => 'B5', 100 => 'C1',
908
+ 20 => 'F10', 47 => 'E12', 74 => 'A5', 101 => 'B1',
909
+ 21 => 'G10', 48 => 'F12', 75 => 'E5', 102 => 'A1',
910
+ 22 => 'D7', 49 => 'G12', 76 => 'F5', 103 => 'E1',
911
+ 23 => 'C7', 50 => 'D13', 77 => 'G5', 104 => 'F1',
912
+ 24 => 'B7', 51 => 'C13', 78 => 'D4', 105 => 'G1',
913
+ 25 => 'A7', 52 => 'B13', 79 => 'C4',
914
+ 26 => 'E7', 53 => 'A13', 80 => 'B4',
915
+ 27 => 'F7', 54 => 'E13', 81 => 'A4',
916
+ );
917
+
880
918
  # AF point indices for models with 135 focus points, eg. 1J1 (ref PH)
881
919
  # - 9 rows (A-I) with 15 columns (1-15), center is E8
882
920
  # - odd columns, columns 2 and 14, and the remaining corner points are
@@ -1539,7 +1577,7 @@ my %binaryDataAttrs = (
1539
1577
  0x008c => {
1540
1578
  Name => 'ContrastCurve', #JD
1541
1579
  Writable => 'undef',
1542
- Flags => [ 'Binary', 'Protected' ],
1580
+ Flags => [ 'Binary', 'Protected', 'Drop' ], # (drop because not found in Nikon JPEG's)
1543
1581
  },
1544
1582
  # ColorHue: MODE1/MODE1a=sRGB, MODE2=Adobe RGB, MODE3a=more saturated sRGB
1545
1583
  # --> should really be called ColorSpace or ColorMode, but that would conflict with other tags
@@ -1694,7 +1732,8 @@ my %binaryDataAttrs = (
1694
1732
  SubDirectory => {
1695
1733
  TagTable => 'Image::ExifTool::Nikon::ShotInfoD850',
1696
1734
  DecryptStart => 4,
1697
- DecryptLen => 0x2f07,
1735
+ DecryptLen => 0x2efb + 12,
1736
+ DecryptMore => 'Get32u(\$data, 0xa0) + 12',
1698
1737
  ByteOrder => 'LittleEndian',
1699
1738
  },
1700
1739
  },
@@ -1783,6 +1822,16 @@ my %binaryDataAttrs = (
1783
1822
  ByteOrder => 'LittleEndian',
1784
1823
  },
1785
1824
  },
1825
+ { # (D6 firmware version 1.00, ref 28)
1826
+ Condition => '$$valPt =~ /^0246/',
1827
+ Name => 'ShotInfoD6',
1828
+ SubDirectory => {
1829
+ TagTable => 'Image::ExifTool::Nikon::ShotInfo',
1830
+ DecryptStart => 4,
1831
+ DecryptLen => 0xa4, # only decrypt the version info & offset fields for now
1832
+ ByteOrder => 'LittleEndian',
1833
+ },
1834
+ },
1786
1835
  { # (D610 firmware version 1.00)
1787
1836
  Condition => '$$valPt =~ /^0232/',
1788
1837
  Name => 'ShotInfoD610',
@@ -1832,6 +1881,7 @@ my %binaryDataAttrs = (
1832
1881
  7 => 'Unpacked 12 bits', #IB (padded to 16)
1833
1882
  8 => 'Small', #IB
1834
1883
  9 => 'Packed 12 bits', #IB (2 pixels in 3 bytes)
1884
+ 10 => 'Packed 14 bits', #28 (4 pixels in 7 bytes, eg. D6 uncompressed 14 bit)
1835
1885
  },
1836
1886
  },
1837
1887
  0x0094 => { Name => 'SaturationAdj', Writable => 'int16s' },
@@ -2033,7 +2083,7 @@ my %binaryDataAttrs = (
2033
2083
  },
2034
2084
  },
2035
2085
  {
2036
- Condition => '$$valPt =~ /^0800/', # Z6/Z7
2086
+ Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
2037
2087
  Name => 'LensData0800',
2038
2088
  SubDirectory => {
2039
2089
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -3298,6 +3348,7 @@ my %binaryDataAttrs = (
3298
3348
  15 => 'Dynamic Area (72 points)', #PH
3299
3349
  16 => 'Group Area (HL)', #28
3300
3350
  17 => 'Group Area (VL)', #28
3351
+ 18 => 'Dynamic Area (49 points)', #28
3301
3352
  128 => 'Single', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V2,1V3)
3302
3353
  129 => 'Auto (41 points)', #PH (1J1,1J2,1J3,1J4,1S1,1S2,1V1,1V2,1V3,AW1)
3303
3354
  130 => 'Subject Tracking (41 points)', #PH (1J1,1J4,1J3)
@@ -3335,6 +3386,10 @@ my %binaryDataAttrs = (
3335
3386
  197 => 'Auto', #PH (Z7)
3336
3387
  198 => 'Auto (198)', #PH (Z7) (focus lock with AF-C maybe?)
3337
3388
  199 => 'Auto (focus lock)', #PH (Z7, AF-S)
3389
+ 200 => 'Normal-area AF', #28 (D6)
3390
+ 201 => 'Wide-area AF', #28 (D6)
3391
+ 202 => 'Face-priority AF', #28 (D6)
3392
+ 203 => 'Subject-tracking AF', #28 (D6)
3338
3393
  },
3339
3394
  },
3340
3395
  ],
@@ -3353,12 +3408,14 @@ my %binaryDataAttrs = (
3353
3408
  6 => 'On (105-point)', #PH (1J4/1V3[128/130])
3354
3409
  7 => 'On (153-point)', #PH (D5/D500/D850)
3355
3410
  8 => 'On (81-point)', #38
3411
+ 9 => 'On (105-point)', #28 (D6)
3356
3412
  },
3357
3413
  },
3358
3414
  7 => [
3359
3415
  { #PH/JD
3360
3416
  Name => 'PrimaryAFPoint',
3361
- Condition => '$$self{PhaseDetectAF} < 2',
3417
+ # PrimaryAFPoint may only be valid for PhaseDetect - certainly true on the D6, possibly other bodies? (ref 28)
3418
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3362
3419
  Notes => q{
3363
3420
  models with 51-point AF -- 5 rows (A-E) and 11 columns (1-11): D3, D3S, D3X,
3364
3421
  D4, D4S, D300, D300S, D700, D800, D800e and D810
@@ -3493,7 +3550,7 @@ my %binaryDataAttrs = (
3493
3550
  8 => [
3494
3551
  { #JD/PH
3495
3552
  Name => 'AFPointsUsed',
3496
- Condition => '$$self{PhaseDetectAF} < 2',
3553
+ Condition => '$$self{PhaseDetectAF} < 2 and $$self{AFInfo2Version} ne "0301"',
3497
3554
  Notes => q{
3498
3555
  models with 51-point AF -- 5 rows: A1-9, B1-11, C1-11, D1-11, E1-9. Center
3499
3556
  point is C6
@@ -3612,6 +3669,8 @@ my %binaryDataAttrs = (
3612
3669
  },
3613
3670
  { #PH
3614
3671
  Name => 'AFPointsUsed',
3672
+ # version 301 uses a separate field at offset 0x0a for this tag (ref 28)
3673
+ Condition => '$$self{AFInfo2Version} ne "0301"',
3615
3674
  Format => 'undef[7]',
3616
3675
  ValueConv => 'join(" ", unpack("H2"x7, $val))',
3617
3676
  ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
@@ -3619,6 +3678,19 @@ my %binaryDataAttrs = (
3619
3678
  PrintConvInv => '$val=~s/Unknown \\((.*)\\)/$1/; $val',
3620
3679
  },
3621
3680
  ],
3681
+ 0x0a => { #28 (D6) in any of the 3 Group modes on the D6, the points specify the outer boundaries of the focus point area; otherwise the tag value is consistent with other Nikon bodies
3682
+ Name => 'AFPointsUsed',
3683
+ Condition => '$$self{AFInfo2Version} eq "0301" and $$self{PhaseDetectAF} == 9',
3684
+ Notes => q{
3685
+ models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15). Center
3686
+ point is D8
3687
+ },
3688
+ Format => 'undef[14]',
3689
+ ValueConv => 'join(" ", unpack("H2"x14, $val))',
3690
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3691
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints105); },
3692
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints105); },
3693
+ },
3622
3694
  0x10 => { #PH (D90 and D5000)
3623
3695
  Name => 'AFImageWidth',
3624
3696
  Condition => '$$self{AFInfo2Version} eq "0100"',
@@ -3661,11 +3733,21 @@ my %binaryDataAttrs = (
3661
3733
  Format => 'int16u',
3662
3734
  RawConv => '$val ? $val : undef',
3663
3735
  },
3664
- 0x1c => { #PH
3665
- Name => 'ContrastDetectAFInFocus',
3666
- Condition => '$$self{AFInfo2Version} eq "0100"',
3667
- PrintConv => { 0 => 'No', 1 => 'Yes' },
3668
- },
3736
+ 0x1c => [
3737
+ { #PH
3738
+ Name => 'ContrastDetectAFInFocus',
3739
+ Condition => '$$self{AFInfo2Version} eq "0100"',
3740
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
3741
+ },{ #PH (D500, see forum11190)
3742
+ Name => 'AFPointsSelected',
3743
+ Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
3744
+ Format => 'undef[20]',
3745
+ ValueConv => 'join(" ", unpack("H2"x20, $val))',
3746
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3747
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
3748
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
3749
+ },
3750
+ ],
3669
3751
  # 0x1d - always zero (with or without live view)
3670
3752
  0x2a => { #PH (Z7)
3671
3753
  Name => 'AFImageWidth',
@@ -3681,14 +3763,31 @@ my %binaryDataAttrs = (
3681
3763
  },
3682
3764
  0x2e => { #PH (Z7)
3683
3765
  Name => 'AFAreaXPosition',
3684
- Condition => '$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/',
3685
- Format => 'int16u',
3686
- },
3687
- 0x30 => { #PH (Z7)
3688
- Name => 'AFAreaYPosition',
3689
- Condition => '$$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/',
3766
+ Condition => q{
3767
+ $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
3768
+ $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
3769
+ },
3690
3770
  Format => 'int16u',
3691
3771
  },
3772
+ 0x30 => [
3773
+ { #PH (Z7)
3774
+ Name => 'AFAreaYPosition',
3775
+ Condition => q{
3776
+ $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
3777
+ $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
3778
+ },
3779
+ Format => 'int16u',
3780
+ },{ #PH (D500, see forum11190)
3781
+ Name => 'AFPointsInFocus',
3782
+ Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
3783
+ Notes => 'AF points in focus at the time time image was captured',
3784
+ Format => 'undef[20]',
3785
+ ValueConv => 'join(" ", unpack("H2"x20, $val))',
3786
+ ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
3787
+ PrintConv => sub { PrintAFPoints(shift, \%afPoints153); },
3788
+ PrintConvInv => sub { PrintAFPointsInv(shift, \%afPoints153); },
3789
+ },
3790
+ ],
3692
3791
  0x32 => { #PH (Z7)
3693
3792
  Name => 'AFAreaWidth',
3694
3793
  Condition => '$$self{AFInfo2Version} =~ /^03/',
@@ -3701,6 +3800,19 @@ my %binaryDataAttrs = (
3701
3800
  Format => 'int16u',
3702
3801
  RawConv => '$val ? $val : undef',
3703
3802
  },
3803
+ 0x38 => { #28
3804
+ Name => 'PrimaryAFPoint',
3805
+ Condition => '$$self{PhaseDetectAF} == 9 and $$self{AFInfo2Version} =~ /^03/',
3806
+ Notes => q{
3807
+ Nikon models with 105-point AF -- 7 rows (A-G) and 15 columns (1-15): D6
3808
+ },
3809
+ PrintConvColumns => 5,
3810
+ PrintConv => {
3811
+ 0 => '(none)',
3812
+ %afPoints105,
3813
+ 1 => 'D8 (Center)',
3814
+ },
3815
+ },
3704
3816
  0x44 => [
3705
3817
  {
3706
3818
  Name => 'PrimaryAFPoint',
@@ -3800,6 +3912,7 @@ my %binaryDataAttrs = (
3800
3912
  # (don't know what the difference between 1 and 2 is)
3801
3913
  1 => 'On (1)',
3802
3914
  2 => 'On (2)',
3915
+ 3 => 'On (Zoom)', #28
3803
3916
  },
3804
3917
  },
3805
3918
  1 => {
@@ -3809,6 +3922,7 @@ my %binaryDataAttrs = (
3809
3922
  PrintConvInv => '$val eq "n/a" ? 255 : $val',
3810
3923
  },
3811
3924
  2 => {
3925
+ # when AFFineTune = 3 (indicating a zoom lens), this Tag stores the tuning adjustment for the wide end of the zoom range (ref 28)
3812
3926
  Name => 'AFFineTuneAdj',
3813
3927
  Priority => 0, # so other value takes priority if it exists
3814
3928
  Notes => 'may only be valid for saved lenses',
@@ -3816,6 +3930,14 @@ my %binaryDataAttrs = (
3816
3930
  PrintConv => '$val > 0 ? "+$val" : $val',
3817
3931
  PrintConvInv => '$val',
3818
3932
  },
3933
+ 3 => {
3934
+ Name => 'AFFineTuneAdjTele',
3935
+ # should probably insert a Condition that restricts this to AFFineTune = 3 (ref 28)
3936
+ Notes => 'only valid for zoom lenses (ie, AFTune=3)',
3937
+ Format => 'int8s',
3938
+ PrintConv => '$val > 0 ? "+$val" : $val',
3939
+ PrintConvInv => '$val',
3940
+ },
3819
3941
  );
3820
3942
 
3821
3943
  # Nikon NEF processing information (ref forum6281)
@@ -4536,6 +4658,12 @@ my %nikonFocalConversions = (
4536
4658
  13 => 'Nikkor Z 24-70mm f/2.8 S',
4537
4659
  14 => 'Nikkor Z 85mm f/1.8 S',
4538
4660
  15 => 'Nikkor Z 24mm f/1.8 S', #IB
4661
+ 16 => 'Nikkor Z 70-200mm f/2.8 VR S', #IB
4662
+ 17 => 'Nikkor Z 20mm f/1.8 S', #IB
4663
+ 18 => 'Nikkor Z 24-200mm f/4-6.3 VR', #IB
4664
+ 21 => 'Nikkor Z 50mm f/1.2 S', #IB
4665
+ 22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
4666
+ 23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4539
4667
  },
4540
4668
  },
4541
4669
  0x36 => {
@@ -6250,7 +6378,7 @@ my %nikonFocalConversions = (
6250
6378
  # 3 => 'Rotate 180',
6251
6379
  # },
6252
6380
  #},
6253
- 0x2ea4 => {
6381
+ 0x2ea4 => { #PH
6254
6382
  Name => 'NikonMeteringMode',
6255
6383
  Condition => '$$self{Model} =~ /\bD500\b/', # (didn't seem to work for D5, but I need more samples)
6256
6384
  Notes => 'D500 only',
@@ -6627,7 +6755,7 @@ my %nikonFocalConversions = (
6627
6755
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
6628
6756
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
6629
6757
  VARS => { ID_LABEL => 'Index' },
6630
- DATAMEMBER => [ 0x04, 0x58, 0x0fbf ],
6758
+ DATAMEMBER => [ 0x04, 0x58, 0xa0, 0x0fbf, 0x2efa ],
6631
6759
  IS_SUBDIR => [ 0x1038 ],
6632
6760
  WRITABLE => 1,
6633
6761
  FIRST_ENTRY => 0,
@@ -6653,6 +6781,14 @@ my %nikonFocalConversions = (
6653
6781
  Hidden => 1,
6654
6782
  RawConv => '$$self{CustomSettingsOffset} = $val || 0x10000000; undef',
6655
6783
  },
6784
+ 0xa0 => {
6785
+ Name => 'OrientationOffset',
6786
+ DataMember => 'OrientationOffset',
6787
+ Format => 'int32u',
6788
+ Writable => 0,
6789
+ Hidden => 1,
6790
+ RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef',
6791
+ },
6656
6792
  0x0791 => {
6657
6793
  Name => 'PhotoShootingMenuBankImageArea',
6658
6794
  Mask => 0x07,
@@ -6692,6 +6828,14 @@ my %nikonFocalConversions = (
6692
6828
  TagTable => 'Image::ExifTool::NikonCustom::SettingsD850',
6693
6829
  },
6694
6830
  },
6831
+ ### 0x2efb - OrientationInfo start (D850 firmware 1.01a)
6832
+ 0x2efa => {
6833
+ Name => 'Hook1',
6834
+ Hidden => 1,
6835
+ RawConv => 'undef',
6836
+ # account for variable location of OrientationInfo data
6837
+ Hook => '$varSize = $$self{OrientationOffset} - 0x2efb',
6838
+ },
6695
6839
  0x2efb => { #28
6696
6840
  Name => 'RollAngle',
6697
6841
  Format => 'fixed32u',
@@ -8855,7 +8999,7 @@ my %nikonFocalConversions = (
8855
8999
  },
8856
9000
  },
8857
9001
  {
8858
- Condition => '$$valPt =~ /^0800/', # Z6/Z7
9002
+ Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
8859
9003
  Name => 'LensData0800',
8860
9004
  SubDirectory => {
8861
9005
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -27,6 +27,7 @@
27
27
  # 19) Brad Grier private communication
28
28
  # 22) Herbert Kauer private communication
29
29
  # 23) Daniel Pollock private communication (PEN-F)
30
+ # 24) Sebastian private communication (E-M1 Mark III)
30
31
  # IB) Iliah Borg private communication (LibRaw)
31
32
  # NJ) Niels Kristian Bech Jensen private communication
32
33
  #------------------------------------------------------------------------------
@@ -39,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
39
40
  use Image::ExifTool::Exif;
40
41
  use Image::ExifTool::APP12;
41
42
 
42
- $VERSION = '2.65';
43
+ $VERSION = '2.69';
43
44
 
44
45
  sub PrintLensInfo($$$);
45
46
 
@@ -172,6 +173,7 @@ my %olympusLensTypes = (
172
173
  '2 28 10' => 'Lumix G Vario 12-60mm F3.5-5.6 Asph. Power OIS', #NJ
173
174
  '2 29 10' => 'Leica DG Summilux 12mm F1.4 Asph.', #IB
174
175
  '2 30 10' => 'Leica DG Vario-Elmarit 12-60mm F2.8-4 Asph. Power OIS', #IB
176
+ '2 31 10' => 'Lumix G Vario 45-200mm F4.0-5.6 II', #forum3833
175
177
  '2 32 10' => 'Lumix G Vario 100-300mm F4.0-5.6 II', #PH
176
178
  '2 33 10' => 'Lumix G X Vario 12-35mm F2.8 II Asph. Power OIS', #IB
177
179
  '2 34 10' => 'Lumix G Vario 35-100mm F2.8 II', #forum3833
@@ -184,6 +186,8 @@ my %olympusLensTypes = (
184
186
  # Tamron lenses
185
187
  '5 01 10' => 'Tamron 14-150mm F3.5-5.8 Di III', #NJ (model C001)
186
188
  # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
189
+ # Other makes
190
+ '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
187
191
  );
188
192
 
189
193
  # lookup for Olympus camera types (ref PH)
@@ -1836,6 +1840,7 @@ my %indexInfo = (
1836
1840
  6 => 'Imager AF',
1837
1841
  7 => 'Live View Magnification Frame',
1838
1842
  8 => 'AF sensor',
1843
+ 9 => 'Starry Sky AF', #24
1839
1844
  },
1840
1845
  }],
1841
1846
  },
@@ -1893,9 +1898,13 @@ my %indexInfo = (
1893
1898
  },
1894
1899
  0x307 => { #15
1895
1900
  Name => 'AFFineTuneAdj',
1896
- Format => 'int16s',
1901
+ Writable => 'int16s',
1897
1902
  Count => 3, # not sure what the 3 values mean
1898
1903
  },
1904
+ 0x308 => { #forum11578
1905
+ Name => 'FocusBracketStepSize',
1906
+ Writable => 'int8u',
1907
+ },
1899
1908
  0x400 => { #6
1900
1909
  Name => 'FlashMode',
1901
1910
  Writable => 'int16u',
@@ -2120,6 +2129,11 @@ my %indexInfo = (
2120
2129
  67 => 'Soft Background Shot', #11
2121
2130
  142 => 'Hand-held Starlight', #PH (SH-21)
2122
2131
  154 => 'HDR', #PH (XZ-2)
2132
+ 197 => 'Panning', #forum11631 (EM5iii)
2133
+ 203 => 'Light Trails', #forum11631 (EM5iii)
2134
+ 204 => 'Backlight HDR', #forum11631 (EM5iii)
2135
+ 205 => 'Silent', #forum11631 (EM5iii)
2136
+ 206 => 'Multi Focus Shot', #forum11631 (EM5iii)
2123
2137
  },
2124
2138
  },
2125
2139
  0x50a => { #PH/4/6
@@ -2511,6 +2525,8 @@ my %indexInfo = (
2511
2525
  Count => 2,
2512
2526
  PrintConv => {
2513
2527
  '0 0' => 'No',
2528
+ '1 *' => 'Live Composite (* images)', #24
2529
+ '4 *' => 'Live Time/Bulb (* images)', #24
2514
2530
  '3 2' => 'ND2 (1EV)', #IB
2515
2531
  '3 4' => 'ND4 (2EV)', #IB
2516
2532
  '3 8' => 'ND8 (3EV)', #IB
@@ -2519,21 +2535,26 @@ my %indexInfo = (
2519
2535
  '5 4' => 'HDR1', #forum8906
2520
2536
  '6 4' => 'HDR2', #forum8906
2521
2537
  '8 8' => 'Tripod high resolution', #IB
2522
- '9 2' => 'Focus-stacked (2 images)', #IB
2523
- '9 3' => 'Focus-stacked (3 images)', #IB
2524
- '9 4' => 'Focus-stacked (4 images)', #IB
2525
- '9 5' => 'Focus-stacked (5 images)', #IB
2526
- '9 6' => 'Focus-stacked (6 images)', #IB
2527
- '9 7' => 'Focus-stacked (7 images)', #IB
2528
- '9 8' => 'Focus-stacked (8 images)',
2529
- '9 9' => 'Focus-stacked (9 images)', #IB
2530
- '9 10' => 'Focus-stacked (10 images)', #IB
2531
- '9 11' => 'Focus-stacked (11 images)', #IB
2532
- '9 12' => 'Focus-stacked (12 images)', #IB
2533
- '9 13' => 'Focus-stacked (13 images)', #IB
2534
- '9 14' => 'Focus-stacked (14 images)', #IB
2535
- '9 15' => 'Focus-stacked (15 images)', #IB
2536
- '11 16' => 'Hand-held high resolution', #IB
2538
+ '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
2539
+ '11 16' => 'Hand-held high resolution', #IB (perhaps '11 15' would be possible, ref 24)
2540
+ OTHER => sub {
2541
+ my ($val, $inv, $conv) = @_;
2542
+ if ($inv) {
2543
+ $val = lc $val;
2544
+ return undef unless $val =~ s/(\d+) images/\* images/;
2545
+ my $num = $1;
2546
+ foreach (keys %$conv) {
2547
+ next unless $val eq lc $$conv{$_};
2548
+ ($val = $_) =~ s/\*/$num/ or return undef;
2549
+ return $val;
2550
+ }
2551
+ } else {
2552
+ return "Unknown ($_[0])" unless $val =~ s/ (\d+)/ \*/ and $$conv{$val};
2553
+ my $num = $1;
2554
+ ($val = $$conv{$val}) =~ s/\*/$num/;
2555
+ return $val;
2556
+ }
2557
+ },
2537
2558
  },
2538
2559
  },
2539
2560
  0x900 => { #11
@@ -2894,6 +2915,7 @@ my %indexInfo = (
2894
2915
  Count => 2,
2895
2916
  PrintConv => [{
2896
2917
  0 => 'Off',
2918
+ 1 => 'Live Composite', #github issue#61
2897
2919
  2 => 'On (2 frames)',
2898
2920
  3 => 'On (3 frames)',
2899
2921
  }],