exiftool-vendored.pl 12.41.0 → 12.44.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/Changes +60 -1
  2. package/bin/META.json +1 -1
  3. package/bin/META.yml +1 -1
  4. package/bin/README +2 -2
  5. package/bin/exiftool +5 -4
  6. package/bin/lib/Image/ExifTool/Apple.pm +11 -2
  7. package/bin/lib/Image/ExifTool/Canon.pm +39 -24
  8. package/bin/lib/Image/ExifTool/DJI.pm +60 -1
  9. package/bin/lib/Image/ExifTool/DNG.pm +8 -2
  10. package/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  11. package/bin/lib/Image/ExifTool/Exif.pm +9 -0
  12. package/bin/lib/Image/ExifTool/FlashPix.pm +23 -2
  13. package/bin/lib/Image/ExifTool/FujiFilm.pm +23 -2
  14. package/bin/lib/Image/ExifTool/GPS.pm +21 -1
  15. package/bin/lib/Image/ExifTool/Geotag.pm +24 -4
  16. package/bin/lib/Image/ExifTool/ICC_Profile.pm +10 -8
  17. package/bin/lib/Image/ExifTool/ID3.pm +5 -5
  18. package/bin/lib/Image/ExifTool/LNK.pm +5 -2
  19. package/bin/lib/Image/ExifTool/MakerNotes.pm +5 -0
  20. package/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  21. package/bin/lib/Image/ExifTool/Nikon.pm +84 -29
  22. package/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  23. package/bin/lib/Image/ExifTool/Olympus.pm +21 -2
  24. package/bin/lib/Image/ExifTool/PDF.pm +2 -1
  25. package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
  26. package/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  27. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  28. package/bin/lib/Image/ExifTool/Photoshop.pm +6 -5
  29. package/bin/lib/Image/ExifTool/QuickTime.pm +7 -1
  30. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -6
  31. package/bin/lib/Image/ExifTool/README +8 -2
  32. package/bin/lib/Image/ExifTool/Samsung.pm +233 -2
  33. package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  34. package/bin/lib/Image/ExifTool/Sony.pm +36 -28
  35. package/bin/lib/Image/ExifTool/TagLookup.pm +2528 -2483
  36. package/bin/lib/Image/ExifTool/TagNames.pod +192 -97
  37. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  38. package/bin/lib/Image/ExifTool/Writer.pl +4 -3
  39. package/bin/lib/Image/ExifTool.pm +40 -16
  40. package/bin/lib/Image/ExifTool.pod +13 -4
  41. package/bin/perl-Image-ExifTool.spec +1 -1
  42. package/bin/pp_build_exe.args +4 -4
  43. package/package.json +3 -3
@@ -14,6 +14,7 @@
14
14
  # 2019/07/02 - PH Added ability to read IMU CSV files
15
15
  # 2019/11/10 - PH Also write pitch to CameraElevationAngle
16
16
  # 2020/12/01 - PH Added ability to read DJI CSV log files
17
+ # 2022/06/21 - PH Added ability to read Google Takeout JSON files
17
18
  #
18
19
  # References: 1) http://www.topografix.com/GPX/1/1/
19
20
  # 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
@@ -28,7 +29,7 @@ use vars qw($VERSION);
28
29
  use Image::ExifTool qw(:Public);
29
30
  use Image::ExifTool::GPS;
30
31
 
31
- $VERSION = '1.66';
32
+ $VERSION = '1.68';
32
33
 
33
34
  sub JITTER() { return 2 } # maximum time jitter
34
35
 
@@ -133,7 +134,7 @@ sub LoadTrackLog($$;$)
133
134
  local ($_, $/, *EXIFTOOL_TRKFILE);
134
135
  my ($et, $val) = @_;
135
136
  my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
136
- my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings);
137
+ my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings, $sortFixes);
137
138
  my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime);
138
139
 
