exiftool_vendored 12.99.0 → 13.02.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +56 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/arg_files/exif2xmp.args +4 -0
- data/bin/arg_files/xmp2exif.args +4 -0
- data/bin/exiftool +82 -40
- data/bin/lib/Image/ExifTool/CBOR.pm +4 -1
- data/bin/lib/Image/ExifTool/Canon.pm +35 -26
- data/bin/lib/Image/ExifTool/Exif.pm +8 -9
- data/bin/lib/Image/ExifTool/FlashPix.pm +5 -9
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +6 -5
- data/bin/lib/Image/ExifTool/GoPro.pm +2 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -2
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MacOS.pm +2 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +5 -2
- data/bin/lib/Image/ExifTool/PDF.pm +7 -3
- data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +69 -7
- data/bin/lib/Image/ExifTool/TagLookup.pm +11 -8
- data/bin/lib/Image/ExifTool/TagNames.pod +33 -18
- data/bin/lib/Image/ExifTool/Text.pm +3 -2
- data/bin/lib/Image/ExifTool/Validate.pm +2 -2
- data/bin/lib/Image/ExifTool/Writer.pl +26 -55
- data/bin/lib/Image/ExifTool/XMP.pm +13 -3
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -2
- data/bin/lib/Image/ExifTool.pm +167 -76
- data/bin/lib/Image/ExifTool.pod +42 -28
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -22,7 +22,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
use Image::ExifTool::Exif;
|
23
23
|
use Image::ExifTool::ASF; # for GetGUID()
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.49';
|
26
26
|
|
27
27
|
sub ProcessFPX($$);
|
28
28
|
sub ProcessFPXR($$$);
|
@@ -1717,16 +1717,14 @@ sub ProcessDocumentTable($)
|
|
1717
1717
|
my $offsets = $$value{$key};
|
1718
1718
|
last unless defined $offsets;
|
1719
1719
|
my $doc;
|
1720
|
-
$doc = $$extra{$key}{G3}
|
1721
|
-
$doc = '' unless $doc;
|
1720
|
+
$doc = $$extra{$key}{G3} || '';
|
1722
1721
|
# get DocFlags for this sub-document
|
1723
1722
|
my ($docFlags, $docTable);
|
1724
1723
|
for ($j=0; ; ++$j) {
|
1725
1724
|
my $key = 'DocFlags' . ($j ? " ($j)" : '');
|
1726
1725
|
last unless defined $$value{$key};
|
1727
1726
|
my $tmp;
|
1728
|
-
$tmp = $$extra{$key}{G3}
|
1729
|
-
$tmp = '' unless $tmp;
|
1727
|
+
$tmp = $$extra{$key}{G3} || '';
|
1730
1728
|
if ($tmp eq $doc) {
|
1731
1729
|
$docFlags = $$value{$key};
|
1732
1730
|
last;
|
@@ -1739,8 +1737,7 @@ sub ProcessDocumentTable($)
|
|
1739
1737
|
my $key = $tag . ($j ? " ($j)" : '');
|
1740
1738
|
last unless defined $$value{$key};
|
1741
1739
|
my $tmp;
|
1742
|
-
$tmp = $$extra{$key}{G3}
|
1743
|
-
$tmp = '' unless $tmp;
|
1740
|
+
$tmp = $$extra{$key}{G3} || '';
|
1744
1741
|
if ($tmp eq $doc) {
|
1745
1742
|
$docTable = \$$value{$key};
|
1746
1743
|
last;
|
@@ -2505,8 +2502,7 @@ sub ProcessFPX($$)
|
|
2505
2502
|
for ($copy=1; ;++$copy) {
|
2506
2503
|
my $key = "$tag ($copy)";
|
2507
2504
|
last unless defined $$et{VALUE}{$key};
|
2508
|
-
|
2509
|
-
next if $extra and $$extra{G3}; # not Main if family 3 group is set
|
2505
|
+
next if $$et{TAG_EXTRA}{$key}{G3}; # not Main if family 3 group is set
|
2510
2506
|
foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') {
|
2511
2507
|
my $pHash = $$et{$member};
|
2512
2508
|
my $t = $$pHash{$tag};
|
Binary file
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:Public);
|
32
32
|
use Image::ExifTool::GPS;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.80';
|
35
35
|
|
36
36
|
sub JITTER() { return 2 } # maximum time jitter
|
37
37
|
|
@@ -562,8 +562,8 @@ DoneFix: $isDate = 1;
|
|
562
562
|
next;
|
563
563
|
} elsif ($format eq 'JSON') {
|
564
564
|
# Google Takeout JSON format
|
565
|
-
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
|
566
|
-
if ($1 eq 'timestamp') {
|
565
|
+
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime|time)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
|
566
|
+
if ($1 eq 'timestamp' or $1 eq 'time') {
|
567
567
|
$time = GetTime($2);
|
568
568
|
goto DoneFix if $time and $$fix{lat} and $$fix{lon};
|
569
569
|
} elsif ($1 eq 'startTime') { # (new format)
|
@@ -1127,8 +1127,9 @@ sub SetGeoValues($$;$)
|
|
1127
1127
|
$iExt = $i1;
|
1128
1128
|
}
|
1129
1129
|
if (abs($time - $tn) > $geoMaxExtSecs) {
|
1130
|
-
$err or $err = 'Time is too far from nearest GPS fix'
|
1131
|
-
$et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn),
|
1130
|
+
$err or $err = 'Time is too far from nearest GPS fix';
|
1131
|
+
$et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), ' (',
|
1132
|
+
int(abs $time-$tn), " sec away)\n") if $verbose > 2;
|
1132
1133
|
$fix = { } if $$geotag{DateTimeOnly};
|
1133
1134
|
} else {
|
1134
1135
|
$fix = $$points{$tn};
|
@@ -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.09';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -604,7 +604,7 @@ sub ScaleValues($$)
|
|
604
604
|
sub AddUnits($$$)
|
605
605
|
{
|
606
606
|
my ($et, $val, $tag) = @_;
|
607
|
-
if ($et and $$et{TAG_EXTRA}{$tag}
|
607
|
+
if ($et and $$et{TAG_EXTRA}{$tag}{Units}) {
|
608
608
|
my $u = $$et{TAG_EXTRA}{$tag}{Units};
|
609
609
|
$u = [ $u ] unless ref $u eq 'ARRAY';
|
610
610
|
my @a = split ' ', $val;
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.42';
|
20
20
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
22
22
|
sub ProcessJUMD($$$);
|
@@ -1338,7 +1338,7 @@ sub ProcessJpeg2000Box($$$)
|
|
1338
1338
|
if (defined $val) {
|
1339
1339
|
my $key = $et->FoundTag($tagInfo, $val);
|
1340
1340
|
# save Rational value
|
1341
|
-
$$et{
|
1341
|
+
$$et{TAG_EXTRA}{$key}{Rational} = $rational if defined $rational and defined $key;
|
1342
1342
|
}
|
1343
1343
|
} elsif ($outfile) {
|
1344
1344
|
my $boxhdr = pack('N', $boxLen + 8) . $boxID;
|
@@ -650,7 +650,7 @@ sub ProcessLNK($$)
|
|
650
650
|
my $mask = 0x04 << $i;
|
651
651
|
next unless $flags & $mask;
|
652
652
|
$raf->Read($buff, 2) or return 1;
|
653
|
-
$len = unpack('v', $buff);
|
653
|
+
$len = unpack('v', $buff) or next;
|
654
654
|
$len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set
|
655
655
|
$raf->Read($buff, $len) or return 1;
|
656
656
|
my $val;
|
@@ -32,7 +32,7 @@ use strict;
|
|
32
32
|
use vars qw($VERSION);
|
33
33
|
use Image::ExifTool qw(:DataAccess :Utils);
|
34
34
|
|
35
|
-
$VERSION = '1.
|
35
|
+
$VERSION = '1.26';
|
36
36
|
|
37
37
|
# program map table "stream_type" lookup (ref 6/1/9)
|
38
38
|
my %streamType = (
|
@@ -82,7 +82,7 @@ my %streamType = (
|
|
82
82
|
0x86 => 'DTS-HD Audio',
|
83
83
|
0x87 => 'E-AC-3 Audio',
|
84
84
|
0x8a => 'DTS Audio',
|
85
|
-
0x90 => '
|
85
|
+
0x90 => 'Presentation Graphic Stream (subtitle)', #https://en.wikipedia.org/wiki/Program-specific_information
|
86
86
|
0x91 => 'A52b/AC-3 Audio',
|
87
87
|
0x92 => 'DVD_SPU vls Subtitle',
|
88
88
|
0x94 => 'SDDS Audio',
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::Exif;
|
15
15
|
use Image::ExifTool::GPS;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.55';
|
18
18
|
|
19
19
|
sub ProcessMIE($$);
|
20
20
|
sub ProcessMIEGroup($$$);
|
@@ -1596,9 +1596,10 @@ sub ProcessMIEGroup($$$)
|
|
1596
1596
|
} else {
|
1597
1597
|
# process MIE data format types
|
1598
1598
|
if ($tagInfo) {
|
1599
|
-
my $rational;
|
1599
|
+
my ($rational, $binVal);
|
1600
1600
|
# extract tag value
|
1601
1601
|
my $val = ReadMIEValue(\$value, 0, $formatStr, undef, $valLen, \$rational);
|
1602
|
+
$binVal = substr($value, 0, $valLen) if $$et{OPTIONS}{SaveBin};
|
1602
1603
|
unless (defined $val) {
|
1603
1604
|
$et->Warn("Error reading $tag value");
|
1604
1605
|
$val = '<err>';
|
@@ -1661,7 +1662,12 @@ sub ProcessMIEGroup($$$)
|
|
1661
1662
|
$val .= "($units)" if defined $units;
|
1662
1663
|
}
|
1663
1664
|
my $key = $et->FoundTag($tagInfo, $val);
|
1664
|
-
|
1665
|
+
if (defined $key) {
|
1666
|
+
my $ex = $$et{TAG_EXTRA}{$key};
|
1667
|
+
$$ex{Rational} = $rational if defined $rational;
|
1668
|
+
$$ex{BinVal} = $binVal if defined $binVal;
|
1669
|
+
$$ex{G6} = $formatStr if $$et{OPTIONS}{SaveFormat};
|
1670
|
+
}
|
1665
1671
|
}
|
1666
1672
|
} else {
|
1667
1673
|
# skip over unknown information or free bytes
|
@@ -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.14';
|
16
16
|
|
17
17
|
sub MDItemLocalTime($);
|
18
18
|
sub ProcessATTR($$$);
|
@@ -394,6 +394,7 @@ sub SetMacOSTags($$$)
|
|
394
394
|
if ($val =~ /[-+Z]/) {
|
395
395
|
my $time = Image::ExifTool::GetUnixTime($val, 1);
|
396
396
|
$val = Image::ExifTool::ConvertUnixTime($time, 1) if $time;
|
397
|
+
$val =~ s/[-+].*//; # remove time zone
|
397
398
|
}
|
398
399
|
$val =~ s{(\d{4}):(\d{2}):(\d{2})}{$2/$3/$1}; # reformat for setfile
|
399
400
|
$cmd = "/usr/bin/setfile -d '${val}' '${f}'";
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.39';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -13609,7 +13609,10 @@ sub ProcessNikonMOV($$$)
|
|
13609
13609
|
Size => $size,
|
13610
13610
|
Base => $$dirInfo{Base},
|
13611
13611
|
);
|
13612
|
-
|
13612
|
+
if ($key) {
|
13613
|
+
$$et{TAG_EXTRA}{$key}{Rational} = $rational if $rational;
|
13614
|
+
$$et{TAG_EXTRA}{$key}{BinVal} = substr($$dataPt, $pos, $size) if $$et{OPTIONS}{SaveBin};
|
13615
|
+
}
|
13613
13616
|
} elsif (exists $needTags{$tag}) {
|
13614
13617
|
$needTags{$tag} = ReadValue($dataPt, $pos, $fmtStr, $count, $size);
|
13615
13618
|
$$et{NikonSerialKey} = SerialKey($et, $needTags{0x110a431});
|
@@ -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.
|
24
|
+
$VERSION = '1.59';
|
25
25
|
|
26
26
|
sub FetchObject($$$$);
|
27
27
|
sub ExtractObject($$;$$);
|
@@ -1595,9 +1595,13 @@ sub DecryptInit($$$)
|
|
1595
1595
|
$password = $et->Options('Password');
|
1596
1596
|
return 'Document is password protected (use Password option)' unless defined $password;
|
1597
1597
|
# make sure there is no UTF-8 flag on the password
|
1598
|
-
if ($] >= 5.006 and (
|
1598
|
+
if ($] >= 5.006 and ($$et{OPTIONS}{EncodeHangs} or
|
1599
|
+
eval { require Encode; Encode::is_utf8($password) } or $@))
|
1600
|
+
{
|
1601
|
+
local $SIG{'__WARN__'} = sub { };
|
1599
1602
|
# repack by hand if Encode isn't available
|
1600
|
-
$password = $@ ? pack('C*',unpack($] < 5.010000 ?
|
1603
|
+
$password = ($$et{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
|
1604
|
+
'U0C*' : 'C0C*', $password)) : Encode::encode('utf8', $password);
|
1601
1605
|
}
|
1602
1606
|
} else {
|
1603
1607
|
return 'Incorrect password';
|
@@ -15,7 +15,7 @@ use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
use Image::ExifTool::Exif;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.11';
|
19
19
|
|
20
20
|
sub WritePhaseOne($$$);
|
21
21
|
sub ProcessPhaseOne($$$);
|
@@ -71,6 +71,7 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
|
|
71
71
|
# >2 = compressed
|
72
72
|
# 5 = non-linear
|
73
73
|
PrintConv => { #PH
|
74
|
+
0 => 'Uncompressed', #https://github.com/darktable-org/darktable/issues/7308
|
74
75
|
1 => 'RAW 1', #? (encrypted)
|
75
76
|
2 => 'RAW 2', #? (encrypted)
|
76
77
|
3 => 'IIQ L', # (now "L14", ref IB)
|
@@ -591,8 +591,8 @@ my %insvLimit = (
|
|
591
591
|
GROUPS => { 2 => 'Location' },
|
592
592
|
FIRST_ENTRY => 0,
|
593
593
|
NOTES => q{
|
594
|
-
Tags extracted from the tx3g sbtl timed metadata of Yuneec drones,
|
595
|
-
subtitle text in some other videos.
|
594
|
+
Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
|
595
|
+
and subtitle text in some other videos.
|
596
596
|
},
|
597
597
|
Lat => {
|
598
598
|
Name => 'GPSLatitude',
|
@@ -619,6 +619,32 @@ my %insvLimit = (
|
|
619
619
|
PrintConv => '$self->ConvertDateTime($val)',
|
620
620
|
},
|
621
621
|
Text => { Groups => { 2 => 'Other' } },
|
622
|
+
# the following tags are extracted from Autel Evo II drone videos
|
623
|
+
GPSDateTime => {
|
624
|
+
Groups => { 2 => 'Time' },
|
625
|
+
Description => 'GPS Date/Time',
|
626
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
627
|
+
},
|
628
|
+
HomeLat => {
|
629
|
+
Name => 'GPSHomeLatitude',
|
630
|
+
RawConv => '$$self{FoundGPSLatitude} = 1; $val',
|
631
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
632
|
+
},
|
633
|
+
HomeLon => {
|
634
|
+
Name => 'GPSHomeLongitude',
|
635
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
636
|
+
},
|
637
|
+
ISO => { },
|
638
|
+
SHUTTER => {
|
639
|
+
Name => 'ExposureTime',
|
640
|
+
ValueConv => '1 / $val',
|
641
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
642
|
+
},
|
643
|
+
'F-NUM' => {
|
644
|
+
Name => 'FNumber',
|
645
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
646
|
+
},
|
647
|
+
EV => 'ExposureCompensation',
|
622
648
|
);
|
623
649
|
|
624
650
|
%Image::ExifTool::QuickTime::INSV_MakerNotes = (
|
@@ -2361,7 +2387,7 @@ sub ParseTag($$$)
|
|
2361
2387
|
}
|
2362
2388
|
|
2363
2389
|
#------------------------------------------------------------------------------
|
2364
|
-
# Process Yuneec 'tx3g' sbtl metadata (ref PH)
|
2390
|
+
# Process Yuneec 'tx3g' and Autel sbtl metadata (ref PH)
|
2365
2391
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
2366
2392
|
# Returns: 1 on success
|
2367
2393
|
sub Process_tx3g($$$)
|
@@ -2369,13 +2395,49 @@ sub Process_tx3g($$$)
|
|
2369
2395
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
2370
2396
|
my $dataPt = $$dirInfo{DataPt};
|
2371
2397
|
return 0 if length $$dataPt < 2;
|
2372
|
-
pos($$dataPt) = 2; # skip 2-byte length word
|
2373
2398
|
$et->VerboseDir('tx3g', undef, length($$dataPt)-2);
|
2374
|
-
$
|
2375
|
-
|
2399
|
+
my $text = substr($$dataPt, 2); # remove 2-byte length word
|
2400
|
+
$et->HandleTag($tagTablePtr, 'Text', $text);
|
2401
|
+
if ($text =~ /^HOME\(/) {
|
2402
|
+
# --- sample text from Autel Evo II drone ---
|
2403
|
+
# HOME(W: 109.318642, N: 40.769371) 2023-09-12 10:28:07
|
2404
|
+
# GPS(W: 109.339287, N: 40.768574, 2371.76m)
|
2405
|
+
# HDR ISO:100 SHUTTER:1000 EV:-0.7 F-NUM:1.8
|
2406
|
+
# F.PRY (1.0\xc2\xb0, -3.7\xc2\xb0, -59.0\xc2\xb0), G.PRY (-51.1\xc2\xb0, 0.0\xc2\xb0, -58.9\xc2\xb0)
|
2407
|
+
my $line;
|
2408
|
+
foreach $line (split /\x0a/, $text) {
|
2409
|
+
if ($line =~ /^HOME\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+)\)\s*(.*)/) {
|
2410
|
+
my ($lon, $lat, $time) = ($2, $4, $5);
|
2411
|
+
$lon = -$lon if $1 eq 'W';
|
2412
|
+
$lat = -$lat if $3 eq 'S';
|
2413
|
+
$time =~ tr/-/:/; # (likely local time zone, but not confirmed)
|
2414
|
+
$et->HandleTag($tagTablePtr, GPSDateTime => $time);
|
2415
|
+
$et->HandleTag($tagTablePtr, HomeLat => $lat);
|
2416
|
+
$et->HandleTag($tagTablePtr, HomeLon => $lon);
|
2417
|
+
} elsif ($line =~ /^GPS\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+),\s*(.*)m/) {
|
2418
|
+
my ($lon, $lat, $alt) = ($2, $4, $5);
|
2419
|
+
$lon = -$lon if $1 eq 'W';
|
2420
|
+
$lat = -$lat if $3 eq 'S';
|
2421
|
+
$et->HandleTag($tagTablePtr, Lat => $lat);
|
2422
|
+
$et->HandleTag($tagTablePtr, Lon => $lon);
|
2423
|
+
$et->HandleTag($tagTablePtr, Alt => $alt);
|
2424
|
+
} elsif ($line =~ /^F\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
|
2425
|
+
$et->HandleTag($tagTablePtr, Yaw => $1);
|
2426
|
+
$et->HandleTag($tagTablePtr, Pitch => $2);
|
2427
|
+
$et->HandleTag($tagTablePtr, Roll => $3);
|
2428
|
+
if ($line =~ /G\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
|
2429
|
+
$et->HandleTag($tagTablePtr, GimYaw => $1);
|
2430
|
+
$et->HandleTag($tagTablePtr, GimPitch => $2);
|
2431
|
+
$et->HandleTag($tagTablePtr, GimRoll => $3);
|
2432
|
+
}
|
2433
|
+
} else {
|
2434
|
+
$et->HandleTag($tagTablePtr, $1, $2) while $line =~ /([-\w]+):([^:]*[^:\s])(\s|$)/sg;
|
2435
|
+
}
|
2436
|
+
}
|
2437
|
+
} elsif ($text =~ /^\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
|
2376
2438
|
$et->HandleTag($tagTablePtr, 'DateTime', "$1:$2:$3 $4$5$6:$7");
|
2377
2439
|
} else {
|
2378
|
-
$et->HandleTag($tagTablePtr, $1, $2) while
|
2440
|
+
$et->HandleTag($tagTablePtr, $1, $2) while $text =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
|
2379
2441
|
}
|
2380
2442
|
return 1;
|
2381
2443
|
}
|
@@ -1349,7 +1349,7 @@ my %tagLookup = (
|
|
1349
1349
|
'camerae-mountversion' => { 490 => 0xb },
|
1350
1350
|
'cameraelevationangle' => { 124 => 0x9405, 524 => 'CameraElevationAngle' },
|
1351
1351
|
'camerafilename' => { 507 => 'CameraFilename' },
|
1352
|
-
'camerafirmware' => { 124 => 0xa439 },
|
1352
|
+
'camerafirmware' => { 124 => 0xa439, 524 => 'CameraFirmware' },
|
1353
1353
|
'cameraid' => { 333 => 0x209, 413 => 'cmid', 429 => 0x209 },
|
1354
1354
|
'cameraidentifier' => { 407 => 'camera.identifier' },
|
1355
1355
|
'cameraimage' => { 495 => [\'Cameras','CamerasCameraImage'] },
|
@@ -3728,8 +3728,8 @@ my %tagLookup = (
|
|
3728
3728
|
'imagedustoff' => { 300 => 0xfe443a45 },
|
3729
3729
|
'imageeditcount' => { 388 => 0x41 },
|
3730
3730
|
'imageediting' => { 388 => 0x32 },
|
3731
|
-
'imageeditingsoftware' => { 124 => 0xa43b },
|
3732
|
-
'imageeditor' => { 124 => 0xa438 },
|
3731
|
+
'imageeditingsoftware' => { 124 => 0xa43b, 524 => 'ImageEditingSoftware' },
|
3732
|
+
'imageeditor' => { 124 => 0xa438, 524 => 'ImageEditor' },
|
3733
3733
|
'imageeffects' => { 420 => 0x1010 },
|
3734
3734
|
'imagefileconstraints' => { 338 => 'ImageFileConstraints' },
|
3735
3735
|
'imagefileformatasdelivered' => { 338 => 'ImageFileFormatAsDelivered' },
|
@@ -3805,9 +3805,10 @@ my %tagLookup = (
|
|
3805
3805
|
'imagesuppliername' => { 338 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
|
3806
3806
|
'imagetemperaturemax' => { 126 => 0x1 },
|
3807
3807
|
'imagetemperaturemin' => { 126 => 0x2 },
|
3808
|
+
'imagetitle' => { 124 => 0xa436, 524 => 'ImageTitle' },
|
3808
3809
|
'imagetone' => { 388 => 0x4f },
|
3809
3810
|
'imagetype' => { 136 => 0x82, 338 => 'ImageType' },
|
3810
|
-
'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID' },
|
3811
|
+
'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID', 524 => 'ImageUniqueID' },
|
3811
3812
|
'imagewidth' => { 124 => 0x100, 193 => 0xe, 397 => 0x10c, 502 => 'ImageWidth', 542 => 'ImageWidth' },
|
3812
3813
|
'inclinationangle' => { 491 => 0x900f },
|
3813
3814
|
'inclinationcorrection' => { 491 => 0x900e },
|
@@ -4796,7 +4797,7 @@ my %tagLookup = (
|
|
4796
4797
|
'metadataauthorityidentifier' => { 531 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
|
4797
4798
|
'metadataauthorityname' => { 531 => [\'metadataAuthority','metadataAuthorityName'] },
|
4798
4799
|
'metadatadate' => { 544 => 'MetadataDate' },
|
4799
|
-
'metadataeditingsoftware' => { 124 => 0xa43c },
|
4800
|
+
'metadataeditingsoftware' => { 124 => 0xa43c, 524 => 'MetadataEditingSoftware' },
|
4800
4801
|
'metadatalastedited' => { 531 => 'metadataLastEdited' },
|
4801
4802
|
'metadatalasteditor' => { 531 => 'metadataLastEditor' },
|
4802
4803
|
'metadatalasteditoridentifier' => { 531 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
|
@@ -5599,7 +5600,7 @@ my %tagLookup = (
|
|
5599
5600
|
'photoeffectsgreen' => { 302 => 0x6 },
|
5600
5601
|
'photoeffectsred' => { 302 => 0x4 },
|
5601
5602
|
'photoeffectstype' => { 302 => 0x0 },
|
5602
|
-
'photographer' => { 124 => 0xa437 },
|
5603
|
+
'photographer' => { 124 => 0xa437, 524 => 'Photographer' },
|
5603
5604
|
'photographicsensitivity' => { 524 => 'PhotographicSensitivity' },
|
5604
5605
|
'photoidentifier' => { 1 => 0x2b },
|
5605
5606
|
'photoinfoplayback' => { 307 => '17.6', 316 => '33.6' },
|
@@ -5946,7 +5947,7 @@ my %tagLookup = (
|
|
5946
5947
|
'rawdevcolorspace' => { 334 => 0x108, 335 => 0x109 },
|
5947
5948
|
'rawdevcontrastvalue' => { 334 => 0x106, 335 => 0x105 },
|
5948
5949
|
'rawdeveditstatus' => { 334 => 0x10b },
|
5949
|
-
'rawdevelopingsoftware' => { 124 => 0xa43a },
|
5950
|
+
'rawdevelopingsoftware' => { 124 => 0xa43a, 524 => 'RAWDevelopingSoftware' },
|
5950
5951
|
'rawdevelopmentprocess' => { 388 => 0x62 },
|
5951
5952
|
'rawdevengine' => { 334 => 0x109, 335 => 0x10b },
|
5952
5953
|
'rawdevexposurebiasvalue' => { 334 => 0x100, 335 => 0x100 },
|
@@ -6940,7 +6941,7 @@ my %tagLookup = (
|
|
6940
6941
|
'timezoneinfo' => { 105 => 0x2 },
|
6941
6942
|
'timezoneoffset' => { 124 => 0x882a },
|
6942
6943
|
'tint' => { 407 => 'player.movie.visual.tint', 517 => 'Tint', 519 => 'Tint' },
|
6943
|
-
'title' => {
|
6944
|
+
'title' => { 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
|
6944
6945
|
'togglestyleamount' => { 517 => 'ToggleStyleAmount', 519 => 'ToggleStyleAmount' },
|
6945
6946
|
'togglestyledigest' => { 517 => 'ToggleStyleDigest', 519 => 'ToggleStyleDigest' },
|
6946
6947
|
'tonecomp' => { 241 => 0x81 },
|
@@ -9742,6 +9743,8 @@ my %tagExists = (
|
|
9742
9743
|
'gpsframingaltitude' => 1,
|
9743
9744
|
'gpsframinglatitude' => 1,
|
9744
9745
|
'gpsframinglongitude' => 1,
|
9746
|
+
'gpshomelatitude' => 1,
|
9747
|
+
'gpshomelongitude' => 1,
|
9745
9748
|
'gpshorizontalaccuracy' => 1,
|
9746
9749
|
'gpsinfo' => 1,
|
9747
9750
|
'gpslatitude2' => 1,
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 28165 tags, with 17491 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -871,7 +871,7 @@ for the official EXIF 2.32 specification.
|
|
871
871
|
0xa433 LensMake ExifIFD string
|
872
872
|
0xa434 LensModel ExifIFD string
|
873
873
|
0xa435 LensSerialNumber ExifIFD string
|
874
|
-
0xa436
|
874
|
+
0xa436 ImageTitle ExifIFD string
|
875
875
|
0xa437 Photographer ExifIFD string
|
876
876
|
0xa438 ImageEditor ExifIFD string
|
877
877
|
0xa439 CameraFirmware ExifIFD string
|
@@ -4605,7 +4605,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
|
|
4605
4605
|
GPSTrack rational
|
4606
4606
|
GPSTrackRef string
|
4607
4607
|
GPSVersionID string
|
4608
|
-
ImageUniqueID string
|
4608
|
+
ImageUniqueID string/
|
4609
4609
|
ISO integer+
|
4610
4610
|
LightSource string
|
4611
4611
|
MakerNote string
|
@@ -4686,6 +4686,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4686
4686
|
Acceleration rational
|
4687
4687
|
SerialNumber string
|
4688
4688
|
CameraElevationAngle rational
|
4689
|
+
CameraFirmware string
|
4689
4690
|
OwnerName string
|
4690
4691
|
CompositeImage integer
|
4691
4692
|
CompositeImageCount integer+
|
@@ -4702,6 +4703,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4702
4703
|
CompImageValues rational_+
|
4703
4704
|
Gamma rational
|
4704
4705
|
Humidity rational
|
4706
|
+
ImageEditingSoftware string
|
4707
|
+
ImageEditor string
|
4708
|
+
ImageTitle string
|
4709
|
+
ImageUniqueID string
|
4705
4710
|
InteropIndex string
|
4706
4711
|
ISOSpeed integer
|
4707
4712
|
ISOSpeedLatitudeyyy integer
|
@@ -4710,8 +4715,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4710
4715
|
LensModel string
|
4711
4716
|
LensSerialNumber string
|
4712
4717
|
LensInfo rational+
|
4718
|
+
MetadataEditingSoftware string
|
4719
|
+
Photographer string
|
4713
4720
|
PhotographicSensitivity integer
|
4714
4721
|
Pressure rational
|
4722
|
+
RAWDevelopingSoftware string
|
4715
4723
|
RecommendedExposureIndex integer
|
4716
4724
|
SensitivityType integer
|
4717
4725
|
StandardOutputSensitivity integer
|
@@ -30187,22 +30195,29 @@ changed via the config file.
|
|
30187
30195
|
|
30188
30196
|
=head3 QuickTime tx3g Tags
|
30189
30197
|
|
30190
|
-
Tags extracted from the tx3g sbtl timed metadata of Yuneec drones,
|
30191
|
-
subtitle text in some other videos.
|
30198
|
+
Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
|
30199
|
+
and subtitle text in some other videos.
|
30192
30200
|
|
30193
|
-
Tag ID
|
30194
|
-
------
|
30195
|
-
'Alt'
|
30196
|
-
'DateTime'
|
30197
|
-
'
|
30198
|
-
'
|
30199
|
-
'
|
30200
|
-
'
|
30201
|
-
'
|
30202
|
-
'
|
30203
|
-
'
|
30204
|
-
'
|
30205
|
-
'
|
30201
|
+
Tag ID Tag Name Writable
|
30202
|
+
------ -------- --------
|
30203
|
+
'Alt' GPSAltitude no
|
30204
|
+
'DateTime' DateTime no
|
30205
|
+
'EV' ExposureCompensation no
|
30206
|
+
'F-NUM' FNumber no
|
30207
|
+
'GPSDateTime' GPSDateTime no
|
30208
|
+
'GimPitch' GimbalPitch no
|
30209
|
+
'GimRoll' GimbalRoll no
|
30210
|
+
'GimYaw' GimbalYaw no
|
30211
|
+
'HomeLat' GPSHomeLatitude no
|
30212
|
+
'HomeLon' GPSHomeLongitude no
|
30213
|
+
'ISO' ISO no
|
30214
|
+
'Lat' GPSLatitude no
|
30215
|
+
'Lon' GPSLongitude no
|
30216
|
+
'Pitch' Pitch no
|
30217
|
+
'Roll' Roll no
|
30218
|
+
'SHUTTER' ExposureTime no
|
30219
|
+
'Text' Text no
|
30220
|
+
'Yaw' Yaw no
|
30206
30221
|
|
30207
30222
|
=head3 QuickTime HTCInfo Tags
|
30208
30223
|
|
@@ -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.
|
18
|
+
$VERSION = '1.05';
|
19
19
|
|
20
20
|
# Text tags
|
21
21
|
%Image::ExifTool::Text::Main = (
|
@@ -191,7 +191,8 @@ sub ProcessTXT($$)
|
|
191
191
|
$enc = 'unknown-8bit';
|
192
192
|
}
|
193
193
|
}
|
194
|
-
|
194
|
+
# ($$et{VALUE}{MIMEEncoding} may be undef if it was ignored)
|
195
|
+
if (defined $$et{VALUE}{MIMEEncoding} and $$et{VALUE}{MIMEEncoding} ne $enc) {
|
195
196
|
$$et{VALUE}{MIMEEncoding} = $enc;
|
196
197
|
$et->VPrint(0," MIMEEncoding [override] = $enc\n");
|
197
198
|
}
|
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
|
|
17
17
|
use strict;
|
18
18
|
use vars qw($VERSION %exifSpec);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.24';
|
21
21
|
|
22
22
|
use Image::ExifTool qw(:Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
@@ -575,7 +575,7 @@ sub FinishValidate($$)
|
|
575
575
|
# get all tags in this group
|
576
576
|
foreach $key (sort keys %{$$et{VALUE}}) {
|
577
577
|
next unless $et->GetGroup($key, 1) eq $grp;
|
578
|
-
next if $$et{TAG_EXTRA}{$key}
|
578
|
+
next if $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
|
579
579
|
# fill in %val lookup with values based on tag ID
|
580
580
|
my $tag = $$et{TAG_INFO}{$key}{TagID};
|
581
581
|
$val{$tag} = $$et{VALUE}{$key};
|