exiftool_vendored 12.08.0 → 12.13.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +85 -2
  3. data/bin/MANIFEST +2 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -43
  7. data/bin/exiftool +176 -96
  8. data/bin/lib/Image/ExifTool.pm +15 -9
  9. data/bin/lib/Image/ExifTool.pod +62 -52
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -4
  11. data/bin/lib/Image/ExifTool/Canon.pm +181 -15
  12. data/bin/lib/Image/ExifTool/DarwinCore.pm +7 -5
  13. data/bin/lib/Image/ExifTool/GIF.pm +2 -2
  14. data/bin/lib/Image/ExifTool/Geotag.pm +29 -10
  15. data/bin/lib/Image/ExifTool/GoPro.pm +1 -9
  16. data/bin/lib/Image/ExifTool/Import.pm +14 -11
  17. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  18. data/bin/lib/Image/ExifTool/MPF.pm +2 -2
  19. data/bin/lib/Image/ExifTool/MacOS.pm +3 -1
  20. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  21. data/bin/lib/Image/ExifTool/Minolta.pm +2 -1
  22. data/bin/lib/Image/ExifTool/Nikon.pm +7 -4
  23. data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  24. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
  25. data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
  26. data/bin/lib/Image/ExifTool/QuickTime.pm +52 -22
  27. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +50 -37
  28. data/bin/lib/Image/ExifTool/README +5 -2
  29. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  30. data/bin/lib/Image/ExifTool/Sony.pm +16 -17
  31. data/bin/lib/Image/ExifTool/Stim.pm +2 -2
  32. data/bin/lib/Image/ExifTool/TagLookup.pm +5756 -5710
  33. data/bin/lib/Image/ExifTool/TagNames.pod +210 -19
  34. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -6
  35. data/bin/lib/Image/ExifTool/Writer.pl +20 -14
  36. data/bin/lib/Image/ExifTool/XMP.pm +62 -17
  37. data/bin/lib/Image/ExifTool/XMP2.pl +5 -0
  38. data/bin/perl-Image-ExifTool.spec +42 -42
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +3 -3
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.04';
18
+ $VERSION = '1.05';
19
19
 
20
20
  my %dateTimeInfo = (
21
21
  # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
@@ -52,10 +52,12 @@ my %event = (
52
52
  my $v = $self->InverseDateTime($val,undef,1);
53
53
  undef $Image::ExifTool::evalWarning;
54
54
  return $v if $v;
55
- my @a = ($val =~ /\d{1,2}/g); # get HH, MM and maybe SS
56
- return undef unless @a >= 2;
57
- $a[2] or $a[2] = 0;
58
- return sprintf('%.2d:%.2d:%.2d', @a);
55
+ # allow time-only values by adding dummy date (thanks Herb)
56
+ my $v = $self->InverseDateTime("2000:01:01 $val",undef,1);
57
+ undef $Image::ExifTool::evalWarning;
58
+ return $v if $v and $v =~ s/.* //; # strip off dummy date
59
+ $Image::ExifTool::evalWarning = 'Invalid date/time or time-only value (use HH:MM:SS[.ss][+/-HH:MM|Z])';
60
+ return undef;
59
61
  },
60
62
  },
61
63
  fieldNotes => { },
@@ -20,7 +20,7 @@ use strict;
20
20
  use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
 
23
- $VERSION = '1.17';
23
+ $VERSION = '1.18';
24
24
 
25
25
  # road map of directory locations in GIF images
26
26
  my %gifMap = (
@@ -116,7 +116,7 @@ my %gifMap = (
116
116
  },
117
117
  5 => 'BackgroundColor',
118
118
  6 => {
119
- Name => 'AspectRatio',
119
+ Name => 'PixelAspectRatio',
120
120
  RawConv => '$val ? $val : undef',
121
121
  ValueConv => '($val + 15) / 64',
122
122
  },
@@ -13,6 +13,7 @@
13
13
  # 2016/07/13 - PH Added ability to geotag date/time only
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
+ # 2020/12/01 - PH Added ability to read DJI CSV log files
16
17
  #
17
18
  # References: 1) http://www.topografix.com/GPX/1/1/
18
19
  # 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
@@ -27,7 +28,7 @@ use vars qw($VERSION);
27
28
  use Image::ExifTool qw(:Public);
28
29
  use Image::ExifTool::GPS;
29
30
 
30
- $VERSION = '1.63';
31
+ $VERSION = '1.64';
31
32
 
32
33
  sub JITTER() { return 2 } # maximum time jitter
33
34
 
@@ -133,7 +134,7 @@ sub LoadTrackLog($$;$)
133
134
  my ($et, $val) = @_;
134
135
  my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
135
136
  my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings);