139
140
  unless (eval { require Time::Local }) {
@@ -285,6 +286,10 @@ sub LoadTrackLog($$;$)
285
286
  }
286
287
  }
287
288
  next;
289
+ } elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)":/) {
290
+ # Google Takeout JSON format
291
+ $format = 'JSON';
292
+ $sortFixes = 1; # (fixes are not all in order for this format)
288
293
  } else {
289
294
  # search only first 50 lines of file for a valid fix
290
295
  last if ++$skipped > 50;
@@ -506,6 +511,19 @@ DoneFix: $isDate = 1;
506
511
  goto DoneFix;
507
512
  }
508
513
  next;
514
+ } elsif ($format eq 'JSON') {
515
+ # Google Takeout JSON format
516
+ if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp)":\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
517
+ if ($1 eq 'timestamp') {
518
+ $time = GetTime($2);
519
+ goto DoneFix if $time and $$fix{lat} and $$fix{lon};
520
+ } elsif ($1 eq 'latitudeE7' or $1 eq 'latE7') {
521
+ $$fix{lat} = $2 * 1e-7;
522
+ } else {
523
+ $$fix{lon} = $2 * 1e-7;
524
+ }
525
+ }
526
+ next;
509
527
  }
510
528
  my (%fix, $secs, $date, $nmea);
511
529
  if ($format eq 'NMEA') {
@@ -751,6 +769,8 @@ DoneFix: $isDate = 1;
751
769
  $numPoints -= $cutHDOP;
752
770
  $numPoints -= $cutSats;
753
771
  }
772
+ # sort fixes if necessary
773
+ @fixTimes = sort { $a <=> $b } @fixTimes if $sortFixes;
754
774
  # mark first fix of the track
755
775
  while (@fixTimes) {
756
776
  $fix = $$points{$fixTimes[0]} or shift(@fixTimes), next;
@@ -1409,8 +1429,8 @@ This module is used by Image::ExifTool
1409
1429
  This module loads GPS track logs, interpolates to determine position based
1410
1430
  on time, and sets new GPS values for geotagging images. Currently supported
1411
1431
  formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
1412
- PMGNTRK, Honeywell PTNTHPR, Winplus Beacon text, IMU CSV, DJI CSV, and
1413
- Bramor gEO log files.
1432
+ PMGNTRK, Honeywell PTNTHPR, Bramor gEO, Winplus Beacon text, Google Takeout
1433
+ JSON, GPS/IMU CSV, DJI CSV, ExifTool CSV log files.
1414
1434
 
1415
1435
  Methods in this module should not be called directly. Instead, the Geotag
1416
1436
  feature is accessed by writing the values of the ExifTool Geotag, Geosync
@@ -25,7 +25,7 @@ use strict;
25
25
  use vars qw($VERSION);
26
26
  use Image::ExifTool qw(:DataAccess :Utils);
27
27
 
28
- $VERSION = '1.38';
28
+ $VERSION = '1.39';
29
29
 
30
30
  sub ProcessICC($$);
31
31
  sub ProcessICC_Profile($$$);
@@ -522,11 +522,11 @@ my %manuSig = ( #6
522
522
  prmg => 'Perceptual Reference Medium Gamut',
523
523
  },
524
524
  },
525
- meta => { #5 (EVENTUALLY DECODE THIS ONCE WE HAVE A SAMPLE!!)
525
+ meta => { #5
526
526
  Name => 'Metadata',
527
527
  SubDirectory => {
528
528
  TagTable => 'Image::ExifTool::ICC_Profile::Metadata',
529
- Validate => '$type eq "meta"',
529
+ Validate => '$type eq "dict"',
530
530
  },
531
531
  },
532
532
 
@@ -891,6 +891,7 @@ my %manuSig = ( #6
891
891
  ManufacturerName => { },
892
892
  MediaColor => { },
893
893
  MediaWeight => { },
894
+ CreatorApp => { },
894
895
  );
895
896
 
896
897
  #------------------------------------------------------------------------------
@@ -1000,7 +1001,7 @@ sub FormatICCTag($$$)
1000
1001
  }
