exiftool_vendored 13.38.0 → 13.40.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.
- checksums.yaml +4 -4
- data/bin/Changes +23 -0
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +49 -47
- data/bin/config_files/local_time.config +55 -0
- data/bin/exiftool +65 -54
- data/bin/lib/Image/ExifTool/DJI.pm +256 -20
- data/bin/lib/Image/ExifTool/Font.pm +386 -118
- data/bin/lib/Image/ExifTool/Geolocation.pm +10 -7
- data/bin/lib/Image/ExifTool/Geotag.pm +18 -1
- data/bin/lib/Image/ExifTool/LNK.pm +63 -2
- data/bin/lib/Image/ExifTool/OOXML.pm +3 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +42 -35
- data/bin/lib/Image/ExifTool/Sony.pm +14 -9
- data/bin/lib/Image/ExifTool/TagLookup.pm +27 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +151 -21
- data/bin/lib/Image/ExifTool/XMP2.pl +11 -5
- data/bin/lib/Image/ExifTool.pm +9 -4
- data/bin/lib/Image/ExifTool.pod +52 -45
- data/bin/perl-Image-ExifTool.spec +47 -46
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -1
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# Description: Read meta information from MS Shell Link files
|
|
5
5
|
#
|
|
6
6
|
# Revisions: 2009/09/19 - P. Harvey Created
|
|
7
|
+
# 2025/10/20 - PH Added .URL file support
|
|
7
8
|
#
|
|
8
9
|
# References: 1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx
|
|
9
10
|
# 2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
|
|
@@ -17,7 +18,7 @@ use vars qw($VERSION);
|
|
|
17
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
19
|
use Image::ExifTool::Microsoft;
|
|
19
20
|
|
|
20
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.12';
|
|
21
22
|
|
|
22
23
|
sub ProcessItemID($$$);
|
|
23
24
|
sub ProcessLinkInfo($$$);
|
|
@@ -447,6 +448,39 @@ sub ProcessLinkInfo($$$);
|
|
|
447
448
|
},
|
|
448
449
|
);
|
|
449
450
|
|
|
451
|
+
%Image::ExifTool::LNK::INI = (
|
|
452
|
+
GROUPS => { 2 => 'Document' },
|
|
453
|
+
VARS => { ID_FMT => 'none' },
|
|
454
|
+
NOTES => 'Tags found in INI-format Windows .URL files.',
|
|
455
|
+
URL => { },
|
|
456
|
+
IconFile => { },
|
|
457
|
+
IconIndex => { },
|
|
458
|
+
WorkingDirectory => { },
|
|
459
|
+
HotKey => { },
|
|
460
|
+
ShowCommand => { PrintConv => { 1 => 'Normal', 2 => 'Minimized', 3 => 'Maximized' } },
|
|
461
|
+
Modified => {
|
|
462
|
+
Groups => { 2 => 'Time' },
|
|
463
|
+
Format => 'int64u',
|
|
464
|
+
Groups => { 2 => 'Time' },
|
|
465
|
+
# convert time from 100-ns intervals since Jan 1, 1601 (NC)
|
|
466
|
+
RawConv => q{
|
|
467
|
+
my $dat = pack('H*', $val);
|
|
468
|
+
return undef if length $dat < 8;
|
|
469
|
+
my ($lo, $hi) = unpack('V2', $dat);
|
|
470
|
+
return undef unless $lo or $hi;
|
|
471
|
+
return $hi * 4294967296 + $lo;
|
|
472
|
+
},
|
|
473
|
+
ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)',
|
|
474
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
|
475
|
+
},
|
|
476
|
+
Author => { Groups => { 2 => 'Author' } },
|
|
477
|
+
WhatsNew => { },
|
|
478
|
+
Comment => { },
|
|
479
|
+
Desc => { },
|
|
480
|
+
Roamed => { Notes => '1 if synced across multiple devices' },
|
|
481
|
+
IDList => { },
|
|
482
|
+
);
|
|
483
|
+
|
|
450
484
|
#------------------------------------------------------------------------------
|
|
451
485
|
# Extract null-terminated ASCII or Unicode string from buffer
|
|
452
486
|
# Inputs: 0) buffer ref, 1) start position, 2) flag for unicode string
|
|
@@ -588,6 +622,27 @@ sub ProcessLinkInfo($$$)
|
|
|
588
622
|
return 1;
|
|
589
623
|
}
|
|
590
624
|
|
|
625
|
+
#------------------------------------------------------------------------------
|
|
626
|
+
# Extract information from a INI-format file
|
|
627
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
|
628
|
+
# Returns: 1 on success, 0 if this wasn't a valid INI file
|
|
629
|
+
sub ProcessINI($$)
|
|
630
|
+
{
|
|
631
|
+
my ($et, $dirInfo) = @_;
|
|
632
|
+
my $raf = $$dirInfo{RAF};
|
|
633
|
+
my $buff;
|
|
634
|
+
local $/ = "\x0d\x0a";
|
|
635
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::LNK::INI');
|
|
636
|
+
while ($raf->ReadLine($buff)) {
|
|
637
|
+
if ($buff =~ /^\[(.*?)\]/) {
|
|
638
|
+
$et->VPrint(0, "$1 section:\n");
|
|
639
|
+
} elsif ($buff =~ /^\s*(\w+)=(.*)\x0d\x0a$/) {
|
|
640
|
+
$et->HandleTag($tagTablePtr, $1, $2, MakeTagInfo => 1);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return 1;
|
|
644
|
+
}
|
|
645
|
+
|
|
591
646
|
#------------------------------------------------------------------------------
|
|
592
647
|
# Extract information from a MS Shell Link (Windows shortcut) file
|
|
593
648
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
|
@@ -600,7 +655,13 @@ sub ProcessLNK($$)
|
|
|
600
655
|
|
|
601
656
|
# read LNK file header
|
|
602
657
|
$raf->Read($buff, 0x4c) == 0x4c or return 0;
|
|
603
|
-
$buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s
|
|
658
|
+
unless ($buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s) {
|
|
659
|
+
# check for INI-format LNK file (eg. .URL file)
|
|
660
|
+
return undef unless $buff =~ /^\[[InternetShortcut\][\x0d\x0a]/;
|
|
661
|
+
$raf->Seek(0,0) or return 0;
|
|
662
|
+
$et->SetFileType('URL', 'application/x-mswinurl');
|
|
663
|
+
return ProcessINI($et, $dirInfo);
|
|
664
|
+
};
|
|
604
665
|
$len = unpack('V', $buff);
|
|
605
666
|
$len >= 0x4c or return 0;
|
|
606
667
|
if ($len > 0x4c) {
|
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
14
14
|
use Image::ExifTool::XMP;
|
|
15
15
|
use Image::ExifTool::ZIP;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.10';
|
|
18
18
|
|
|
19
19
|
# test for recognized OOXML document extensions
|
|
20
20
|
my %isOOXML = (
|
|
@@ -27,6 +27,7 @@ my %isOOXML = (
|
|
|
27
27
|
XLAM => 1,
|
|
28
28
|
XLSX => 1, XLSM => 1, XLSB => 1,
|
|
29
29
|
XLTX => 1, XLTM => 1,
|
|
30
|
+
VSDX => 1,
|
|
30
31
|
);
|
|
31
32
|
|
|
32
33
|
# generate reverse lookup for file type based on MIME
|
|
@@ -57,7 +58,7 @@ my @vectorVals;
|
|
|
57
58
|
VARS => { ID_FMT => 'none' },
|
|
58
59
|
NOTES => q{
|
|
59
60
|
The Office Open XML (OOXML) format was introduced with Microsoft Office 2007
|
|
60
|
-
and is used by file types such as DOCX, PPTX and
|
|
61
|
+
and is used by file types such as DOCX, PPTX, XLSX and VSDX. These are
|
|
61
62
|
essentially ZIP archives containing XML files. The table below lists some
|
|
62
63
|
tags which have been observed in OOXML documents, but ExifTool will extract
|
|
63
64
|
any tags found from XML files of the OOXML document properties ("docProps")
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
# 25) Karsten Gieselmann private communication (OM series)
|
|
32
32
|
# IB) Iliah Borg private communication (LibRaw)
|
|
33
33
|
# NJ) Niels Kristian Bech Jensen private communication
|
|
34
|
+
# KG) Karsten Gieselmann private communication
|
|
34
35
|
#------------------------------------------------------------------------------
|
|
35
36
|
|
|
36
37
|
package Image::ExifTool::Olympus;
|
|
@@ -41,7 +42,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
41
42
|
use Image::ExifTool::Exif;
|
|
42
43
|
use Image::ExifTool::APP12;
|
|
43
44
|
|
|
44
|
-
$VERSION = '2.
|
|
45
|
+
$VERSION = '2.92';
|
|
45
46
|
|
|
46
47
|
sub PrintLensInfo($$$);
|
|
47
48
|
|
|
@@ -201,6 +202,7 @@ my %olympusLensTypes = (
|
|
|
201
202
|
# Other makes
|
|
202
203
|
'24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
|
|
203
204
|
'f7 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
|
|
205
|
+
'f7 10 10' => 'LAOWA C&D-Dreamer MFT 6.0mm F2.0', #KG
|
|
204
206
|
);
|
|
205
207
|
|
|
206
208
|
# lookup for Olympus camera types (ref PH)
|
|
@@ -59,7 +59,7 @@ use Image::ExifTool::Exif;
|
|
|
59
59
|
use Image::ExifTool::GPS;
|
|
60
60
|
use Image::ExifTool::HP;
|
|
61
61
|
|
|
62
|
-
$VERSION = '3.
|
|
62
|
+
$VERSION = '3.59';
|
|
63
63
|
|
|
64
64
|
sub CryptShutterCount($$);
|
|
65
65
|
sub PrintFilter($$$);
|
|
@@ -1947,7 +1947,8 @@ my %binaryDataAttrs = (
|
|
|
1947
1947
|
'0 28' => 'Quick Macro', # (Q)
|
|
1948
1948
|
'0 29' => 'Forest', # (Q)
|
|
1949
1949
|
'0 30' => 'Backlight Silhouette', # (Q)
|
|
1950
|
-
'0
|
|
1950
|
+
'0 31' => 'Max. Aperture Priority', #KG (Ricoh GR III)
|
|
1951
|
+
'0 32' => 'DOF', #PH (GR III) #KG ???? GR III 'DOF Priority (Deep)' is mapped to '0 2' ???
|
|
1951
1952
|
# AUTO PICT modes (auto-selected)
|
|
1952
1953
|
'1 4' => 'Auto PICT (Standard)', #13
|
|
1953
1954
|
'1 5' => 'Auto PICT (Portrait)', #7 (K100D)
|
|
@@ -1962,7 +1963,11 @@ my %binaryDataAttrs = (
|
|
|
1962
1963
|
'2 22' => 'Shallow DOF (HyP)', #PH (K-5)
|
|
1963
1964
|
'3 0' => 'Green Mode', #16
|
|
1964
1965
|
'4 0' => 'Shutter Speed Priority',
|
|
1966
|
+
'4 2' => 'Shutter Speed Priority 2', #KG Coding error? 'DOF Priority' in Tv makes no sense
|
|
1967
|
+
'4 31' => 'Shutter Speed Priority 31',#KG Coding error? 'Max Aperture' in Tv makes no sense
|
|
1965
1968
|
'5 0' => 'Aperture Priority',
|
|
1969
|
+
'5 2' => 'Aperture Priority 2', #KG Coding error? 'DOF Priority' in Av makes no sense
|
|
1970
|
+
'5 31' => 'Aperture Priority 31', #KG Coding error? 'DOF Priority' in Av makes no sense
|
|
1966
1971
|
'6 0' => 'Program Tv Shift',
|
|
1967
1972
|
'7 0' => 'Program Av Shift', #19
|
|
1968
1973
|
'8 0' => 'Manual',
|
|
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
49
49
|
use Image::ExifTool::Exif;
|
|
50
50
|
use Image::ExifTool::GPS;
|
|
51
51
|
|
|
52
|
-
$VERSION = '3.
|
|
52
|
+
$VERSION = '3.22';
|
|
53
53
|
|
|
54
54
|
sub ProcessMOV($$;$);
|
|
55
55
|
sub ProcessKeys($$$);
|
|
@@ -10515,9 +10515,9 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
10515
10515
|
$et->Warn($warnStr);
|
|
10516
10516
|
}
|
|
10517
10517
|
}
|
|
10518
|
-
# tweak file type based on track content ("iso*" and "dash" ftyp only)
|
|
10518
|
+
# tweak file type based on track content ("iso*" and "dash" ftyp only ["mp42" added in 13.39])
|
|
10519
10519
|
if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
|
|
10520
|
-
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
|
|
10520
|
+
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash|mp42)/ and
|
|
10521
10521
|
$$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
|
|
10522
10522
|
{
|
|
10523
10523
|
$et->OverrideFileType('M4A', 'audio/mp4');
|
|
@@ -111,7 +111,7 @@ my %insvLimit = (
|
|
|
111
111
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
112
112
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
113
113
|
most of these tags are combined into the single table below, ExifTool
|
|
114
|
-
currently reads
|
|
114
|
+
currently reads 116 different types of timed GPS metadata from video files.
|
|
115
115
|
},
|
|
116
116
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
|
117
117
|
GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
|
|
@@ -1006,6 +1006,28 @@ sub HandleTextTags($$$)
|
|
|
1006
1006
|
undef %$tags; # clear the hash
|
|
1007
1007
|
}
|
|
1008
1008
|
|
|
1009
|
+
#------------------------------------------------------------------------------
|
|
1010
|
+
# Handle new time in NMEA stream and store queued tags if necessary
|
|
1011
|
+
# Inputs: 0) ExifTool ref, 1) time string, 2) tag table ref, 3) tags hash
|
|
1012
|
+
sub HandleNewTime($$$$)
|
|
1013
|
+
{
|
|
1014
|
+
my ($et, $time, $tagTbl, $tags) = @_;
|
|
1015
|
+
if ($$et{LastTime}) {
|
|
1016
|
+
if ($$et{LastTime} eq $time) {
|
|
1017
|
+
# combine with the previous NMEA sentence
|
|
1018
|
+
$$et{DOC_NUM} = $$et{LastDoc};
|
|
1019
|
+
} elsif (%$tags) {
|
|
1020
|
+
# handle existing tags and start a new document
|
|
1021
|
+
# (see https://exiftool.org/forum/index.php?msg=75422)
|
|
1022
|
+
HandleTextTags($et, $tagTbl, $tags);
|
|
1023
|
+
# increment document number and update document count if necessary
|
|
1024
|
+
$$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
$$et{LastTime} = $time;
|
|
1028
|
+
$$et{LastDoc} = $$et{DOC_NUM};
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1009
1031
|
#------------------------------------------------------------------------------
|
|
1010
1032
|
# Process subtitle 'text'
|
|
1011
1033
|
# Inputs: 0) ExifTool ref, 1) data ref or dirInfo ref, 2) tag table ref
|
|
@@ -1032,41 +1054,18 @@ sub Process_text($$$;$)
|
|
|
1032
1054
|
next;
|
|
1033
1055
|
}
|
|
1034
1056
|
my $time = "$1:$2:$3";
|
|
1035
|
-
|
|
1036
|
-
if ($$et{LastTime} eq $time) {
|
|
1037
|
-
# combine with the previous NMEA sentence
|
|
1038
|
-
$$et{DOC_NUM} = $$et{LastDoc};
|
|
1039
|
-
} elsif (%tags) {
|
|
1040
|
-
# handle existing tags and start a new document
|
|
1041
|
-
# (see https://exiftool.org/forum/index.php?msg=75422)
|
|
1042
|
-
HandleTextTags($et, $tagTbl, \%tags);
|
|
1043
|
-
undef %tags;
|
|
1044
|
-
# increment document number and update document count if necessary
|
|
1045
|
-
$$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
$$et{LastTime} = $time;
|
|
1049
|
-
$$et{LastDoc} = $$et{DOC_NUM};
|
|
1057
|
+
HandleNewTime($et, $time, $tagTbl, \%tags);
|
|
1050
1058
|
my $year = $14 + ($14 >= 70 ? 1900 : 2000);
|
|
1051
|
-
my $
|
|
1052
|
-
|
|
1059
|
+
my $date = sprintf('%.4d:%.2d:%.2d', $year, $13, $12);
|
|
1060
|
+
$$et{LastDate} = $date;
|
|
1061
|
+
$tags{GPSDateTime} = "$date ${time}Z";
|
|
1053
1062
|
$tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1);
|
|
1054
1063
|
$tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1);
|
|
1055
1064
|
$tags{GPSSpeed} = $10 * $knotsToKph if length $10;
|
|
1056
1065
|
$tags{GPSTrack} = $11 if length $11;
|
|
1057
1066
|
} elsif ($tag =~ /^[A-Z]{2}GGA$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(?:\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/s) {
|
|
1058
1067
|
my $time = "$1:$2:$3";
|
|
1059
|
-
|
|
1060
|
-
if ($$et{LastTime} eq $time) {
|
|
1061
|
-
$$et{DOC_NUM} = $$et{LastDoc};
|
|
1062
|
-
} elsif (%tags) {
|
|
1063
|
-
HandleTextTags($et, $tagTbl, \%tags);
|
|
1064
|
-
undef %tags;
|
|
1065
|
-
$$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
$$et{LastTime} = $time;
|
|
1069
|
-
$$et{LastDoc} = $$et{DOC_NUM};
|
|
1068
|
+
HandleNewTime($et, $time, $tagTbl, \%tags);
|
|
1070
1069
|
$tags{GPSTimeStamp} = $time;
|
|
1071
1070
|
$tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1);
|
|
1072
1071
|
$tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1);
|
|
@@ -1114,6 +1113,11 @@ sub Process_text($$$;$)
|
|
|
1114
1113
|
}
|
|
1115
1114
|
}
|
|
1116
1115
|
}
|
|
1116
|
+
if ($tags{GPSTimeStamp} and not $tags{GPSDateTime} and $$et{LastDate}) {
|
|
1117
|
+
# hack to fill in missing date for NextBase 662GW
|
|
1118
|
+
# (note: this doesn't necessarily handle day rollover properly)
|
|
1119
|
+
$tags{GPSDateTime} = "$$et{LastDate} $tags{GPSTimeStamp}Z";
|
|
1120
|
+
}
|
|
1117
1121
|
HandleTextTags($et, $tagTbl, \%tags);
|
|
1118
1122
|
return;
|
|
1119
1123
|
}
|
|
@@ -3490,14 +3494,17 @@ sub ProcessGarminGPS($$$)
|
|
|
3490
3494
|
while ($pos + 20 <= $dataLen) {
|
|
3491
3495
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
3492
3496
|
my $time = Image::ExifTool::ConvertUnixTime(Get32u($dataPt, $pos) - $epoch) . 'Z';
|
|
3493
|
-
my $lat = Get32s($dataPt, $pos + 12)
|
|
3494
|
-
my $lon = Get32s($dataPt, $pos + 16)
|
|
3497
|
+
my $lat = Get32s($dataPt, $pos + 12);
|
|
3498
|
+
my $lon = Get32s($dataPt, $pos + 16);
|
|
3495
3499
|
my $spd = Get16u($dataPt, $pos + 4); # (in mph)
|
|
3496
3500
|
$et->HandleTag($tagTbl, 'GPSDateTime', $time);
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
+
# skip bad GPS fixes
|
|
3502
|
+
if ($lat != -2147483648 or $lon != -2147483648) {
|
|
3503
|
+
$et->HandleTag($tagTbl, 'GPSLatitude', $lat * $scl);
|
|
3504
|
+
$et->HandleTag($tagTbl, 'GPSLongitude', $lon * $scl);
|
|
3505
|
+
$et->HandleTag($tagTbl, 'GPSSpeed', $spd);
|
|
3506
|
+
$et->HandleTag($tagTbl, 'GPSSpeedRef', 'M');
|
|
3507
|
+
}
|
|
3501
3508
|
$pos += 20;
|
|
3502
3509
|
}
|
|
3503
3510
|
delete $$et{DOC_NUM};
|
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
34
34
|
use Image::ExifTool::Exif;
|
|
35
35
|
use Image::ExifTool::Minolta;
|
|
36
36
|
|
|
37
|
-
$VERSION = '3.
|
|
37
|
+
$VERSION = '3.79';
|
|
38
38
|
|
|
39
39
|
sub ProcessSRF($$$);
|
|
40
40
|
sub ProcessSR2($$$);
|
|
@@ -180,6 +180,9 @@ sub PrintInvLensSpec($;$$);
|
|
|
180
180
|
32889 => 'Sony FE 28-70mm F2 GM',
|
|
181
181
|
32890 => 'Sony FE 400-800mm F6.3-8 G OSS', #JR
|
|
182
182
|
32891 => 'Sony FE 50-150mm F2 GM', #github335
|
|
183
|
+
32893 => 'Sony FE 100mm F2.8 Macro GM OSS', #JR
|
|
184
|
+
33093 => 'Sony FE 100mm F2.8 Macro GM OSS + 1.4X Teleconverter', #JR (NC)
|
|
185
|
+
33094 => 'Sony FE 100mm F2.8 Macro GM OSS + 2X Teleconverter', #JR
|
|
183
186
|
|
|
184
187
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
|
185
188
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
|
@@ -1135,7 +1138,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
|
1135
1138
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
|
|
1136
1139
|
},{
|
|
1137
1140
|
Name => 'Tag2010i', # ?
|
|
1138
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6100A?|6400A?|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|
|
|
1141
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6100A?|6400A?|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7A?|HX95|HX99|RX0M2)|ZV-(1[AF]?|1M2|E10))\b/',
|
|
1139
1142
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
|
|
1140
1143
|
},{
|
|
1141
1144
|
Name => 'Tag_0x2010',
|
|
@@ -2209,8 +2212,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
|
2209
2212
|
400 => 'ILCE-1M2', #PH
|
|
2210
2213
|
401 => 'DSC-RX1RM3', #JR
|
|
2211
2214
|
402 => 'ILCE-6400A', #github347
|
|
2215
|
+
403 => 'ILCE-6100A', #JR
|
|
2212
2216
|
404 => 'DSC-RX100M7A', #github347
|
|
2213
2217
|
406 => 'ILME-FX2', #JR
|
|
2218
|
+
408 => 'ZV-1A', #JR
|
|
2214
2219
|
},
|
|
2215
2220
|
},
|
|
2216
2221
|
0xb020 => { #2
|
|
@@ -8525,7 +8530,7 @@ my %isoSetting2010 = (
|
|
|
8525
8530
|
},
|
|
8526
8531
|
0x002a => [{
|
|
8527
8532
|
Name => 'Quality2',
|
|
8528
|
-
Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|
|
|
8533
|
+
Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3A?|FX30)|ZV-(E1|E10M2))\b/',
|
|
8529
8534
|
PrintConv => {
|
|
8530
8535
|
0 => 'JPEG',
|
|
8531
8536
|
1 => 'RAW',
|
|
@@ -8544,13 +8549,13 @@ my %isoSetting2010 = (
|
|
|
8544
8549
|
}],
|
|
8545
8550
|
# 0x0047 => { # often incorrect, requires 16x for some models
|
|
8546
8551
|
# Name => 'SonyImageHeight',
|
|
8547
|
-
# Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(
|
|
8552
|
+
# Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3A?|FX30)|ZV-E1)\b/',
|
|
8548
8553
|
# Format => 'int16u',
|
|
8549
8554
|
# PrintConv => '$val > 0 ? 8*$val : "n.a."',
|
|
8550
8555
|
# },
|
|
8551
8556
|
0x0053 => {
|
|
8552
8557
|
Name => 'ModelReleaseYear',
|
|
8553
|
-
Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|
|
|
8558
|
+
Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3A?|FX30)|ZV-(E1|E10M2))\b/',
|
|
8554
8559
|
Format => 'int8u',
|
|
8555
8560
|
PrintConv => 'sprintf("20%.2d", $val)',
|
|
8556
8561
|
},
|
|
@@ -8572,7 +8577,7 @@ my %isoSetting2010 = (
|
|
|
8572
8577
|
},
|
|
8573
8578
|
0x013f => {
|
|
8574
8579
|
Name => 'ShutterType',
|
|
8575
|
-
Condition => '$$self{Model} =~ /^(DSC-
|
|
8580
|
+
Condition => '$$self{Model} =~ /^(DSC-RX100M7A?|ZV-(1A?|1F|1M2))\b/',
|
|
8576
8581
|
PrintConv => {
|
|
8577
8582
|
7 => 'Electronic',
|
|
8578
8583
|
23 => 'Mechanical',
|
|
@@ -10087,7 +10092,7 @@ my %isoSetting2010 = (
|
|
|
10087
10092
|
},
|
|
10088
10093
|
0x088f => {
|
|
10089
10094
|
Name => 'VignettingCorrParams',
|
|
10090
|
-
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-
|
|
10095
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
|
|
10091
10096
|
Format => 'int16s[16]',
|
|
10092
10097
|
},
|
|
10093
10098
|
0x0891 => {
|
|
@@ -10102,7 +10107,7 @@ my %isoSetting2010 = (
|
|
|
10102
10107
|
},
|
|
10103
10108
|
0x08b5 => {
|
|
10104
10109
|
Name => 'APS-CSizeCapture',
|
|
10105
|
-
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-
|
|
10110
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
|
|
10106
10111
|
PrintConv => {
|
|
10107
10112
|
0 => 'Off',
|
|
10108
10113
|
1 => 'On',
|
|
@@ -10126,7 +10131,7 @@ my %isoSetting2010 = (
|
|
|
10126
10131
|
},
|
|
10127
10132
|
0x0914 => {
|
|
10128
10133
|
Name => 'ChromaticAberrationCorrParams',
|
|
10129
|
-
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-
|
|
10134
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
|
|
10130
10135
|
Format => 'int16s[32]',
|
|
10131
10136
|
},
|
|
10132
10137
|
0x0916 => {
|
|
@@ -992,6 +992,8 @@ my %tagLookup = (
|
|
|
992
992
|
'aggregationtype' => { 554 => 'aggregationType' },
|
|
993
993
|
'agreement' => { 557 => 'agreement' },
|
|
994
994
|
'ah2greeninterpolationthreshold' => { 155 => 0xe4e },
|
|
995
|
+
'aipromptinformation' => { 548 => 'AIPromptInformation' },
|
|
996
|
+
'aipromptwritername' => { 548 => 'AIPromptWriterName' },
|
|
995
997
|
'airplanemode' => { 260 => 0x9c0, 263 => 0x722, 264 => 0x782, 265 => 0x624, 266 => 0x654, 267 => 0x6bc },
|
|
996
998
|
'aiservocontinuousshooting' => { 89 => 0x15 },
|
|
997
999
|
'aiservofirstimage' => { 2 => 0x5 },
|
|
@@ -1002,6 +1004,8 @@ my %tagLookup = (
|
|
|
1002
1004
|
'aiservotrackingmethod' => { 90 => 0x504 },
|
|
1003
1005
|
'aiservotrackingsensitivity' => { 89 => 0x14, 90 => 0x502 },
|
|
1004
1006
|
'aisubjecttrackingmode' => { 345 => 0x309 },
|
|
1007
|
+
'aisystemused' => { 548 => 'AISystemUsed' },
|
|
1008
|
+
'aisystemversionused' => { 548 => 'AISystemVersionUsed' },
|
|
1005
1009
|
'album' => { 427 => ['albm',"\xa9alb"], 429 => 'album', 435 => ['albm',"\xa9alb"], 564 => 'album' },
|
|
1006
1010
|
'albumartist' => { 196 => 'WM/AlbumArtist', 427 => 'aART', 435 => 'albr' },
|
|
1007
1011
|
'albumcoverurl' => { 196 => 'WM/AlbumCoverURL' },
|
|
@@ -8981,6 +8985,11 @@ my %tagExists = (
|
|
|
8981
8985
|
'creatoros' => 1,
|
|
8982
8986
|
'creatorsoftware' => 1,
|
|
8983
8987
|
'creatorversion' => 1,
|
|
8988
|
+
'creditclass' => 1,
|
|
8989
|
+
'creditdir' => 1,
|
|
8990
|
+
'creditname' => 1,
|
|
8991
|
+
'creditrole' => 1,
|
|
8992
|
+
'crediturl' => 1,
|
|
8984
8993
|
'crgbtoerimm0spline' => 1,
|
|
8985
8994
|
'crgbtoerimm1spline' => 1,
|
|
8986
8995
|
'crgbtoerimm2spline' => 1,
|
|
@@ -9201,7 +9210,9 @@ my %tagExists = (
|
|
|
9201
9210
|
'depthswheight' => 1,
|
|
9202
9211
|
'depthswwidth' => 1,
|
|
9203
9212
|
'derivedimageref' => 1,
|
|
9213
|
+
'desc' => 1,
|
|
9204
9214
|
'descender' => 1,
|
|
9215
|
+
'descriptionurl' => 1,
|
|
9205
9216
|
'designer' => 1,
|
|
9206
9217
|
'designerurl' => 1,
|
|
9207
9218
|
'desiredreproductions' => 1,
|
|
@@ -9555,6 +9566,10 @@ my %tagExists = (
|
|
|
9555
9566
|
'extensionclassid' => 1,
|
|
9556
9567
|
'extensioncreatedate' => 1,
|
|
9557
9568
|
'extensiondescription' => 1,
|
|
9569
|
+
'extensionid' => 1,
|
|
9570
|
+
'extensionitemid' => 1,
|
|
9571
|
+
'extensionitemname' => 1,
|
|
9572
|
+
'extensionitemvalue' => 1,
|
|
9558
9573
|
'extensionmodifydate' => 1,
|
|
9559
9574
|
'extensionname' => 1,
|
|
9560
9575
|
'extensionpersistence' => 1,
|
|
@@ -10187,6 +10202,7 @@ my %tagExists = (
|
|
|
10187
10202
|
'icingdetected' => 1,
|
|
10188
10203
|
'icondir' => 1,
|
|
10189
10204
|
'iconenvdata' => 1,
|
|
10205
|
+
'iconfile' => 1,
|
|
10190
10206
|
'iconfilename' => 1,
|
|
10191
10207
|
'iconindex' => 1,
|
|
10192
10208
|
'ics' => 1,
|
|
@@ -10205,6 +10221,7 @@ my %tagExists = (
|
|
|
10205
10221
|
'idependentanddisposablesamples' => 1,
|
|
10206
10222
|
'idlesequence' => 1,
|
|
10207
10223
|
'idletiming' => 1,
|
|
10224
|
+
'idlist' => 1,
|
|
10208
10225
|
'idsbasevalue' => 1,
|
|
10209
10226
|
'idstring' => 1,
|
|
10210
10227
|
'ifd0' => 1,
|
|
@@ -10692,7 +10709,10 @@ my %tagExists = (
|
|
|
10692
10709
|
'levelinfok3iii' => 1,
|
|
10693
10710
|
'libraryid' => 1,
|
|
10694
10711
|
'libraryname' => 1,
|
|
10712
|
+
'licenseeclass' => 1,
|
|
10713
|
+
'licenseedir' => 1,
|
|
10695
10714
|
'licenseinfourl' => 1,
|
|
10715
|
+
'licenseurl' => 1,
|
|
10696
10716
|
'lightingopt' => 1,
|
|
10697
10717
|
'lightness' => 1,
|
|
10698
10718
|
'lightroomworkflow' => 1,
|
|
@@ -11156,6 +11176,7 @@ my %tagExists = (
|
|
|
11156
11176
|
'modenumber' => 1,
|
|
11157
11177
|
'modificationnumber' => 1,
|
|
11158
11178
|
'modificationpermissions' => 1,
|
|
11179
|
+
'modified' => 1,
|
|
11159
11180
|
'modifiedby' => 1,
|
|
11160
11181
|
'modifiedinfo' => 1,
|
|
11161
11182
|
'moiversion' => 1,
|
|
@@ -12211,6 +12232,7 @@ my %tagExists = (
|
|
|
12211
12232
|
'rjmd' => 1,
|
|
12212
12233
|
'rmeta' => 1,
|
|
12213
12234
|
'rnoiselines' => 1,
|
|
12235
|
+
'roamed' => 1,
|
|
12214
12236
|
'robots' => 1,
|
|
12215
12237
|
'rocinfo' => 1,
|
|
12216
12238
|
'roidescription' => 1,
|
|
@@ -12505,6 +12527,7 @@ my %tagExists = (
|
|
|
12505
12527
|
'shotinfoz9' => 1,
|
|
12506
12528
|
'shotlogdatatext' => 1,
|
|
12507
12529
|
'shotparamstext' => 1,
|
|
12530
|
+
'showcommand' => 1,
|
|
12508
12531
|
'showmode' => 1,
|
|
12509
12532
|
'showobjects' => 1,
|
|
12510
12533
|
'shutterangle' => 1,
|
|
@@ -13229,6 +13252,8 @@ my %tagExists = (
|
|
|
13229
13252
|
'vddimdacnominalvalues' => 1,
|
|
13230
13253
|
'vegasversionmajor' => 1,
|
|
13231
13254
|
'vegasversionminor' => 1,
|
|
13255
|
+
'vendorclass' => 1,
|
|
13256
|
+
'vendordir' => 1,
|
|
13232
13257
|
'vendorid' => 1,
|
|
13233
13258
|
'vendorname' => 1,
|
|
13234
13259
|
'vendorurl' => 1,
|
|
@@ -13410,6 +13435,7 @@ my %tagExists = (
|
|
|
13410
13435
|
'webpage' => 1,
|
|
13411
13436
|
'weight' => 1,
|
|
13412
13437
|
'what3words' => 1,
|
|
13438
|
+
'whatsnew' => 1,
|
|
13413
13439
|
'whitebalancematching' => 1,
|
|
13414
13440
|
'whitebalancergb' => 1,
|
|
13415
13441
|
'whitebalancetable' => 1,
|
|
@@ -13454,6 +13480,7 @@ my %tagExists = (
|
|
|
13454
13480
|
'wmcontentid' => 1,
|
|
13455
13481
|
'wmshadowfilesourcedrmtype' => 1,
|
|
13456
13482
|
'wmshadowfilesourcefiletype' => 1,
|
|
13483
|
+
'woffversion' => 1,
|
|
13457
13484
|
'word97' => 1,
|
|
13458
13485
|
'worddocument' => 1,
|
|
13459
13486
|
'words' => 1,
|