136
- my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp);
137
+ my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime);
137
138
 
138
139
  unless (eval { require Time::Local }) {
139
140
  return 'Geotag feature requires Time::Local installed';
@@ -159,6 +160,7 @@ sub LoadTrackLog($$;$)
159
160
  } else {
160
161
  # $val is track file name
161
162
  if ($et->Open(\*EXIFTOOL_TRKFILE, $val)) {
163
+ $trackFile = $val;
162
164
  $raf = new File::RandomAccess(\*EXIFTOOL_TRKFILE);
163
165
  unless ($raf->Read($_, 256)) {
164
166
  close EXIFTOOL_TRKFILE;
@@ -201,6 +203,8 @@ sub LoadTrackLog($$;$)
201
203
  my $skipped = 0;
202
204
  my $lastSecs = 0;
203
205
  my $fix = { };
206
+ my $csvDelim = $et->Options('CSVDelim');
207
+ $csvDelim = ',' unless defined $csvDelim;
204
208
  my (@saveFix, $timeSpan);
205
209
  for (;;) {
206
210
  $raf->ReadLine($_) or last;
@@ -230,19 +234,31 @@ sub LoadTrackLog($$;$)
230
234
  $format = 'Winplus';
231
235
  } elsif (/^\s*\d+\s+.*\sypr\s*$/ and (@tmp=split) == 12) {
232
236
  $format = 'Bramor';
233
- } elsif (/\b(GPS)?Date/i and /\b(GPS)?(Date)?Time/i and /,/) {
237
+ } elsif (((/\b(GPS)?Date/i and /\b(GPS)?(Date)?Time/i) or /\bTime\(seconds\)/i) and /\Q$csvDelim/) {
234
238
  chomp;
235
- @csvHeadings = split ',';
239
+ @csvHeadings = split /\Q$csvDelim/;
236
240
  $format = 'CSV';
237
241
  # convert recognized headings to our parameter names
238
242
  foreach (@csvHeadings) {
239
243
  my $param;
240
244
  s/^GPS ?//; # remove leading "GPS" to simplify regex patterns
241
- if (/^Date ?Time/i) { # ExifTool addition
245
+ if (/^Time ?\(seconds\)$/i) { # DJI
246
+ # DJI CSV log files have a column "Time(seconds)" which is seconds since
247
+ # the start of the flight. The date/time is obtained from the file name.
248
+ $param = 'runtime';
249
+ if ($trackFile and $trackFile =~ /(\d{4})-(\d{2})-(\d{2})[^\/]+(\d{2})-(\d{2})-(\d{2})[^\/]*$/) {
250
+ $trackTime = Image::ExifTool::TimeLocal($6,$5,$4,$3,$2-1,$1);
251
+ my $utc = PrintFixTime($trackTime);
252
+ my $tzs = Image::ExifTool::TimeZoneString([$6,$5,$4,$3,$2-1,$1-1900],$trackTime);
253
+ $et->VPrint(2, " DJI start time: $utc (local timezone is $tzs)\n");
254
+ } else {
255
+ return 'Error getting start time from file name for DJI CSV track file';
256
+ }
257
+ } elsif (/^Date ?Time/i) { # ExifTool addition
242
258
  $param = 'datetime';
243
259
  } elsif (/^Date/i) {
244
260
  $param = 'date';
245
- } elsif (/^Time/i) {
261
+ } elsif (/^Time(?! ?\(text\))/i) { # (ignore DJI "Time(text)" column)
246
262
  $param = 'time';
247
263
  } elsif (/^(Pos)?Lat/i) {
248
264
  $param = 'lat';
@@ -423,7 +439,7 @@ DoneFix: $isDate = 1;
423
439
  goto DoneFix; # save this fix
424
440
  } elsif ($format eq 'CSV') {
425
441
  chomp;
426
- my @vals = split ',';
442
+ my @vals = split /\Q$csvDelim/;
427
443
  #
428
444
  # CSV format output of GPS/IMU POS system
429
445
  # Date* - date in DD/MM/YYYY format
@@ -435,7 +451,7 @@ DoneFix: $isDate = 1;
435
451
  # [Angle]Pitch* - pitch angle in degrees
436
452
  # [Angle]Roll* - roll angle in degrees
437
453
  # (ExifTool enhancements allow for standard tag names or descriptions as the column headings,
438
- # add support for time zones and flexible coordinates, and allow a new DateTime column)
454
+ # add support for time zones and flexible coordinates, and allow new DateTime and Shift columns)
439
455
  #
440
456
  my ($param, $date, $secs);
441
457
  foreach $param (@csvHeadings) {
@@ -463,6 +479,9 @@ DoneFix: $isDate = 1;
463
479
  }
464
480
  } elsif ($param eq 'lat' or $param eq 'lon') {
465
481
  $$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1);
482
+ } elsif ($param eq 'runtime') {
483
+ $date = $trackTime;
484
+ $secs = $val;
466
485
  } else {
467
486
  $$fix{$param} = $val;
468
487
  }
@@ -1378,8 +1397,8 @@ This module is used by Image::ExifTool
1378
1397
  This module loads GPS track logs, interpolates to determine position based
1379
1398
  on time, and sets new GPS values for geotagging images. Currently supported
1380
1399
  formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
1381
- PMGNTRK, Honeywell PTNTHPR, Winplus Beacon text, IMU CSV, and Bramor gEO log
1382
- files.
1400
+ PMGNTRK, Honeywell PTNTHPR, Winplus Beacon text, IMU CSV, DJI CSV, and
1401
+ Bramor gEO log files.
1383
1402
 
1384
1403
  Methods in this module should not be called directly. Instead, the Geotag
1385
1404
  feature is accessed by writing the values of the ExifTool Geotag, Geosync
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::QuickTime;
18
18
 
19
- $VERSION = '1.05';
19
+ $VERSION = '1.06';
20
20
 
21
21
  sub ProcessGoPro($$$);
22
22
  sub ProcessString($$$);
@@ -627,14 +627,6 @@ sub ProcessGoPro($$$)
627
627
  my $unknown = $verbose || $et->Options('Unknown');
628
628
  my ($size, $type, $unit, $scal, $setGroup0);
629
629
 
630
- # the Rove Stealth 4K writes encrypted text here, so check for this first
631
- # (really should check for this before loading GoPro module, but I was lazy) PHIL
632
- if ($$dataPt =~ /^\0\0\xf2\xe1\xf0\xeeTT/) {
633
- $et->VerboseDir('gpmd encrypted text', undef, length($$dataPt));
634
- my $strmTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
635
- Image::ExifTool::QuickTime::Process_text($et, $strmTbl, $dataPt);
636
- return 1;
637
- }
638
630
  $et->VerboseDir($$dirInfo{DirName} || 'GPMF', undef, $dirEnd-$pos) if $verbose;
639
631
  if ($pos) {
640
632
  my $parent = $$dirInfo{Parent};
@@ -12,25 +12,26 @@ require Exporter;
12
12
 
13
13
  use vars qw($VERSION @ISA @EXPORT_OK);
14
14
 
15
- $VERSION = '1.09';
15
+ $VERSION = '1.10';
16
16
  @ISA = qw(Exporter);
17
17
  @EXPORT_OK = qw(ReadCSV ReadJSON);
18
18
 
19
19
  sub ReadJSONObject($;$);
20
20
 
21
- my %unescapeJSON = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r" );
21
+ my %unescapeJSON = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", 'b' => "\b", 'f' => "\f" );
22
22
  my $charset;
23
23
 
24
24
  #------------------------------------------------------------------------------
25
25
  # Read CSV file
26
- # Inputs: 0) CSV file name, file ref or RAF ref, 1) database hash ref, 2) missing tag value
26
+ # Inputs: 0) CSV file name, file ref or RAF ref, 1) database hash ref,
27
+ # 2) missing tag value, 3) delimiter if other than ','
27
28
  # Returns: undef on success, or error string
28
29
  # Notes: There are various flavours of CSV, but here we assume that only
29
30
  # double quotes are escaped, and they are escaped by doubling them
30
- sub ReadCSV($$;$)
31
+ sub ReadCSV($$;$$)
31
32
  {
32
33
  local ($_, $/);
33
- my ($file, $database, $missingValue) = @_;
34
+ my ($file, $database, $missingValue, $delim) = @_;
34
35
  my ($buff, @tags, $found, $err, $raf, $openedFile);
35
36
 
36
37
  if (UNIVERSAL::isa($file, 'File::RandomAccess')) {
@@ -45,6 +46,7 @@ sub ReadCSV($$;$)
45
46
  $openedFile = 1;
46
47
  $raf = new File::RandomAccess(\*CSVFILE);
47
48
  }
49
+ $delim = ',' unless defined $delim;
48
50
  # set input record separator by first newline found in the file
49
51
  # (safe because first line should contain only tag names)
50
52
  while ($raf->Read($buff, 65536)) {
@@ -53,18 +55,18 @@ sub ReadCSV($$;$)
53
55
  $raf->Seek(0,0);
54
56
  while ($raf->ReadLine($buff)) {
55
57
  my (@vals, $v, $i, %fileInfo);
56
- my @toks = split ',', $buff;
58
+ my @toks = split /\Q$delim/, $buff;
57
59
  while (@toks) {
58
60
  ($v = shift @toks) =~ s/^ +//; # remove leading spaces
59
61
  if ($v =~ s/^"//) {
60
62
  # quoted value must end in an odd number of quotes
61
63
  while ($v !~ /("+)\s*$/ or not length($1) & 1) {
62
64
  if (@toks) {
63
- $v .= ',' . shift @toks;
65
+ $v .= $delim . shift @toks;
64
66
  } else {
65
67
  # read another line from the file
66
68
  $raf->ReadLine($buff) or last;
67
- @toks = split ',', $buff;
69
+ @toks = split /\Q$delim/, $buff;
68
70
  last unless @toks;
69
71
  $v .= shift @toks;
70
72
  }
@@ -330,9 +332,10 @@ Read CSV or JSON file into a database hash.
330
332
  2) Optional string used to represent an undefined (missing) tag value.
331
333
  (Used for deleting tags.)
332
334
 
333
- 3) [ReadJSON only] Optional character set for converting Unicode escape
334
- sequences in strings. Defaults to "UTF8". See the ExifTool Charset option
335
- for a list of valid settings.
335
+ 3) For ReadCSV this gives the delimiter for CSV entries, with a default of
336
+ ",". For ReadJSON this is the character set for converting Unicode escape
337
+ sequences in strings, with a default of "UTF8". See the ExifTool Charset
338
+ option for a list of valid character sets.
336
339
 
337
340
  =item Return Value:
338
341
 
@@ -14,16 +14,33 @@ use vars qw($VERSION);
14
14
  use Image::ExifTool qw(:DataAccess :Utils);
15
15
  use Image::ExifTool::Import;
16
16
 
17
- $VERSION = '1.01';
17
+ $VERSION = '1.02';
18
18
 
19
19
  sub ProcessTag($$$$%);
20
20
 
21
21
  %Image::ExifTool::JSON::Main = (
22
22
  GROUPS => { 0 => 'JSON', 1 => 'JSON', 2 => 'Other' },
23
+ VARS => { NO_ID => 1 },
23
24
  NOTES => q{
24
- No JSON tags have been pre-defined, but ExifTool will read any existing
25
- tags from basic JSON-formatted files.
25
+ Other than a few tags in the table below, JSON tags have not been
26
+ pre-defined. However, ExifTool will read any existing tags from basic
27
+ JSON-formatted files.
26
28
  },
29
+ # ON1 settings tags
30
+ ON1_SettingsData => {
31
+ RawConv => q{
32
+ require Image::ExifTool::XMP;
33
+ $val = Image::ExifTool::XMP::DecodeBase64($val);
34
+ },
35
+ SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
36
+ },
37
+ ON1_SettingsMetadataCreated => { Groups => { 2 => 'Time' } },
38
+ ON1_SettingsMetadataModified => { Groups => { 2 => 'Time' } },
39
+ ON1_SettingsMetadataName => { },
40
+ ON1_SettingsMetadataPluginID => { },
41
+ ON1_SettingsMetadataTimestamp => { Groups => { 2 => 'Time' } },
42
+ ON1_SettingsMetadataUsage => { },
43
+ ON1_SettingsMetadataVisibleToUser=>{ },
27
44
  );
28
45
 
29
46
  #------------------------------------------------------------------------------
@@ -33,12 +50,18 @@ sub FoundTag($$$$%)
33
50
  {
34
51
  my ($et, $tagTablePtr, $tag, $val, %flags) = @_;
35
52
 
53
+ # special case to reformat ON1 tag names
54
+ if ($tag =~ s/^settings\w{8}-\w{4}-\w{4}-\w{4}-\w{12}(Data|Metadata.+)$/ON1_Settings$1/) {
55
+ $et->OverrideFileType('ONP','application/on1') if $$et{FILE_TYPE} eq 'JSON';
56
+ }
57
+
36
58
  # avoid conflict with special table entries
37
59
  $tag .= '!' if $Image::ExifTool::specialTags{$tag};
38
60
 
39
61
  AddTagToTable($tagTablePtr, $tag, {
40
62
  Name => Image::ExifTool::MakeTagName($tag),
41
63
  %flags,
64
+ Temporary => 1,
42
65
  }) unless $$tagTablePtr{$tag};
43
66
 
44
67
  $et->HandleTag($tagTablePtr, $tag, $val);
@@ -94,7 +117,7 @@ sub ProcessJSON($$)
94
117
 
95
118
  # remove any old tag definitions in case they change flags
96
119
  foreach $key (TagTableKeys($tagTablePtr)) {
97
- delete $$tagTablePtr{$key};
120
+ delete $$tagTablePtr{$key} if $$tagTablePtr{$key}{Temporary};
98
121
  }
99
122
 
100
123
  # extract tags from JSON database
@@ -28,8 +28,8 @@ sub ProcessMPImageList($$$);
28
28
  from this segment is stored as a JPEG trailer. The MPF tags are not
29
29
  writable, however the MPF segment may be deleted as a group (with "MPF:All")
30
30
  but then the JPEG trailer should also be deleted (with "Trailer:All"). See
31
- L<http://www.cipa.jp/std/documents/e/DC-007_E.pdf> for the official
32
- specification.
31
+ L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
32
+ for the official specification.
33
33
  },
34
34
  0xb000 => 'MPFVersion',
35
35
  0xb001 => 'NumberOfImages',
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool qw(:DataAccess :Utils);
14
14
 
15
- $VERSION = '1.10';
15
+ $VERSION = '1.11';
16
16
 
17
17
  sub MDItemLocalTime($);
18
18
  sub ProcessATTR($$$);
@@ -651,6 +651,8 @@ sub ProcessATTR($$$)
651
651
  $off < 0 or $off > $dataLen and $et->Warn('Invalid ATTR offset'), last;
652
652
  my $tag = substr($$dataPt, $pos + 11, $n);
653
653
  $tag =~ s/\0+$//; # remove null terminator
654
+ # remove random ID after kMDLabel in tag ID
655
+ $tag =~ s/^com.apple.metadata:kMDLabel_.*/com.apple.metadata:kMDLabel/s;
654
656
  $off + $len > $dataLen and $et->Warn('Truncated ATTR value'), last;
655
657
  my $val = ReadXAttrValue($et, $tagTablePtr, $tag, substr($$dataPt, $off, $len));
656
658
  $et->HandleTag($tagTablePtr, $tag, $val,
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.09';
17
+ $VERSION = '1.10';
18
18
 
19
19
  my %noYes = ( 0 => 'No', 1 => 'Yes' );
20
20
 
@@ -221,6 +221,8 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
221
221
  },
222
222
  0x2e => {
223
223
  Name => 'TrackEntry',
224
+ # reset TrackType member at the start of each track
225
+ Condition => 'delete $$self{TrackType}; 1',
224
226
  SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Main' },
225
227
  },
226
228
  0x57 => { Name => 'TrackNumber', Format => 'unsigned' },
@@ -49,7 +49,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
49
49
  use Image::ExifTool qw(:DataAccess :Utils);
50
50
  use Image::ExifTool::Exif;
51
51
 
52
- $VERSION = '2.86';
52
+ $VERSION = '2.87';
53
53
 
54
54
  # Full list of product codes for Sony-compatible Minolta lenses
55
55
  # (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
@@ -603,6 +603,7 @@ $VERSION = '2.86';
603
603
  16 => 'Autumn Leaves', #JR (NC)
604
604
  17 => 'Sepia', #JR
605
605
  18 => 'FL', #JR (7SM3)
606
+ 19 => 'Vivid 2', #JR (7SM3)
606
607
  20 => 'IN', #JR (7SM3)
607
608
  21 => 'SH', #JR (7SM3)
608
609
  100 => 'Neutral', #JD
@@ -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.87';
65
+ $VERSION = '3.90';
66
66
 
67
67
  sub LensIDConv($$$);
68
68
  sub ProcessNikonAVI($$$);
@@ -1401,7 +1401,9 @@ my %binaryDataAttrs = (
1401
1401
  16 => 'Electronic',
1402
1402
  # 33 => ? seen for 1J2
1403
1403
  48 => 'Electronic Front Curtain',
1404
- # 81 => ? seen for Z50
1404
+ 64 => 'Electronic (Movie)', #JanSkoda (Z6II)
1405
+ 80 => 'Auto (Mechanical)', #JanSkoda (Z6II)
1406
+ 81 => 'Auto (Electronic Front Curtain)', #JanSkoda (Z6II)
1405
1407
  },
1406
1408
  },
1407
1409
  0x0035 => { #32
@@ -2083,7 +2085,7 @@ my %binaryDataAttrs = (
2083
2085
  },
2084
2086
  },
2085
2087
  {
2086
- Condition => '$$valPt =~ /^0800/', # Z6/Z7
2088
+ Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
2087
2089
  Name => 'LensData0800',
2088
2090
  SubDirectory => {
2089
2091
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -4663,6 +4665,7 @@ my %nikonFocalConversions = (
4663
4665
  18 => 'Nikkor Z 24-200mm f/4-6.3 VR', #IB
4664
4666
  21 => 'Nikkor Z 50mm f/1.2 S', #IB
4665
4667
  22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
4668
+ 23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4666
4669
  },
4667
4670
  },
4668
4671
  0x36 => {
@@ -8998,7 +9001,7 @@ my %nikonFocalConversions = (
8998
9001
  },
8999
9002
  },
9000
9003
  {
9001
- Condition => '$$valPt =~ /^0800/', # Z6/Z7
9004
+ Condition => '$$valPt =~ /^080[01]/', # Z6/Z7
9002
9005
  Name => 'LensData0800',
9003
9006
  SubDirectory => {
9004
9007
  TagTable => 'Image::ExifTool::Nikon::LensData0800',
@@ -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.69';
43
+ $VERSION = '2.70';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -109,6 +109,7 @@ my %olympusLensTypes = (
109
109
  '0 32 00' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH
110
110
  '0 32 10' => 'Olympus M.Zuiko Digital ED 12-200mm F3.5-6.3', #IB
111
111
  '0 33 00' => 'Olympus Zuiko Digital 25mm F2.8', #PH
112
+ '0 33 10' => 'Olympus M.Zuiko Digital 150-400mm F4.5 TC1.25x IS Pro', #IB
112
113
  '0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
113
114
  '0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
114
115
  '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
@@ -137,6 +138,7 @@ my %olympusLensTypes = (
137
138
  '1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
138
139
  '1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11
139
140
  '1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11
141
+ '1 18 60' => 'Test',
140
142
  # Panasonic/Leica lenses
141
143
  '2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
142
144
  '2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16