1001
1002
 
1002
1003
  #------------------------------------------------------------------------------
1003
- # Process ICC metadata record (ref 5) (UNTESTED!)
1004
+ # Process ICC metadata record (ref 5)
1004
1005
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1005
1006
  # Returns: 1 on success
1006
1007
  sub ProcessMetadata($$$)
@@ -1032,7 +1033,7 @@ sub ProcessMetadata($$$)
1032
1033
  my $namePtr = Get32u($dataPt, $entry);
1033
1034
  my $nameLen = Get32u($dataPt, $entry + 4);
1034
1035
  my $valuePtr = Get32u($dataPt, $entry + 8);
1035
- my $valueLen = Get32u($dataPt, $entry + 16);
1036
+ my $valueLen = Get32u($dataPt, $entry + 12);
1036
1037
  next unless $namePtr and $valuePtr; # ignore if offsets are zero
1037
1038
  if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
1038
1039
  $valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
@@ -1040,8 +1041,8 @@ sub ProcessMetadata($$$)
1040
1041
  $et->Warn('Corrupted ICC meta dictionary');
1041
1042
  last;
1042
1043
  }
1043
- my $tag = substr($dataPt, $dirStart + $namePtr, $nameLen);
1044
- my $val = substr($dataPt, $dirStart + $valuePtr, $valueLen);
1044
+ my $tag = substr($$dataPt, $dirStart + $namePtr, $nameLen);
1045
+ my $val = substr($$dataPt, $dirStart + $valuePtr, $valueLen);
1045
1046
  $tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8');
1046
1047
  $val = $et->Decode($val, 'UTF16', 'MM');
1047
1048
  # generate tagInfo if it doesn't exist
@@ -1050,6 +1051,7 @@ sub ProcessMetadata($$$)
1050
1051
  $name =~ s/\s+(.)/\u$1/g;
1051
1052
  $name =~ tr/-_a-zA-Z0-9//dc;
1052
1053
  next unless length $name;
1054
+ $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
1053
1055
  AddTagToTable($tagTablePtr, $tag, { Name => $name });
1054
1056
  }
1055
1057
  $et->HandleTag($tagTablePtr, $tag, $val);
@@ -1312,7 +1314,7 @@ sub ProcessICC_Profile($$$)
1312
1314
  DirName => $name,
1313
1315
  Parent => $$dirInfo{DirName},
1314
1316
  );
1315
- my $type = substr($$dataPt, $valuePtr, 4);
1317
+ my $type = $fmt;
1316
1318
  #### eval Validate ($type)
1317
1319
  if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
1318
1320
  $et->Warn("Invalid ICC $name data");
@@ -6,7 +6,7 @@
6
6
  # Revisions: 09/12/2005 - P. Harvey Created
7
7
  # 09/08/2020 - PH Added Lyrics3 support
8
8
  #
9
- # References: 1) http://www.id3.org/
9
+ # References: 1) http://www.id3.org/ (now https://id3.org)
10
10
  # 2) http://www.mp3-tech.org/
11
11
  # 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
12
12
  # 4) https://id3.org/Lyrics3
@@ -76,9 +76,9 @@ my %dateTimeConv = (
76
76
  OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
77
77
  languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
78
78
  followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
79
- "Comment-spa"). See L<http://www.id3.org/> for the official ID3
80
- specification and L<http://www.loc.gov/standards/iso639-2/php/code_list.php>
81
- for a list of ISO 639-2 language codes.
79
+ "Comment-spa"). See L<https://id3.org/> for the official ID3 specification
80
+ and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of
81
+ ISO 639-2 language codes.
82
82
  },
