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.
- checksums.yaml +4 -4
- data/bin/Changes +85 -2
- data/bin/MANIFEST +2 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +43 -43
- data/bin/exiftool +176 -96
- data/bin/lib/Image/ExifTool.pm +15 -9
- data/bin/lib/Image/ExifTool.pod +62 -52
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -4
- data/bin/lib/Image/ExifTool/Canon.pm +181 -15
- data/bin/lib/Image/ExifTool/DarwinCore.pm +7 -5
- data/bin/lib/Image/ExifTool/GIF.pm +2 -2
- data/bin/lib/Image/ExifTool/Geotag.pm +29 -10
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -9
- data/bin/lib/Image/ExifTool/Import.pm +14 -11
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/MPF.pm +2 -2
- data/bin/lib/Image/ExifTool/MacOS.pm +3 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +2 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +7 -4
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
- data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +52 -22
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +50 -37
- data/bin/lib/Image/ExifTool/README +5 -2
- data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
- data/bin/lib/Image/ExifTool/Sony.pm +16 -17
- data/bin/lib/Image/ExifTool/Stim.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5756 -5710
- data/bin/lib/Image/ExifTool/TagNames.pod +210 -19
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -6
- data/bin/lib/Image/ExifTool/Writer.pl +20 -14
- data/bin/lib/Image/ExifTool/XMP.pm +62 -17
- data/bin/lib/Image/ExifTool/XMP2.pl +5 -0
- data/bin/perl-Image-ExifTool.spec +42 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- 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.
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
return
|
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.
|
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 => '
|
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.
|
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 (/^
|
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
|
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,
|
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.
|
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.
|
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,
|
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
|
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 .=
|
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
|
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)
|
334
|
-
|
335
|
-
|
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.
|
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
|
-
|
25
|
-
tags from basic
|
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>
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
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 =~ /^
|
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 =~ /^
|
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.
|
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
|