exiftool_vendored 12.86.0 → 12.92.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 +81 -1
- data/bin/MANIFEST +1 -0
- data/bin/META.json +2 -2
- data/bin/META.yml +17 -17
- data/bin/README +3 -2
- data/bin/build_geolocation +7 -4
- data/bin/config_files/onone.config +28 -0
- data/bin/exiftool +23 -15
- data/bin/lib/Image/ExifTool/AIFF.pm +8 -4
- data/bin/lib/Image/ExifTool/ASF.pm +4 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +12 -7
- data/bin/lib/Image/ExifTool/Canon.pm +75 -10
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +46 -4
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geolocation.pm +6 -0
- data/bin/lib/Image/ExifTool/InDesign.pm +8 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +2 -2
- data/bin/lib/Image/ExifTool/Matroska.pm +66 -10
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +36 -2
- data/bin/lib/Image/ExifTool/PNG.pm +10 -2
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -0
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
- data/bin/lib/Image/ExifTool/Pentax.pm +80 -14
- data/bin/lib/Image/ExifTool/QuickTime.pm +51 -9
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +111 -8
- data/bin/lib/Image/ExifTool/RIFF.pm +20 -10
- data/bin/lib/Image/ExifTool/Samsung.pm +28 -19
- data/bin/lib/Image/ExifTool/Sony.pm +21 -11
- data/bin/lib/Image/ExifTool/TagLookup.pm +6804 -6784
- data/bin/lib/Image/ExifTool/TagNames.pod +92 -21
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +84 -15
- data/bin/lib/Image/ExifTool/Writer.pl +7 -4
- data/bin/lib/Image/ExifTool/XMP.pm +8 -8
- data/bin/lib/Image/ExifTool/XMP2.pl +51 -30
- data/bin/lib/Image/ExifTool/ZIP.pm +8 -4
- data/bin/lib/Image/ExifTool.pm +22 -16
- data/bin/lib/Image/ExifTool.pod +15 -6
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
48
48
|
use Image::ExifTool::Exif;
|
49
49
|
use Image::ExifTool::GPS;
|
50
50
|
|
51
|
-
$VERSION = '2.
|
51
|
+
$VERSION = '2.99';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -238,7 +238,11 @@ my %useExt = ( GLV => 'MP4' );
|
|
238
238
|
|
239
239
|
# information for int32u date/time tags (time zero is Jan 1, 1904)
|
240
240
|
my %timeInfo = (
|
241
|
-
Notes =>
|
241
|
+
Notes => q{
|
242
|
+
converted from UTC to local time if the QuickTimeUTC option is set. This
|
243
|
+
tag is part of a binary data structure so it may not be deleted -- instead
|
244
|
+
the value is set to zero if the tag is deleted individually
|
245
|
+
},
|
242
246
|
Shift => 'Time',
|
243
247
|
Writable => 1,
|
244
248
|
Permanent => 1,
|
@@ -8988,12 +8992,20 @@ sub HandleItemInfo($)
|
|
8988
8992
|
if ($$item{Extents} and @{$$item{Extents}}) {
|
8989
8993
|
$len += $$_[2] foreach @{$$item{Extents}};
|
8990
8994
|
}
|
8991
|
-
$
|
8995
|
+
my $enc = $$item{ContentEncoding} ? ", $$item{ContentEncoding} encoded" : '';
|
8996
|
+
$et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes$enc)\n");
|
8992
8997
|
}
|
8993
8998
|
# get ExifTool name for this item
|
8994
8999
|
my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP', jpeg => 'PreviewImage' }->{$type} || '';
|
8995
9000
|
my ($warn, $extent);
|
8996
|
-
|
9001
|
+
if ($$item{ContentEncoding}) {
|
9002
|
+
if ($$item{ContentEncoding} ne 'deflate') {
|
9003
|
+
# (other possible values are 'gzip' and 'compress', but I don't have samples of these)
|
9004
|
+
$warn = "Can't currently decode $$item{ContentEncoding} encoded $type metadata";
|
9005
|
+
} elsif (not eval { require Compress::Zlib }) {
|
9006
|
+
$warn = "Install Compress::Zlib to decode deflated $type metadata";
|
9007
|
+
}
|
9008
|
+
}
|
8997
9009
|
$warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
|
8998
9010
|
$warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
|
8999
9011
|
$et->WarnOnce($warn) if $warn and $name;
|
@@ -9053,6 +9065,22 @@ sub HandleItemInfo($)
|
|
9053
9065
|
next unless defined $buff;
|
9054
9066
|
$buff = $val . $buff if length $val;
|
9055
9067
|
next unless length $buff; # ignore empty directories
|
9068
|
+
if ($$item{ContentEncoding}) {
|
9069
|
+
my ($v2, $stat);
|
9070
|
+
my $inflate = Compress::Zlib::inflateInit();
|
9071
|
+
$inflate and ($v2, $stat) = $inflate->inflate($buff);
|
9072
|
+
if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
|
9073
|
+
$buff = $v2;
|
9074
|
+
my $len = length $buff;
|
9075
|
+
$et->VPrint(0, "$$et{INDENT}Inflated Item $id) '${type}' ($len bytes)\n");
|
9076
|
+
$et->VerboseDump(\$buff);
|
9077
|
+
} else {
|
9078
|
+
$warn = "Error inflating $name metadata";
|
9079
|
+
$et->WarnOnce($warn);
|
9080
|
+
$et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
|
9081
|
+
next;
|
9082
|
+
}
|
9083
|
+
}
|
9056
9084
|
my ($start, $subTable, $proc);
|
9057
9085
|
my $pos = $$item{Extents}[0][1] + $base;
|
9058
9086
|
if ($name eq 'EXIF' and length $buff >= 4) {
|
@@ -9488,7 +9516,8 @@ sub ProcessMOV($$;$)
|
|
9488
9516
|
my $dataPt = $$dirInfo{DataPt};
|
9489
9517
|
my $verbose = $et->Options('Verbose');
|
9490
9518
|
my $validate = $$et{OPTIONS}{Validate};
|
9491
|
-
my $
|
9519
|
+
my $dirBase = $$dirInfo{Base} || 0;
|
9520
|
+
my $dataPos = $dirBase;
|
9492
9521
|
my $dirID = $$dirInfo{DirID} || '';
|
9493
9522
|
my $charsetQuickTime = $et->Options('CharsetQuickTime');
|
9494
9523
|
my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
|
@@ -9573,6 +9602,7 @@ sub ProcessMOV($$;$)
|
|
9573
9602
|
$atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
|
9574
9603
|
}
|
9575
9604
|
my $lastTag = '';
|
9605
|
+
my $lastPos = 0;
|
9576
9606
|
for (;;) {
|
9577
9607
|
my ($eeTag, $ignore);
|
9578
9608
|
last if defined $atomCount and --$atomCount < 0;
|
@@ -9611,6 +9641,8 @@ sub ProcessMOV($$;$)
|
|
9611
9641
|
} elsif (not $et->Options('LargeFileSupport')) {
|
9612
9642
|
$warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
|
9613
9643
|
last;
|
9644
|
+
} elsif ($et->Options('LargeFileSupport') eq '2') {
|
9645
|
+
$et->WarnOnce('Processing large atom (LargeFileSupport is 2)');
|
9614
9646
|
}
|
9615
9647
|
}
|
9616
9648
|
$size = $hi * 4294967296 + $lo - 16;
|
@@ -9705,7 +9737,7 @@ sub ProcessMOV($$;$)
|
|
9705
9737
|
if ($size > 0x2000000) { # start to get worried above 32 MiB
|
9706
9738
|
# check for RIFF trailer (written by Auto-Vox dashcam)
|
9707
9739
|
if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
|
9708
|
-
$et->VPrint(0, "Found RIFF trailer");
|
9740
|
+
$et->VPrint(0, sprintf("Found RIFF trailer at offset 0x%x",$lastPos));
|
9709
9741
|
if ($et->Options('ExtractEmbedded')) {
|
9710
9742
|
$raf->Seek(-8, 1) or last; # seek back to start of trailer
|
9711
9743
|
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
@@ -9714,6 +9746,11 @@ sub ProcessMOV($$;$)
|
|
9714
9746
|
EEWarn($et);
|
9715
9747
|
}
|
9716
9748
|
last;
|
9749
|
+
} elsif ($buff eq 'CCCCCCCC') {
|
9750
|
+
$et->VPrint(0, sprintf("Found Kenwood trailer at offset 0x%x",$lastPos));
|
9751
|
+
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
9752
|
+
ProcessKenwoodTrailer($et, { RAF => $raf }, $tbl);
|
9753
|
+
last;
|
9717
9754
|
}
|
9718
9755
|
$ignore = 1;
|
9719
9756
|
if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
|
@@ -10085,14 +10122,15 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10085
10122
|
) if $verbose;
|
10086
10123
|
if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
|
10087
10124
|
my $t = PrintableTagID($tag,2);
|
10088
|
-
$warnStr = "Truncated '${t}' data";
|
10125
|
+
$warnStr = sprintf("Truncated '${t}' data at offset 0x%x", $lastPos);
|
10089
10126
|
last;
|
10090
10127
|
}
|
10091
10128
|
}
|
10092
10129
|
$dataPos += $size + 8; # point to start of next atom data
|
10093
10130
|
last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
|
10131
|
+
$lastPos = $raf->Tell() + $dirBase;
|
10094
10132
|
$raf->Read($buff, 8) == 8 or last;
|
10095
|
-
$lastTag = $tag if $$tagTablePtr{$tag};
|
10133
|
+
$lastTag = $tag if $$tagTablePtr{$tag} and $tag ne 'free'; # (Insta360 sometimes puts free block before trailer)
|
10096
10134
|
($size, $tag) = unpack('Na4', $buff);
|
10097
10135
|
++$index if defined $index;
|
10098
10136
|
}
|
@@ -10102,7 +10140,11 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10102
10140
|
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
|
10103
10141
|
ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
10104
10142
|
{
|
10105
|
-
$
|
10143
|
+
if ($size == 0x1000000 - 8 and $tag =~ /^(\x94\xc0\x7e\0|\0\x02\0\0)/) {
|
10144
|
+
$et->Warn(sprintf('Insta360 trailer at offset 0x%x', $lastPos), 1);
|
10145
|
+
} else {
|
10146
|
+
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
10147
|
+
}
|
10106
10148
|
} else {
|
10107
10149
|
$et->Warn($warnStr);
|
10108
10150
|
}
|
@@ -109,7 +109,7 @@ my %insvLimit = (
|
|
109
109
|
The tags below are extracted from timed metadata in QuickTime and other
|
110
110
|
formats of video files when the ExtractEmbedded option is used. Although
|
111
111
|
most of these tags are combined into the single table below, ExifTool
|
112
|
-
currently reads
|
112
|
+
currently reads 76 different formats of timed GPS metadata from video files.
|
113
113
|
},
|
114
114
|
VARS => { NO_ID => 1 },
|
115
115
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -143,6 +143,7 @@ my %insvLimit = (
|
|
143
143
|
ExposureCompensation => { PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', Groups => { 2 => 'Camera' } },
|
144
144
|
ISO => { Groups => { 2 => 'Camera' } },
|
145
145
|
CameraDateTime=>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
|
146
|
+
DateTimeStamp =>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
|
146
147
|
VideoTimeStamp => { Groups => { 2 => 'Video' } },
|
147
148
|
Accelerometer=> { Notes => '3-axis acceleration in units of g' },
|
148
149
|
AccelerometerData => { },
|
@@ -992,8 +993,29 @@ sub Process_text($$$;$)
|
|
992
993
|
$tags{Text} = defined $tags{Text} ? $tags{Text} . "\$$tag$dat" : "\$$tag$dat";
|
993
994
|
}
|
994
995
|
}
|
995
|
-
|
996
|
-
|
996
|
+
if (%tags) {
|
997
|
+
unless ($tags{Accelerometer}) { # (probably unnecessary test)
|
998
|
+
# check for NextBase 622GW accelerometer data
|
999
|
+
# Example data (leading 2-byte length word has been stripped by ProcessSamples):
|
1000
|
+
# 0000: 00 00 00 00 32 30 32 32 30 39 30 35 31 36 34 30 [....202209051640]
|
1001
|
+
# 0010: 33 33 00 00 29 00 ba ff 48 ff 18 00 f2 07 5a ff [33..)...H.....Z.]
|
1002
|
+
# 0020: 64 ff e8 ff 58 ff e8 ff c1 07 43 ff 41 ff d2 ff [d...X.....C.A...]
|
1003
|
+
# 0030: 58 ff ea ff dc 07 50 ff 30 ff e0 ff 72 ff d8 ff [X.....P.0...r...]
|
1004
|
+
# 0040: f5 07 51 ff 16 ff dc ff 6a ff ca ff 33 08 45 ff [..Q.....j...3.E.]
|
1005
|
+
if ($$dataPt =~ /^\0{4}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\0\0.{2}/s) {
|
1006
|
+
$tags{DateTimeStamp} = "$1:$2:$2 $4:$5:$6";
|
1007
|
+
my $num = unpack('x20v', $$dataPt); # number of accelerometer readings
|
1008
|
+
if ($num and $num * 12 + 22 < length $$dataPt) {
|
1009
|
+
$num *= 6;
|
1010
|
+
my @acc = unpack("x22v$num", $$dataPt);
|
1011
|
+
map { $_ = $_ - 0x10000 if $_ >= 0x8000 } @acc;
|
1012
|
+
$tags{AccelerometerData} = "@acc";
|
1013
|
+
}
|
1014
|
+
}
|
1015
|
+
}
|
1016
|
+
HandleTextTags($et, $tagTbl, \%tags);
|
1017
|
+
return;
|
1018
|
+
}
|
997
1019
|
# check for enciphered binary GPS data
|
998
1020
|
# BlueSkySea:
|
999
1021
|
# 0000: 00 00 aa aa aa aa 54 54 98 9a 9b 93 9a 92 98 9a [......TT........]
|
@@ -1398,9 +1420,10 @@ Sample: for ($i=0; ; ) {
|
|
1398
1420
|
} elsif ($type eq 'gps ') { # (ie. GPSDataList tag)
|
1399
1421
|
|
1400
1422
|
if ($buff =~ /^....freeGPS /s) {
|
1401
|
-
#
|
1402
|
-
# (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV
|
1403
|
-
|
1423
|
+
# parse freeGPS data unless done already in brute-force scan
|
1424
|
+
# (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV,
|
1425
|
+
# and some videos don't put 'gps ' data in mdat, eg XGODY 12" 4K Dashcam)
|
1426
|
+
last if $$et{FoundGPSByScan};
|
1404
1427
|
# decode "freeGPS " data (Novatek and others)
|
1405
1428
|
ProcessFreeGPS($et, {
|
1406
1429
|
DataPt => \$buff,
|
@@ -2027,9 +2050,41 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2027
2050
|
}
|
2028
2051
|
}
|
2029
2052
|
|
2030
|
-
}
|
2053
|
+
} elsif ($$dataPt =~ m<^.{23}(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2}) [N|S]>s) {
|
2031
2054
|
|
2032
2055
|
$debug and $et->FoundTag(GPSType => 16);
|
2056
|
+
# XGODY 12" 4K Dashcam
|
2057
|
+
# 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
|
2058
|
+
# 0010: 6e 6f 72 6d 61 6c 3a 32 30 32 34 2f 30 35 2f 32 [normal:2024/05/2]
|
2059
|
+
# 0020: 32 20 30 32 3a 35 34 3a 32 39 20 4e 3a 34 32 2e [2 02:54:29 N:42.]
|
2060
|
+
# 0030: 33 38 32 34 37 30 20 57 3a 38 33 2e 33 38 39 35 [382470 W:83.3895]
|
2061
|
+
# 0040: 37 30 20 35 33 2e 36 20 6b 6d 2f 68 20 78 3a 2d [70 53.6 km/h x:-]
|
2062
|
+
# 0050: 30 2e 30 32 20 79 3a 30 2e 39 39 20 7a 3a 30 2e [0.02 y:0.99 z:0.]
|
2063
|
+
# 0060: 31 30 20 41 3a 32 36 39 2e 32 20 48 3a 32 34 35 [10 A:269.2 H:245]
|
2064
|
+
# 0070: 2e 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [.5..............]
|
2065
|
+
($yr,$mon,$day,$hr,$min,$sec) = ($1,$2,$3,$4,$5,$6);
|
2066
|
+
$$dataPt =~ s/\0+$//; # remove trailing nulls
|
2067
|
+
my @a = split ' ', substr($$dataPt,43);
|
2068
|
+
$ddd = 1;
|
2069
|
+
foreach (@a) {
|
2070
|
+
unless (/^([A-Z]):([-+]?\d+(\.\d+)?)$/i) {
|
2071
|
+
# (the "km/h" after spd is display units? because the value is stored in knots)
|
2072
|
+
defined $lon and not defined $spd and /^\d+\.\d+$/ and $spd = $_ * $knotsToKph;
|
2073
|
+
next;
|
2074
|
+
}
|
2075
|
+
($1 eq 'N' or $1 eq 'S') and $lat = $2, $latRef = $1, next;
|
2076
|
+
($1 eq 'E' or $1 eq 'W') and $lon = $2, $lonRef = $1, next;
|
2077
|
+
($1 eq 'x' or $1 eq 'y' or $1 eq 'z') and push(@acc,$2), next;
|
2078
|
+
$1 eq 'A' and $trk = $2, next; # (verified, but why 'A'?)
|
2079
|
+
# seen 'H' - one might expect altitude ('H'eight), but it doesn't fit
|
2080
|
+
# the sample data, so save all other information as an "Unknown_X" tag
|
2081
|
+
$$tagTbl{$1} or AddTagToTable($tagTbl, $1, { Name => "Unknown_$1", Unknown => 1 });
|
2082
|
+
push(@xtra, $1 => $2), next;
|
2083
|
+
}
|
2084
|
+
|
2085
|
+
} else {
|
2086
|
+
|
2087
|
+
$debug and $et->FoundTag(GPSType => 17);
|
2033
2088
|
# (look for binary GPS as stored by Nextbase 512G, ref PH)
|
2034
2089
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
|
2035
2090
|
# 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
|
@@ -2093,7 +2148,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2093
2148
|
my $time = sprintf('%.2d:%.2d:%sZ',$hr,$min,$sec);
|
2094
2149
|
$et->HandleTag($tagTbl, GPSTimeStamp => $time);
|
2095
2150
|
}
|
2096
|
-
if (defined $lat) {
|
2151
|
+
if (defined $lat and defined $lon) {
|
2097
2152
|
# lat/long are in DDDMM.MMMM format unless $ddd is set
|
2098
2153
|
ConvertLatLon($lat, $lon) unless $ddd;
|
2099
2154
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
@@ -2658,6 +2713,53 @@ sub ProcessRIFFTrailer($$$)
|
|
2658
2713
|
return 1;
|
2659
2714
|
}
|
2660
2715
|
|
2716
|
+
#------------------------------------------------------------------------------
|
2717
|
+
# Process Kenwood Dashcam trailer (forum16229)
|
2718
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
2719
|
+
# Returns: 1 on success
|
2720
|
+
# Sample data (chained 512-byte records starting like this):
|
2721
|
+
# 0000: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 47 50 [CCCCCCCCCCCCCCGP]
|
2722
|
+
# 0010: 53 44 41 54 41 2d 2d 32 30 32 34 30 37 31 31 31 [SDATA--202407111]
|
2723
|
+
# 0020: 32 30 34 31 32 4e 35 30 2e 36 31 32 33 38 36 30 [20412N50.6123860]
|
2724
|
+
# 0030: 36 37 37 45 38 2e 37 30 32 37 31 38 30 39 38 39 [677E8.7027180989]
|
2725
|
+
# 0040: 35 33 33 2e 30 30 30 30 30 30 30 30 30 30 30 30 [533.000000000000]
|
2726
|
+
# 0050: 2e 30 30 30 30 30 30 30 30 30 30 30 30 30 2e 30 [.0000000000000.0]
|
2727
|
+
# 0060: 31 39 39 39 39 39 39 39 35 35 33 2d 30 2e 30 39 [19999999553-0.09]
|
2728
|
+
# 0070: 30 30 30 30 30 30 33 35 37 2d 30 2e 31 34 30 30 [000000357-0.1400]
|
2729
|
+
# 0080: 30 30 30 30 30 35 39 47 50 53 44 41 54 41 2d 2d [0000059GPSDATA--]
|
2730
|
+
sub ProcessKenwoodTrailer($$$)
|
2731
|
+
{
|
2732
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
2733
|
+
my $raf = $$dirInfo{RAF};
|
2734
|
+
my $buff;
|
2735
|
+
# current file position is 8 bytes into the 14 C's, so test the next 6:
|
2736
|
+
$raf->Read($buff, 14) and $buff eq 'CCCCCCCCCCCCCC' or return 0;
|
2737
|
+
$et->VerboseDir('Kenwood trailer', undef, undef);
|
2738
|
+
unless ($$et{OPTIONS}{ExtractEmbedded}) {
|
2739
|
+
$et->WarnOnce('Use the ExtractEmbedded option to extract timed GPSData from Kenwood trailer',3);
|
2740
|
+
return 1;
|
2741
|
+
}
|
2742
|
+
while ($raf->Read($buff, 121) and $buff =~ /^GPSDATA--(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/) {
|
2743
|
+
FoundSomething($et, $tagTbl);
|
2744
|
+
$et->HandleTag($tagTbl, GPSDateTime => "$1:$2:$3 $4:$5:$6");
|
2745
|
+
my $i = 9 + 14;
|
2746
|
+
my ($val, @acc, $tag);
|
2747
|
+
foreach $tag (qw(GPSLatitude GPSLongitude GPSSpeed unk acc acc acc)) {
|
2748
|
+
$val = substr($buff, $i, 14); $i += 14;
|
2749
|
+
next if $tag eq 'unk';
|
2750
|
+
my $hemi;
|
2751
|
+
$hemi = $1 if $val =~ s/^([NSEW])//;
|
2752
|
+
$val =~ /^[-+]?\d+\.\d+$/ or next;
|
2753
|
+
$tag eq 'acc' and push(@acc,$val), next;
|
2754
|
+
$val = -$val if $hemi and ($hemi eq 'S' or $hemi eq 'W');
|
2755
|
+
$et->HandleTag($tagTbl, $tag => $val);
|
2756
|
+
}
|
2757
|
+
$et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc == 3;
|
2758
|
+
}
|
2759
|
+
delete $$et{DOC_NUM};
|
2760
|
+
return 1;
|
2761
|
+
}
|
2762
|
+
|
2661
2763
|
#------------------------------------------------------------------------------
|
2662
2764
|
# Process 'gps ' atom containing NMEA from Pittasoft Blackvue dashcam (ref PH)
|
2663
2765
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -3331,6 +3433,7 @@ sub ScanMediaData($)
|
|
3331
3433
|
}
|
3332
3434
|
my $dirInfo = { DataPt => \$buff, DataPos => $pos + $dataPos, DirLen => $len };
|
3333
3435
|
ProcessFreeGPS($et, $dirInfo, $tagTbl);
|
3436
|
+
$$et{FoundGPSByScan} = 1;
|
3334
3437
|
}
|
3335
3438
|
$pos += $len;
|
3336
3439
|
$buf2 = substr($buff, $len);
|
@@ -30,7 +30,7 @@ use strict;
|
|
30
30
|
use vars qw($VERSION $AUTOLOAD);
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
|
33
|
-
$VERSION = '1.
|
33
|
+
$VERSION = '1.68';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -2041,11 +2041,16 @@ sub ProcessRIFF($$)
|
|
2041
2041
|
last unless $moviEnd;
|
2042
2042
|
# we arrived here because there was a problem parsing the movie data
|
2043
2043
|
# so seek to the end to continue processing
|
2044
|
-
if ($moviEnd > 0x7fffffff
|
2045
|
-
$et->
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
2044
|
+
if ($moviEnd > 0x7fffffff) {
|
2045
|
+
unless ($et->Options('LargeFileSupport')) {
|
2046
|
+
$et->Warn('Possibly corrupt LIST_movi data');
|
2047
|
+
$et->Warn('Stopped parsing at large LIST_movi chunk (LargeFileSupport not set)');
|
2048
|
+
undef $err;
|
2049
|
+
last;
|
2050
|
+
}
|
2051
|
+
if ($et->Options('LargeFileSupport') eq '2') {
|
2052
|
+
$et->WarnOnce('Processing large chunk (LargeFileSupport is 2)');
|
2053
|
+
}
|
2049
2054
|
}
|
2050
2055
|
if ($validate) {
|
2051
2056
|
# (must actually try to read something after seeking to detect error)
|
@@ -2159,10 +2164,15 @@ sub ProcessRIFF($$)
|
|
2159
2164
|
$moviEnd = $raf->Tell() + $len2;
|
2160
2165
|
next; # parse into movi chunk
|
2161
2166
|
} elsif (not $rewind) {
|
2162
|
-
if ($len > 0x7fffffff
|
2163
|
-
|
2164
|
-
|
2165
|
-
|
2167
|
+
if ($len > 0x7fffffff) {
|
2168
|
+
unless ($et->Options('LargeFileSupport')) {
|
2169
|
+
$tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
|
2170
|
+
$et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
|
2171
|
+
last;
|
2172
|
+
}
|
2173
|
+
if ($et->Options('LargeFileSupport') eq '2') {
|
2174
|
+
$et->WarnOnce('Processing large chunk (LargeFileSupport is 2)');
|
2175
|
+
}
|
2166
2176
|
}
|
2167
2177
|
if ($validate and $len2) {
|
2168
2178
|
# (must actually try to read something after seeking to detect error)
|
@@ -22,13 +22,13 @@ use vars qw($VERSION %samsungLensTypes);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.57';
|
26
26
|
|
27
27
|
sub WriteSTMN($$$);
|
28
28
|
sub ProcessINFO($$$);
|
29
29
|
sub ProcessSamsungMeta($$$);
|
30
30
|
sub ProcessSamsungIFD($$$);
|
31
|
-
sub ProcessSamsung(
|
31
|
+
sub ProcessSamsung($$;$);
|
32
32
|
|
33
33
|
# Samsung LensType lookup
|
34
34
|
%samsungLensTypes = (
|
@@ -943,25 +943,25 @@ my %formatMinMax = (
|
|
943
943
|
);
|
944
944
|
|
945
945
|
# information extracted from Samsung trailer (ie. Samsung SM-T805 "Sound & Shot" JPEG) (ref PH)
|
946
|
+
# NOTE: These tags may use $$self{SamsungTagName} in a Condition statement
|
947
|
+
# if necessary to differentiate tags with the same ID but different names
|
946
948
|
%Image::ExifTool::Samsung::Trailer = (
|
947
949
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
|
948
950
|
VARS => { NO_ID => 1, HEX_ID => 0 },
|
949
951
|
PROCESS_PROC => \&ProcessSamsung,
|
952
|
+
TAG_PREFIX => 'SamsungTrailer',
|
950
953
|
PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)
|
951
954
|
NOTES => q{
|
952
|
-
Tags extracted from the trailer of JPEG images written when
|
953
|
-
features (such as "Sound & Shot" or "Shot & More") from
|
954
|
-
as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
955
|
-
|
956
|
-
},
|
957
|
-
'0x0001-name' => {
|
958
|
-
Name => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
|
959
|
-
RawConv => '$$self{EmbeddedImageName} = $val',
|
955
|
+
Tags extracted from the SEFT trailer of JPEG and PNG images written when
|
956
|
+
using certain features (such as "Sound & Shot" or "Shot & More") from
|
957
|
+
Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
958
|
+
HEIC images from models such as the S10+.
|
960
959
|
},
|
960
|
+
'0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
|
961
961
|
'0x0001' => [
|
962
962
|
{
|
963
963
|
Name => 'EmbeddedImage',
|
964
|
-
Condition => '$$self{
|
964
|
+
Condition => '$$self{SamsungTagName} ne "DualShot_2"',
|
965
965
|
Groups => { 2 => 'Preview' },
|
966
966
|
Binary => 1,
|
967
967
|
},
|
@@ -1277,8 +1277,10 @@ my %formatMinMax = (
|
|
1277
1277
|
# 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
|
1278
1278
|
# 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086
|
1279
1279
|
# 0x0bf0-name - seen 'Remaster_Info' #forum16086
|
1280
|
+
'0x0bf0' => 'RemasterInfo', #forum16086/16242
|
1280
1281
|
# 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086
|
1281
1282
|
# 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086
|
1283
|
+
'0x0c51' => 'SamsungCaptureInfo', #forum16086/16242
|
1282
1284
|
# 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086
|
1283
1285
|
# 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086
|
1284
1286
|
# 0x0c81-name - seen 'Watermark_Info' #forum16086
|
@@ -1289,7 +1291,11 @@ my %formatMinMax = (
|
|
1289
1291
|
# 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086
|
1290
1292
|
# 0x0d21-name - seen 'Camera_Scene_Info' #forum16086
|
1291
1293
|
# 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086
|
1292
|
-
|
1294
|
+
'0x0d91' => { #forum16086/16242
|
1295
|
+
Name => 'PEg_Info',
|
1296
|
+
Description => 'PEg Info',
|
1297
|
+
SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
|
1298
|
+
},
|
1293
1299
|
# 0x0da1-name - seen 'Captured_App_Info' #forum16086
|
1294
1300
|
# 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
|
1295
1301
|
# 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
|
@@ -1563,7 +1569,7 @@ sub ProcessSamsungIFD($$$)
|
|
1563
1569
|
# Returns: 1 on success, 0 not valid Samsung trailer, or -1 error writing
|
1564
1570
|
# - updates DataPos to point to start of Samsung trailer
|
1565
1571
|
# - updates DirLen to existing trailer length
|
1566
|
-
sub ProcessSamsung(
|
1572
|
+
sub ProcessSamsung($$;$)
|
1567
1573
|
{
|
1568
1574
|
my ($et, $dirInfo) = @_;
|
1569
1575
|
my $raf = $$dirInfo{RAF};
|
@@ -1653,8 +1659,13 @@ SamBlock:
|
|
1653
1659
|
$audioSize = $size - 8 - $len;
|
1654
1660
|
next;
|
1655
1661
|
}
|
1656
|
-
|
1662
|
+
last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size;
|
1663
|
+
# (could validate the first 4 bytes of the block because they
|
1664
|
+
# are the same as the first 4 bytes of the directory entry)
|
1665
|
+
$len = Get32u(\$buf2, 4);
|
1666
|
+
last if $len + 8 > $size;
|
1657
1667
|
my $tag = sprintf("0x%.4x", $type);
|
1668
|
+
# add unknown tags if necessary
|
1658
1669
|
unless ($$tagTablePtr{$tag}) {
|
1659
1670
|
next unless $unknown or $verbose;
|
1660
1671
|
my %tagInfo = (
|
@@ -1673,11 +1684,8 @@ SamBlock:
|
|
1673
1684
|
);
|
1674
1685
|
AddTagToTable($tagTablePtr, "$tag-name", \%tagInfo2);
|
1675
1686
|
}
|
1676
|
-
|
1677
|
-
|
1678
|
-
# are the same as the first 4 bytes of the directory entry)
|
1679
|
-
$len = Get32u(\$buf2, 4);
|
1680
|
-
last if $len + 8 > $size;
|
1687
|
+
# set SamsungTagName ExifTool member for use in tag Condition
|
1688
|
+
$$et{SamsungTagName} = substr($buf2, 8, $len);
|
1681
1689
|
# extract tag name and value
|
1682
1690
|
$et->HandleTag($tagTablePtr, "$tag-name", undef,
|
1683
1691
|
DataPt => \$buf2,
|
@@ -1691,6 +1699,7 @@ SamBlock:
|
|
1691
1699
|
Start => 8 + $len,
|
1692
1700
|
Size => $size - (8 + $len),
|
1693
1701
|
);
|
1702
|
+
delete $$et{SamsungTagName};
|
1694
1703
|
}
|
1695
1704
|
if ($outfile) {
|
1696
1705
|
last unless $raf->Seek($dataPos, 0) and $raf->Read($buff, $dirLen) == $dirLen;
|
@@ -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.69';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -169,6 +169,7 @@ sub PrintInvLensSpec($;$$);
|
|
169
169
|
32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
|
170
170
|
32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
|
171
171
|
32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
|
172
|
+
32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR
|
172
173
|
|
173
174
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
174
175
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
@@ -239,6 +240,7 @@ sub PrintInvLensSpec($;$$);
|
|
239
240
|
49474.8 => 'Viltrox 50mm F1.8 FE', #JR
|
240
241
|
49474.9 => 'Viltrox 75mm F1.2 E', #JR
|
241
242
|
'49474.10' => 'Viltrox 20mm F2.8 FE', #JR
|
243
|
+
49475 => 'Tamron 50-300mm F4.5-6.3 Di III VC VXD', #JR (Model A069)
|
242
244
|
|
243
245
|
49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
|
244
246
|
49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
|
@@ -292,15 +294,18 @@ sub PrintInvLensSpec($;$$);
|
|
292
294
|
50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
|
293
295
|
50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
|
294
296
|
50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
|
297
|
+
50545 => 'Sigma 24-70mm F2.8 DG DN II | A', #JR (024)
|
295
298
|
50546 => 'Sigma 500mm F5.6 DG DN OS | S', #JR (024)
|
296
299
|
50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
|
297
300
|
50548 => 'Sigma 15mm F1.4 DG DN DIAGONAL FISHEYE | A', #JR (024)
|
301
|
+
50549 => 'Sigma 50mm F1.2 DG DN | A', #JR (024)
|
302
|
+
50551 => 'Sigma 28-45mm F1.8 DG DN | A', #JR (024)
|
298
303
|
|
299
304
|
50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
|
300
305
|
50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
|
301
306
|
50994 => 'Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III', #IB
|
302
307
|
50995 => 'Voigtlander MACRO APO-LANTHAR 65mm F2 Aspherical', #JR
|
303
|
-
50996 => 'Voigtlander NOKTON 40mm F1.2 Aspherical', #JR
|
308
|
+
50996 => 'Voigtlander NOKTON 40mm F1.2 Aspherical', #JR (also SE version)
|
304
309
|
50997 => 'Voigtlander NOKTON classic 35mm F1.4', #JR
|
305
310
|
50998 => 'Voigtlander MACRO APO-LANTHAR 110mm F2.5', #JR
|
306
311
|
50999 => 'Voigtlander COLOR-SKOPAR 21mm F3.5 Aspherical', #IB
|
@@ -309,6 +314,7 @@ sub PrintInvLensSpec($;$$);
|
|
309
314
|
51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR
|
310
315
|
51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR
|
311
316
|
51006 => 'Voigtlander APO-LANTHAR 35mm F2 Aspherical', #JR
|
317
|
+
51007 => 'Voigtlander NOKTON 50mm F1 Aspherical', #JR
|
312
318
|
|
313
319
|
# lenses listed in the Sigma MC-11 list, but not yet seen:
|
314
320
|
# 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
|
@@ -330,6 +336,8 @@ sub PrintInvLensSpec($;$$);
|
|
330
336
|
51516 => 'Samyang AF 24-70mm F2.8', #JR
|
331
337
|
51517 => 'Samyang AF 50mm F1.4 II', #JR
|
332
338
|
51518 => 'Samyang AF 135mm F1.8', #JR
|
339
|
+
|
340
|
+
61569 => 'LAOWA FFII 10mm F2.8 C&D Dreamer', #JR
|
333
341
|
);
|
334
342
|
|
335
343
|
# ExposureProgram values (ref PH, mainly decoded from A200)
|
@@ -1713,7 +1721,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1713
1721
|
},
|
1714
1722
|
},{
|
1715
1723
|
Name => 'Tag9050d',
|
1716
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-E1)\b/',
|
1724
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/',
|
1717
1725
|
SubDirectory => {
|
1718
1726
|
TagTable => 'Image::ExifTool::Sony::Tag9050d',
|
1719
1727
|
ByteOrder => 'LittleEndian',
|
@@ -1975,7 +1983,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1975
1983
|
},
|
1976
1984
|
0x940c => [{
|
1977
1985
|
Name => 'Tag940c',
|
1978
|
-
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10|ZV-E1)\b/',
|
1986
|
+
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10|ZV-E10M2|ZV-E1)\b/',
|
1979
1987
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' },
|
1980
1988
|
},{
|
1981
1989
|
Name => 'Sony_0x940c',
|
@@ -2151,6 +2159,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2151
2159
|
395 => 'ZV-1M2', #JR
|
2152
2160
|
396 => 'ILCE-7CR', #JR
|
2153
2161
|
397 => 'ILCE-7CM2', #JR
|
2162
|
+
398 => 'ILX-LR1', #JR
|
2163
|
+
399 => 'ZV-E10M2', #JR
|
2154
2164
|
},
|
2155
2165
|
},
|
2156
2166
|
0xb020 => { #2
|
@@ -8201,7 +8211,7 @@ my %isoSetting2010 = (
|
|
8201
8211
|
# number of mechanical shutter actuations, does not increase during electronic shutter / Silent Shooting
|
8202
8212
|
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR))/',
|
8203
8213
|
Format => 'int32u',
|
8204
|
-
Notes => 'total number of
|
8214
|
+
Notes => 'total number of mechanical shutter actuations',
|
8205
8215
|
RawConv => '$val & 0x00ffffff',
|
8206
8216
|
PrintConv => 'sprintf("%6d",$val)',
|
8207
8217
|
PrintConvInv => '$val',
|
@@ -8228,6 +8238,7 @@ my %isoSetting2010 = (
|
|
8228
8238
|
},
|
8229
8239
|
0x0038 => {
|
8230
8240
|
Name => 'InternalSerialNumber', #(NC)
|
8241
|
+
Condition => '$$self{Model} !~ /^(ZV-E10M2)/',
|
8231
8242
|
Format => 'int8u[6]',
|
8232
8243
|
PrintConv => 'unpack "H*", pack "C*", split " ", $val',
|
8233
8244
|
},
|
@@ -8459,7 +8470,7 @@ my %isoSetting2010 = (
|
|
8459
8470
|
},
|
8460
8471
|
0x002a => [{
|
8461
8472
|
Name => 'Quality2',
|
8462
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8473
|
+
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
|
8463
8474
|
PrintConv => {
|
8464
8475
|
0 => 'JPEG',
|
8465
8476
|
1 => 'RAW',
|
@@ -8484,7 +8495,7 @@ my %isoSetting2010 = (
|
|
8484
8495
|
# },
|
8485
8496
|
0x0053 => {
|
8486
8497
|
Name => 'ModelReleaseYear',
|
8487
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8498
|
+
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
|
8488
8499
|
Format => 'int8u',
|
8489
8500
|
PrintConv => 'sprintf("20%.2d", $val)',
|
8490
8501
|
},
|
@@ -9530,7 +9541,6 @@ my %isoSetting2010 = (
|
|
9530
9541
|
Name => 'FocusMode',
|
9531
9542
|
Condition => '$$self{Model} =~ /^ILCA-/',
|
9532
9543
|
Notes => 'ILCA models only',
|
9533
|
-
Writable => 'int8u',
|
9534
9544
|
Priority => 0,
|
9535
9545
|
PrintConv => {
|
9536
9546
|
0 => 'Manual',
|
@@ -9855,7 +9865,7 @@ my %isoSetting2010 = (
|
|
9855
9865
|
WRITE_PROC => \&WriteEnciphered,
|
9856
9866
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
9857
9867
|
FORMAT => 'int8u',
|
9858
|
-
NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.',
|
9868
|
+
NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1/E10M2.',
|
9859
9869
|
FIRST_ENTRY => 0,
|
9860
9870
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
9861
9871
|
0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
|
@@ -10018,7 +10028,7 @@ my %isoSetting2010 = (
|
|
10018
10028
|
},
|
10019
10029
|
0x089d => { # Note: 32 values for these newer models, and 32 non-zero values present for new lenses like SEL2470GM2 and SEL2070G
|
10020
10030
|
Name => 'VignettingCorrParams',
|
10021
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-E1)\b/',
|
10031
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10022
10032
|
Format => 'int16s[32]',
|
10023
10033
|
},
|
10024
10034
|
0x08b5 => {
|
@@ -10057,7 +10067,7 @@ my %isoSetting2010 = (
|
|
10057
10067
|
},
|
10058
10068
|
0x0945 => {
|
10059
10069
|
Name => 'ChromaticAberrationCorrParams',
|
10060
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-E1)\b/',
|
10070
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10061
10071
|
Format => 'int16s[32]',
|
10062
10072
|
},
|
10063
10073
|
);
|