83
83
  ID3v1 => {
84
84
  Name => 'ID3v1',
@@ -1661,7 +1661,7 @@ under the same terms as Perl itself.
1661
1661
 
1662
1662
  =over 4
1663
1663
 
1664
- =item L<http://www.id3.org/>
1664
+ =item L<https://id3.org/>
1665
1665
 
1666
1666
  =item L<http://www.mp3-tech.org/>
1667
1667
 
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.07';
18
+ $VERSION = '1.08';
19
19
 
20
20
  sub ProcessItemID($$$);
21
21
  sub ProcessLinkInfo($$$);
@@ -273,7 +273,9 @@ sub ProcessLinkInfo($$$);
273
273
  6 => 'Ram Disk',
274
274
  },
275
275
  },
276
- DriveSerialNumber => { },
276
+ DriveSerialNumber => {
277
+ PrintConv => 'join("-", unpack("A4 A4", sprintf("%08X", $val)))',
278
+ },
277
279
  VolumeLabel => { },
278
280
  LocalBasePath => { },
279
281
  CommonNetworkRelLink => { },
@@ -508,6 +510,7 @@ sub ProcessLinkInfo($$$)
508
510
  if ($off + 0x20 <= $dataLen) {
509
511
  # my $len = Get32u($dataPt, $off);
510
512
  $et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
513
+ $et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8);
511
514
  $pos = Get32u($dataPt, $off + 0x0c);
512
515
  if ($pos == 0x14) {
513
516
  # use VolumeLabelOffsetUnicode instead
@@ -89,6 +89,11 @@ my $debug; # set to 1 to enable debugging code
89
89
  FixBase => 1, # necessary for AVI and MOV videos
90
90
  },
91
91
  },
92
+ {
93
+ Name => 'MakerNoteDJIInfo',
94
+ Condition => '$$valPt =~ /^\[ae_dbg_info:/',
95
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
96
+ },
92
97
  {
93
98
  Name => 'MakerNoteDJI',
94
99
  Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool::Exif;
16
16
 
17
- $VERSION = '1.01';
17
+ $VERSION = '1.02';
18
18
 
19
19
  # Motorola makernotes tags (ref PH)
20
20
  %Image::ExifTool::Motorola::Main = (
@@ -54,7 +54,12 @@ $VERSION = '1.01';
54
54
  # 0x6400 - string: 'AUTO','ON','OFF'
55
55
  # 0x6401 - string: 'HDR'
56
56
  # 0x6410 - string: 'NO','YES'
57
- # 0x6420 - int32s: 0 (only exists in HDR images?)
57
+ # 0x6420 - int32s for some models: 0 (only exists in HDR images?)
58
+ 0x6420 => { #forum13731
59
+ Condition => '$format eq "string"',
60
+ Name => 'CustomRendered',
61
+ Writable => 'string',
62
+ },
58
63
  # 0x6430 - float
59
64
  # 0x6431 - int8u: 0,1
60
65
  # 0x6432 - int8u: 0,79,100
@@ -89,6 +94,7 @@ $VERSION = '1.01';
89
94
  # 0x64c2,0x64c3 - int32s
90
95
  # 0x64c4 - int32s
91
96
  # 0x64c5 - int32u
97
+ 0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731
92
98
  # 0x6500 - int8u: 1
93
99
  # 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0
94
100
  # 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
  use Image::ExifTool::XMP;
65
65
 
66
- $VERSION = '4.05';
66
+ $VERSION = '4.08';
67
67
 
68
68
  sub LensIDConv($$$);
69
69
  sub ProcessNikonAVI($$$);
@@ -606,6 +606,7 @@ sub GetAFPointGrid($$;$);
606
606
  'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
607
607
  'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
608
608
  'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
609
+ 'E3 40 76 A6 38 40 DF 0E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2 (A022)', #forum3833
609
610
  '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
610
611
  '00 3E 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di LD (IF) (A08)',
611
612
  '00 3F 80 A0 38 3F 00 02' => 'Tamron SP AF 200-500mm f/5-6.3 Di (A08)',
@@ -667,6 +668,7 @@ sub GetAFPointGrid($$;$);
667
668
  '00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
668
669
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
669
670
  '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
671
+ '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
670
672
  #
671
673
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
672
674
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -2079,7 +2081,7 @@ my %base64coord = (
2079
2081
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
2080
2082
  DecryptStart => 4,
2081
2083
  # TODO: eventually set the length dynamically according to actual offsets!
2082
- DecryptLen => 0xec4b + 1646, # decoded thru end of CustomSettingZ9 in Offset26 (+MenuSettingsZ9Offset)
2084
+ DecryptLen => 0xec4b + 1907, # decoded thru end of Offset26
2083
2085
  ByteOrder => 'LittleEndian',
2084
2086
  },
2085
2087
  },
@@ -4025,7 +4027,7 @@ my %base64coord = (
4025
4027
  },
4026
4028
  Format => 'int16u',
4027
4029
  },
4028
- 0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4030
+ 0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4029
4031
  Name => 'AFFocusPointXPosition',
4030
4032
  Condition => q{
4031
4033
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
@@ -4193,11 +4195,19 @@ my %base64coord = (
4193
4195
  },
4194
4196
  0x43 => {
4195
4197
  Name => 'FocusPositionHorizontal',
4196
- PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4198
+ Notes => q{
4199
+ the focus points form a 29x17 grid, but the X,Y coordinate values run from 1,1
4200
+ to 30,19. The horizontal coordinate 11R (5) and the vertical coordinates 6U
4201
+ (4) and 2D (12) are not used for some reason
4202
+ },
4203
+ # 493 focus points for Z9 fall in a 30x19 grid
4204
+ # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
4205
+ PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
4197
4206
  },
4198
4207
  0x45 => {
4199
4208
  Name => 'FocusPositionVertical',
4200
- PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17 ); },
4209
+ # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
4210
+ PrintConv => sub { my ($val) = @_; PrintAFPointsUpDown($val, 17); },
4201
4211
  },
4202
4212
  0x46 => {
4203
4213
  Name => 'AFAreaWidth',
@@ -4857,7 +4867,7 @@ my %nikonFocalConversions = (
4857
4867
  %binaryDataAttrs,
4858
4868
  NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
4859
4869
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4860
- DATAMEMBER => [ 0x03, 0x2f ],
4870
+ DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
4861
4871
  0x00 => {
4862
4872
  Name => 'LensDataVersion',
4863
4873
  Format => 'string[4]',
@@ -4883,12 +4893,12 @@ my %nikonFocalConversions = (
4883
4893
  %nikonApertureConversions,
4884
4894
  },
4885
4895
  # --> another extra byte at position 0x08 in this version of LensData (PH)
4886
- 0x09 => {
4887
- Name => 'FocusPosition',
4888
- Condition => '$$self{OldLensData}',
4889
- PrintConv => 'sprintf("0x%02x", $val)',
4890
- PrintConvInv => '$val',
4891
- },
4896
+ #0x09 => {
4897
+ # Name => 'FocusPosition', #28 - this appears to be copied from an older version of LensData and is no longer valid. Text with Z9 and Z7_2 with a variety of lenses
4898
+ # Condition => '$$self{OldLensData}',
4899
+ # PrintConv => 'sprintf("0x%02x", $val)',
4900
+ # PrintConvInv => '$val',
4901
+ #},
4892
4902
  0x0b => {
4893
4903
  Notes => 'this focus distance is approximate, and not very accurate for some lenses',
4894
4904
  Name => 'FocusDistance',
@@ -4947,7 +4957,8 @@ my %nikonFocalConversions = (
4947
4957
  %nikonApertureConversions,
4948
4958
  },
4949
4959
  #
4950
- # ---- new LensData tags used by Nikkor Z lenses ---- (ref PH)
4960
+ # ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ----
4961
+ # (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28)
4951
4962
  #
4952
4963
  0x2f => { # look forward to see if new lens data exists...
4953
4964
  Name => 'NewLensData',
@@ -4955,7 +4966,7 @@ my %nikonFocalConversions = (
4955
4966
  RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
4956
4967
  Hidden => 1,
4957
4968
  },
4958
- 0x30 => {
4969
+ 0x30 => { #PH
4959
4970
  Name => 'LensID',
4960
4971
  Condition => '$$self{NewLensData}',
4961
4972
  Notes => 'tags from here onward used for Nikkor Z lenses only',
@@ -4981,9 +4992,22 @@ my %nikonFocalConversions = (
4981
4992
  27 => 'Nikkor Z MC 50mm f/2.8', #IB
4982
4993
  28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
4983
4994
  29 => 'Nikkor Z 28mm f/2.8', #IB
4995
+ 30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
4996
+ 31 => 'Nikkor Z 24-120 f/4', #28
4997
+ 32 => 'Nikkor Z 800mm f/6.3 VR S', #28
4984
4998
  },
4985
4999
  },
4986
- 0x36 => {
5000
+ 0x35 => { #28
5001
+ Name => 'LensMountType',
5002
+ RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
5003
+ Format => 'int8u',
5004
+ Unknown => 1,
5005
+ PrintConv => {
5006
+ 0 => 'F-mount Lens',
5007
+ 1 => 'Z-mount Lens',
5008
+ },
5009
+ },
5010
+ 0x36 => { #PH
4987
5011
  Name => 'MaxAperture',
4988
5012
  Condition => '$$self{NewLensData}',
4989
5013
  Format => 'int16u',
@@ -4993,7 +5017,7 @@ my %nikonFocalConversions = (
4993
5017
  PrintConv => 'sprintf("%.1f",$val)',
4994
5018
  PrintConvInv => '$val',
4995
5019
  },
4996
- 0x38 => {
5020
+ 0x38 => { #PH
4997
5021
  Name => 'FNumber',
4998
5022
  Condition => '$$self{NewLensData}',
4999
5023
  Format => 'int16u',
@@ -5003,7 +5027,7 @@ my %nikonFocalConversions = (
5003
5027
  PrintConv => 'sprintf("%.1f",$val)',
5004
5028
  PrintConvInv => '$val',
5005
5029
  },
5006
- 0x3c => {
5030
+ 0x3c => { #PH
5007
5031
  Name => 'FocalLength',
5008
5032
  Condition => '$$self{NewLensData}',
5009
5033
  Format => 'int16u',
@@ -5011,14 +5035,36 @@ my %nikonFocalConversions = (
5011
5035
  PrintConv => '"$val mm"',
5012
5036
  PrintConvInv => '$val=~s/\s*mm$//;$val',
5013
5037
  },
5014
- 0x4f => {
5015
- Name => 'FocusDistance',
5016
- Condition => '$$self{NewLensData}',
5017
- # (perhaps int16u Format? -- although upper byte would always be zero)
5038
+ 0x4c => { #28
5039
+ Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity.
5040
+ Format => 'int8u',
5041
+ Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5042
+ RawConv => '$$self{FocusDistanceRangeWidth} = $val',
5043
+ Unknown => 1,
5044
+ },
5045
+ 0x4e => { #28
5046
+ Name => 'FocusDistance',
5047
+ Format => 'int16u',
5048
+ Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5049
+ RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter
5018
5050
  ValueConv => '0.01 * 10**($val/40)', # in m
5019
5051
  ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
5020
- PrintConv => '$val ? sprintf("%.2f m",$val) : "inf"',
5021
- PrintConvInv => '$val eq "inf" ? 0 : $val =~ s/\s*m$//, $val',
5052
+ PrintConv => q{
5053
+ $$self{FocusDistanceRangeWidth} == 0 ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
5054
+ },
5055
+ },
5056
+ 0x56 => { #28
5057
+ Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
5058
+ Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5059
+ Format => 'int8u',
5060
+ RawConv => 'unless ($$self{FocusDistanceRangeWidth} == 0 ) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
5061
+ Unknown => 1,
5062
+ },
5063
+ 0x5a => { #28
5064
+ Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
5065
+ Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5066
+ Format => 'int32s',
5067
+ Unknown => 1,
5022
5068
  },
5023
5069
  );
5024
5070
 
@@ -8586,6 +8632,8 @@ my %nikonFocalConversions = (
8586
8632
  4 => 'Wide (L)',
8587
8633
  5 => '3D',
8588
8634
  6 => 'Auto',
8635
+ 12 => 'Wide (C1)',
8636
+ 13 => 'Wide (C2)',
8589
8637
  },
8590
8638
  },
8591
8639
  530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
@@ -8656,6 +8704,8 @@ my %nikonFocalConversions = (
8656
8704
  2 => 'H.265 8-bit (MOV)',
8657
8705
  3 => 'H.265 10-bit (MOV)',
8658
8706
  4 => 'ProRes 422 HQ 10-bit (MOV)',
8707
+ 5 => 'ProRes RAW HQ 12-bit (MOV)',
8708
+ 6 => 'NRAW 12-bit (NEV)'
8659
8709
  },
8660
8710
  },
8661
8711
  616 => {
@@ -8739,13 +8789,18 @@ my %nikonFocalConversions = (
8739
8789
  6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
8740
8790
  10 => '+05:45 (Kathmandu)',
8741
8791
  11 => '+05:30 (New Dehli)',
8792
+ 12 => '+05:00 (Islamabad)',
8793
+ 13 => '+04:30 (Kabul)',
8794
+ 14 => '+04:00 (Abu Dhabi)',
8795
+ 15 => '+03:30 (Tehran)',
8742
8796
  16 => '+03:00 (Moscow, Nairobi)',
8743
- 15 => '+02:00 (Athens)',
8744
- 16 => '+01:00 (Madrid, Paris, Berlin)',
8745
8797
  17 => '+02:00 (Athens, Helsinki)',
8746
- 18 => '+00:00 (London)',
8747
- 19 => '+00:00', #PH (unknown city)
8798
+ 18 => '+01:00 (Madrid, Paris, Berlin)',
8799
+ 19 => '+00:00 (London)',
8800
+ 20 => '-01:00 (Azores)',
8801
+ 21 => '-02:00 (Fernando de Noronha)',
8748
8802
  22 => '-03:00 (Buenos Aires, Sao Paulo)',
8803
+ 23 => '-03:30 (Newfoundland)',
8749
8804
  24 => '-04:00 (Manaus, Caracas)',
8750
8805
  25 => '-05:00 (New York, Toronto, Lima)',
8751
8806
  26 => '-06:00 (Chicago, Mexico City)',
@@ -11311,7 +11366,7 @@ sub PrintAFPointsGridInv($$$)
11311
11366
  #------------------------------------------------------------------------------
11312
11367
  # Print conversion for relative Left/Right AF points (ref 28)
11313
11368
  # Inputs: 0) column, 1) number of columns
11314
- # Returns: AF point data as a string (e.g. '2L' or 'C' or '3R')
11369
+ # Returns: AF point data as a string (e.g. '2L of Center' or 'C' or '3R of Center')
11315
11370
  sub PrintAFPointsLeftRight($$)
11316
11371
  {
11317
11372
  my ($col, $ncol) = @_;
@@ -11324,7 +11379,7 @@ sub PrintAFPointsLeftRight($$)
11324
11379
  #------------------------------------------------------------------------------
11325
11380
  # Print conversion for relative Up/Down AF points (ref 28)
11326
11381
  # Inputs: 0) row, 1) number of rows
11327
- # Returns: AF point data as a string (e.g. '2U' or 'C' or '3D')
11382
+ # Returns: AF point data as a string (e.g. '2U from Center' or 'C' or '3D from Center')
11328
11383
  sub PrintAFPointsUpDown($$)
11329
11384
  {
11330
11385
  my ($row, $nrow) = @_;
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
15
15
  use strict;
16
16
  use vars qw($VERSION);
17
17
 
18
- $VERSION = '1.19';
18
+ $VERSION = '1.20';
19
19
 
20
20
  my %buttonsZ9= (
21
21
  0 => 'None',
@@ -74,6 +74,9 @@ my %buttonsZ9= (
74
74
  82 => 'Select To Send (PC)',
75
75
  83 => 'Select To Send (FTP)',
76
76
  85 => 'Control Lock',
77
+ 86 => 'Save Focus Position',
78
+ 87 => 'Recall Focus Position',
79
+ 88 => 'Recall Shooting Functions (Hold)',
77
80
  );
78
81
  my %dialsZ9 = (
79
82
  0 => '1 Frame',
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.77';
43
+ $VERSION = '2.78';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -1911,6 +1911,23 @@ my %indexInfo = (
1911
1911
  Name => 'FocusBracketStepSize',
1912
1912
  Writable => 'int8u',
1913
1913
  },
1914
+ 0x309 => { #forum13341
1915
+ Name => 'AISubjectTrackingMode',
1916
+ Writable => 'int16u',
1917
+ ValueConv => '($val >> 8) . " " . ($val & 0xff)',
1918
+ ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
1919
+ PrintConv => [{
1920
+ 0 => 'Off',
1921
+ 1 => 'Motorsports',
1922
+ 2 => 'Airplanes',
1923
+ 3 => 'Trains',
1924
+ 4 => 'Birds',
1925
+ 5 => 'Dogs & Cats',
1926
+ },{
1927
+ 0 => 'Object Not Found',
1928
+ 1 => 'Object Found',
1929
+ }],
1930
+ },
1914
1931
  0x400 => { #6
1915
1932
  Name => 'FlashMode',
1916
1933
  Writable => 'int16u',
@@ -2538,11 +2555,13 @@ my %indexInfo = (
2538
2555
  '3 8' => 'ND8 (3EV)', #IB
2539
2556
  '3 16' => 'ND16 (4EV)', #IB
2540
2557
  '3 32' => 'ND32 (5EV)', #IB
2558
+ '3 64' => 'ND64 (6EV)', #forum13341
2541
2559
  '5 4' => 'HDR1', #forum8906
2542
2560
  '6 4' => 'HDR2', #forum8906
2543
2561
  '8 8' => 'Tripod high resolution', #IB
2544
2562
  '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
2545
- '11 16' => 'Hand-held high resolution', #IB (perhaps '11 15' would be possible, ref 24)
2563
+ '11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
2564
+ '11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
2546
2565
  OTHER => sub {
2547
2566
  my ($val, $inv, $conv) = @_;
2548
2567
  if ($inv) {
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  require Exporter;
23
23
 
24
- $VERSION = '1.54';
24
+ $VERSION = '1.55';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -2276,6 +2276,7 @@ XRef:
2276
2276
  # load XRef stream in hybrid file if it exists
2277
2277
  push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
2278
2278
  $encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
2279
+ undef $encrypt if $encrypt and $encrypt eq 'null'; # (have seen "null")
2279
2280
  if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
2280
2281
  $id = ReadPDFValue($mainDict->{ID}->[0]);
2281
2282
  }
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.16';
40
+ $VERSION = '2.17';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -2472,6 +2472,15 @@ my %shootingMode = (
2472
2472
  Start => 12,
2473
2473
  },
2474
2474
  },
2475
+ 0x200080 => { # (GH6)
2476
+ Name => 'ExifData',
2477
+ Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
2478
+ SubDirectory => {
2479
+ TagTable => 'Image::ExifTool::Exif::Main',
2480
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
2481
+ Start => 12,
2482
+ },
2483
+ },
2475
2484
  );
2476
2485
 
2477
2486
  # Panasonic Composite tags