exiftool_vendored 12.68.0 → 12.70.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 +63 -15
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +13 -13
- data/bin/lib/Image/ExifTool/CBOR.pm +18 -2
- data/bin/lib/Image/ExifTool/Canon.pm +68 -16
- data/bin/lib/Image/ExifTool/DJI.pm +3 -2
- data/bin/lib/Image/ExifTool/DNG.pm +25 -2
- data/bin/lib/Image/ExifTool/EXE.pm +54 -6
- data/bin/lib/Image/ExifTool/Exif.pm +175 -14
- data/bin/lib/Image/ExifTool/FujiFilm.pm +142 -20
- data/bin/lib/Image/ExifTool/GIF.pm +5 -1
- data/bin/lib/Image/ExifTool/ID3.pm +70 -7
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +58 -18
- data/bin/lib/Image/ExifTool/Olympus.pm +7 -1
- data/bin/lib/Image/ExifTool/PNG.pm +8 -13
- data/bin/lib/Image/ExifTool/Panasonic.pm +15 -2
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +32 -5
- data/bin/lib/Image/ExifTool/README +14 -5
- data/bin/lib/Image/ExifTool/RIFF.pm +60 -10
- data/bin/lib/Image/ExifTool/Sony.pm +95 -34
- data/bin/lib/Image/ExifTool/TagLookup.pm +6937 -6714
- data/bin/lib/Image/ExifTool/TagNames.pod +812 -332
- data/bin/lib/Image/ExifTool/Text.pm +4 -5
- data/bin/lib/Image/ExifTool/Validate.pm +23 -20
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
- data/bin/lib/Image/ExifTool/WriteExif.pl +14 -4
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +31 -6
- data/bin/lib/Image/ExifTool/Writer.pl +40 -14
- data/bin/lib/Image/ExifTool/XMP.pm +67 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +35 -0
- data/bin/lib/Image/ExifTool.pm +79 -40
- data/bin/lib/Image/ExifTool.pod +9 -3
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -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.89';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -638,6 +638,33 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
638
638
|
Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
|
639
639
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
|
640
640
|
},
|
641
|
+
{ #https://c2pa.org/specifications/
|
642
|
+
Name => 'JUMBF',
|
643
|
+
Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}manifest\0/s',
|
644
|
+
Deletable => 1,
|
645
|
+
SubDirectory => {
|
646
|
+
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
647
|
+
# 16 bytes uuid
|
648
|
+
# +4 bytes 0
|
649
|
+
# +9 bytes "manifest\0"
|
650
|
+
# +8 bytes absolute(!!!) offset to C2PA uuid "merkle\0" box
|
651
|
+
# =37 bytes total
|
652
|
+
Start => 37,
|
653
|
+
},
|
654
|
+
},
|
655
|
+
{ #https://c2pa.org/specifications/ (NC)
|
656
|
+
Name => 'CBOR',
|
657
|
+
Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}merkle\0/s',
|
658
|
+
Deletable => 1, # (NC)
|
659
|
+
SubDirectory => {
|
660
|
+
TagTable => 'Image::ExifTool::CBOR::Main',
|
661
|
+
# 16 bytes uuid
|
662
|
+
# +4 bytes 0
|
663
|
+
# +7 bytes "merkle\0"
|
664
|
+
# =27 bytes total
|
665
|
+
Start => 27,
|
666
|
+
},
|
667
|
+
},
|
641
668
|
{
|
642
669
|
Name => 'SensorData',
|
643
670
|
Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
|
@@ -9502,9 +9529,9 @@ sub ProcessMOV($$;$)
|
|
9502
9529
|
$et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
|
9503
9530
|
}
|
9504
9531
|
# stop processing at mdat/idat if -fast2 is used
|
9505
|
-
last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
|
9532
|
+
last if $fast > 1 and ($tag eq 'mdat' or ($tag eq 'idat' and $$et{FileType} ne 'HEIC'));
|
9506
9533
|
# load values only if associated with a tag (or verbose) and not too big
|
9507
|
-
if ($size > 0x2000000) { # start to get worried above 32
|
9534
|
+
if ($size > 0x2000000) { # start to get worried above 32 MiB
|
9508
9535
|
# check for RIFF trailer (written by Auto-Vox dashcam)
|
9509
9536
|
if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
|
9510
9537
|
$et->VPrint(0, "Found RIFF trailer");
|
@@ -9521,9 +9548,9 @@ sub ProcessMOV($$;$)
|
|
9521
9548
|
if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
|
9522
9549
|
my $t = PrintableTagID($tag,2);
|
9523
9550
|
if ($size > 0x8000000) {
|
9524
|
-
$et->Warn("Skipping '${t}' atom > 128
|
9551
|
+
$et->Warn("Skipping '${t}' atom > 128 MiB", 1);
|
9525
9552
|
} else {
|
9526
|
-
$et->Warn("Skipping '${t}' atom > 32
|
9553
|
+
$et->Warn("Skipping '${t}' atom > 32 MiB", 2) or $ignore = 0;
|
9527
9554
|
}
|
9528
9555
|
}
|
9529
9556
|
}
|
@@ -343,9 +343,10 @@ numerical, and generated automatically otherwise.
|
|
343
343
|
but applied automatically to individual tags. Value specifies
|
344
344
|
pattern for split, or 1 for default pattern ',?\\s+'.
|
345
345
|
|
346
|
-
'Avoid' - avoid creating this tag if possible.
|
347
|
-
effective if another tag exists with the same
|
348
|
-
this flag also sets the default Priority to 0
|
346
|
+
'Avoid' - avoid creating this tag when writing if possible.
|
347
|
+
This is only effective if another tag exists with the same
|
348
|
+
name. Setting this flag also sets the default Priority to 0
|
349
|
+
for this tag.
|
349
350
|
|
350
351
|
'Binary' - set to 1 for binary data. This has the same effect
|
351
352
|
as setting ValueConv to '\$val', but it it a bit cleaner and
|
@@ -615,9 +616,9 @@ numerical, and generated automatically otherwise.
|
|
615
616
|
arguments: the value, a flag which is set for the inverse
|
616
617
|
conversion, and a reference to the PrintConv hash, and returns
|
617
618
|
the converted value or undef on error -- it may call warn() to
|
618
|
-
return an error message.
|
619
|
+
return an error message. The lookup hash may also contain a
|
619
620
|
'Notes' entry which is used for documentation if the
|
620
|
-
SeparateTable flag is set).
|
621
|
+
SeparateTable flag is set). In an expression, $self is a
|
621
622
|
reference to the current ExifTool object, $val is the Raw
|
622
623
|
value, and $tag is the tag key. The subroutine takes 2
|
623
624
|
arguments: the Raw value and a reference to the current
|
@@ -893,6 +894,11 @@ numerical, and generated automatically otherwise.
|
|
893
894
|
writing this tag. Only needed if tag can be written to
|
894
895
|
groups other than the normal groups for this tag (very rare).
|
895
896
|
|
897
|
+
Deletable : [Writable SubDirectory's only] Overrides internal test for
|
898
|
+
metadata types with permanent directories (currently QuickTime
|
899
|
+
and Jpeg2000), allowing the tag containing these directories
|
900
|
+
to be deleted
|
901
|
+
|
896
902
|
OffsetPair : Used in EXIF table to specify the tagID for the corresponding
|
897
903
|
offset or length tag.
|
898
904
|
|
@@ -917,6 +923,9 @@ numerical, and generated automatically otherwise.
|
|
917
923
|
FixedSize : [EXIF only] Hack to ignore value size and use this instead.
|
918
924
|
Only valid if Format is also defined.
|
919
925
|
|
926
|
+
TruncateOK : [EXIF only] Hack to demote a truncated value in an IFD to a
|
927
|
+
minor error.
|
928
|
+
|
920
929
|
Struct : [XMP tags only] Reference to structure hash for structured XMP
|
921
930
|
tags. See "STRUCTURES" section below for more details. (For
|
922
931
|
backward compatibility, this may be a name to an entry in
|
@@ -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.67';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -500,6 +500,11 @@ my %code2charset = (
|
|
500
500
|
Name => 'OldXMP',
|
501
501
|
Binary => 1,
|
502
502
|
},
|
503
|
+
C2PA => { #https://c2pa.org/specifications/
|
504
|
+
Name => 'JUMBF',
|
505
|
+
Deletable => 1,
|
506
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
|
507
|
+
},
|
503
508
|
olym => {
|
504
509
|
Name => 'Olym',
|
505
510
|
SubDirectory => { TagTable => 'Image::ExifTool::Olympus::WAV' },
|
@@ -555,7 +560,7 @@ my %code2charset = (
|
|
555
560
|
},
|
556
561
|
},{ # (WebP) - have also seen with "Exif\0\0" header - PH
|
557
562
|
Name => 'EXIF',
|
558
|
-
Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and $self->Warn("Improper EXIF header",1)',
|
563
|
+
Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and ($self->Warn("Improper EXIF header",1) or 1)',
|
559
564
|
SubDirectory => {
|
560
565
|
TagTable => 'Image::ExifTool::Exif::Main',
|
561
566
|
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
@@ -570,6 +575,12 @@ my %code2charset = (
|
|
570
575
|
Notes => 'WebP files',
|
571
576
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
|
572
577
|
},
|
578
|
+
"XMP\0" => {
|
579
|
+
Name => 'XMP',
|
580
|
+
Notes => 'incorrectly written WebP files',
|
581
|
+
Condition => '$self->Warn("Incorrect XMP tag ID", 1) or 1',
|
582
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
|
583
|
+
},
|
573
584
|
ICCP => { #14 (WebP)
|
574
585
|
Name => 'ICC_Profile',
|
575
586
|
Notes => 'WebP files',
|
@@ -1063,7 +1074,16 @@ my %code2charset = (
|
|
1063
1074
|
},
|
1064
1075
|
1 => {
|
1065
1076
|
Name => 'MaxDataRate',
|
1066
|
-
|
1077
|
+
Notes => q{
|
1078
|
+
converted using SI byte prefixes unles the API ByteUnit option is set to
|
1079
|
+
"Binary"
|
1080
|
+
},
|
1081
|
+
PrintConv => q{
|
1082
|
+
my ($unit, $div) = $self->Options('ByteUnit') eq 'Binary' ? ('KiB/s',1024) : ('kB/s',1000);
|
1083
|
+
my $tmp = $val / $div;
|
1084
|
+
$tmp > 9999 and $tmp /= $div, $unit =~ s/^./M/;
|
1085
|
+
sprintf('%.4g %s', $tmp, $unit);
|
1086
|
+
},
|
1067
1087
|
},
|
1068
1088
|
# 2 => 'PaddingGranularity',
|
1069
1089
|
# 3 => 'Flags',
|
@@ -1983,7 +2003,7 @@ sub ProcessRIFF($$)
|
|
1983
2003
|
{
|
1984
2004
|
my ($et, $dirInfo) = @_;
|
1985
2005
|
my $raf = $$dirInfo{RAF};
|
1986
|
-
my ($buff, $buf2, $type, $mime, $err, $rf64);
|
2006
|
+
my ($buff, $buf2, $type, $mime, $err, $rf64, $moviEnd);
|
1987
2007
|
my $verbose = $et->Options('Verbose');
|
1988
2008
|
my $unknown = $et->Options('Unknown');
|
1989
2009
|
my $validate = $et->Options('Validate');
|
@@ -2017,8 +2037,34 @@ sub ProcessRIFF($$)
|
|
2017
2037
|
# Read chunks in RIFF image
|
2018
2038
|
#
|
2019
2039
|
for (;;) {
|
2040
|
+
if ($err) {
|
2041
|
+
last unless $moviEnd;
|
2042
|
+
# we arrived here because there was a problem parsing the movie data
|
2043
|
+
# so seek to the end to continue processing
|
2044
|
+
if ($moviEnd > 0x7fffffff and not $et->Options('LargeFileSupport')) {
|
2045
|
+
$et->Warn('Possibly corrupt LIST_movi data');
|
2046
|
+
$et->Warn('Stopped parsing at large LIST_movi chunk (LargeFileSupport not set)');
|
2047
|
+
undef $err;
|
2048
|
+
last;
|
2049
|
+
}
|
2050
|
+
if ($validate) {
|
2051
|
+
# (must actually try to read something after seeking to detect error)
|
2052
|
+
$raf->Seek($moviEnd-1, 0) and $raf->Read($buff, 1) == 1 or last;
|
2053
|
+
} else {
|
2054
|
+
$raf->Seek($moviEnd, 0) or last;
|
2055
|
+
}
|
2056
|
+
$pos = $moviEnd;
|
2057
|
+
$et->Warn('Possibly corrupt LIST_movi data');
|
2058
|
+
undef $err;
|
2059
|
+
undef $moviEnd;
|
2060
|
+
}
|
2061
|
+
if ($moviEnd) {
|
2062
|
+
$pos > $moviEnd and $err = 1, next; # error if we parsed past the end of the movie data
|
2063
|
+
undef $moviEnd if $pos == $moviEnd; # parsed all movie data?
|
2064
|
+
}
|
2020
2065
|
my $num = $raf->Read($buff, 8);
|
2021
2066
|
if ($num < 8) {
|
2067
|
+
$moviEnd and $err = 1, next;
|
2022
2068
|
$err = 1 if $num;
|
2023
2069
|
$et->Warn('Incorrect RIFF chunk size' . " $pos vs. $riffEnd") if $validate and $pos != $riffEnd;
|
2024
2070
|
last;
|
@@ -2029,7 +2075,7 @@ sub ProcessRIFF($$)
|
|
2029
2075
|
$et->OverrideFileType('Extended WEBP',undef,'webp') if $tag eq 'VP8X' and $type eq 'WEBP';
|
2030
2076
|
# special case: construct new tag name from specific LIST type
|
2031
2077
|
if ($tag eq 'LIST') {
|
2032
|
-
$raf->Read($buff, 4) == 4 or $err=1,
|
2078
|
+
$raf->Read($buff, 4) == 4 or $err=1, next;
|
2033
2079
|
$pos += 4;
|
2034
2080
|
$tag .= "_$buff";
|
2035
2081
|
$len -= 4; # already read 4 bytes (the LIST type)
|
@@ -2038,6 +2084,7 @@ sub ProcessRIFF($$)
|
|
2038
2084
|
}
|
2039
2085
|
$et->VPrint(0, "RIFF '${tag}' chunk ($len bytes of data):\n");
|
2040
2086
|
if ($len <= 0) {
|
2087
|
+
$moviEnd and $err = 1, next;
|
2041
2088
|
if ($len < 0) {
|
2042
2089
|
$et->Warn('Invalid chunk length');
|
2043
2090
|
} elsif ($tag eq "\0\0\0\0") {
|
@@ -2068,7 +2115,7 @@ sub ProcessRIFF($$)
|
|
2068
2115
|
my $tagInfo = $$tagTbl{$tag};
|
2069
2116
|
# (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
|
2070
2117
|
if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
|
2071
|
-
$raf->Read($buff, $len2) == $len2 or $err=1,
|
2118
|
+
$raf->Read($buff, $len2) == $len2 or $err=1, next;
|
2072
2119
|
if ($hash and $isImageData{$tag}) {
|
2073
2120
|
$hash->add($buff);
|
2074
2121
|
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
|
@@ -2094,7 +2141,7 @@ sub ProcessRIFF($$)
|
|
2094
2141
|
$et->Warn('Incorrect RIFF chunk size') if $validate and $pos - 8 != $riffEnd;
|
2095
2142
|
$riffEnd += $len2 + 8;
|
2096
2143
|
# don't read into RIFF chunk (eg. concatenated video file)
|
2097
|
-
$raf->Read($buff, 4) == 4 or $err=1,
|
2144
|
+
$raf->Read($buff, 4) == 4 or $err=1, next; # (skip RIFF type word)
|
2098
2145
|
$pos += 4;
|
2099
2146
|
# extract information from remaining file as an embedded file
|
2100
2147
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
@@ -2107,18 +2154,21 @@ sub ProcessRIFF($$)
|
|
2107
2154
|
$et->ImageDataHash($raf, $len2, "'${tag}' chunk");
|
2108
2155
|
}
|
2109
2156
|
if ($tag eq 'LIST_movi' and $ee) {
|
2110
|
-
$raf->Seek($rewind, 0) or $err = 1,
|
2157
|
+
$raf->Seek($rewind, 0) or $err = 1, next if $rewind;
|
2158
|
+
# save end-of-movie offset so we can seek there if we get errors parsing the movie data
|
2159
|
+
$moviEnd = $raf->Tell() + $len2;
|
2111
2160
|
next; # parse into movi chunk
|
2112
2161
|
} elsif (not $rewind) {
|
2113
2162
|
if ($len > 0x7fffffff and not $et->Options('LargeFileSupport')) {
|
2163
|
+
$tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
|
2114
2164
|
$et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
|
2115
2165
|
last;
|
2116
2166
|
}
|
2117
2167
|
if ($validate and $len2) {
|
2118
2168
|
# (must actually try to read something after seeking to detect error)
|
2119
|
-
$raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1,
|
2169
|
+
$raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1, next;
|
2120
2170
|
} else {
|
2121
|
-
$raf->Seek($len2, 1) or $err=1,
|
2171
|
+
$raf->Seek($len2, 1) or $err=1, next;
|
2122
2172
|
}
|
2123
2173
|
}
|
2124
2174
|
}
|
@@ -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.64';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -69,11 +69,13 @@ sub PrintInvLensSpec($;$$);
|
|
69
69
|
'0.10' => 'Zeiss Touit 50mm F2.8 Macro', # (firmware Ver.00)
|
70
70
|
'0.11' => 'Zeiss Loxia 50mm F2', # (firmware Ver.01)
|
71
71
|
'0.12' => 'Zeiss Loxia 35mm F2', # (firmware Ver.01)
|
72
|
+
'0.13' => 'Viltrox 85mm F1.8', # original AF version; Mark II version is at 47473
|
72
73
|
1 => 'Sony LA-EA1 or Sigma MC-11 Adapter', # MC-11 with not-supported lenses
|
73
74
|
2 => 'Sony LA-EA2 Adapter',
|
74
75
|
3 => 'Sony LA-EA3 Adapter',
|
75
76
|
6 => 'Sony LA-EA4 Adapter',
|
76
77
|
7 => 'Sony LA-EA5 Adapter', #JR
|
78
|
+
13 => 'Samyang AF 35-150mm F2-2.8',
|
77
79
|
# 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
|
78
80
|
44 => 'Metabones Canon EF Smart Adapter', #JR
|
79
81
|
78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox)
|
@@ -164,6 +166,7 @@ sub PrintInvLensSpec($;$$);
|
|
164
166
|
32879 => 'Sony FE 50mm F1.4 GM', #JR
|
165
167
|
32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
|
166
168
|
32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
|
169
|
+
32886 => 'Sony FE 300mm F2.8 OSS', #JR
|
167
170
|
|
168
171
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
169
172
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
@@ -216,13 +219,22 @@ sub PrintInvLensSpec($;$$);
|
|
216
219
|
49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
|
217
220
|
49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
|
218
221
|
49472 => 'Tamron 20-40mm F2.8 Di III VXD', #JR (Model A062)
|
219
|
-
|
220
|
-
49473 => 'Tokina atx-m 85mm F1.8 FE
|
221
|
-
49473.
|
222
|
-
49473.
|
222
|
+
49473 => 'Tamron 17-50mm F4 Di III VXD or Tokina or Viltrox lens', #JR (Model A068)
|
223
|
+
49473.1 => 'Tokina atx-m 85mm F1.8 FE', #JR
|
224
|
+
49473.2 => 'Viltrox 23mm F1.4 E', #JR
|
225
|
+
49473.3 => 'Viltrox 56mm F1.4 E', #JR
|
226
|
+
49473.4 => 'Viltrox 85mm F1.8 II FE', #JR
|
223
227
|
49474 => 'Tamron 70-180mm F2.8 Di III VXD G2 or Viltrox lens', #JR (Model A065)
|
224
|
-
49474.1 => 'Viltrox
|
228
|
+
49474.1 => 'Viltrox 13mm F1.4 E',
|
225
229
|
49474.2 => 'Viltrox 16mm F1.8 FE', #JR
|
230
|
+
49474.3 => 'Viltrox 23mm F1.4 E', #JR
|
231
|
+
49474.4 => 'Viltrox 24mm F1.8 FE', #JR
|
232
|
+
49474.5 => 'Viltrox 28mm F1.8 FE', #JR
|
233
|
+
49474.6 => 'Viltrox 33mm F1.4 E', #JR
|
234
|
+
49474.7 => 'Viltrox 35mm F1.8 FE', #JR
|
235
|
+
49474.8 => 'Viltrox 50mm F1.8 FE', #JR
|
236
|
+
49474.9 => 'Viltrox 75mm F1.2 E', #JR
|
237
|
+
|
226
238
|
49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
|
227
239
|
49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
|
228
240
|
49714 => 'Tokina atx-m 11-18mm F2.8 E', #JR
|
@@ -273,6 +285,7 @@ sub PrintInvLensSpec($;$$);
|
|
273
285
|
50538 => 'Sigma 17mm F4 DG DN | C', #JR (023)
|
274
286
|
50539 => 'Sigma 50mm F1.4 DG DN | A', #JR (023)
|
275
287
|
50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
|
288
|
+
50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
|
276
289
|
50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
|
277
290
|
50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
|
278
291
|
|
@@ -1633,6 +1646,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1633
1646
|
# 0x2044 - int32u[2] in ILCE-6700/7CM2/7CR, ILCE-7M4 v1.10, ILCE-7RM5 JPG and ZV-E1:
|
1634
1647
|
# ARW: seen 143360 53248 and 139264 53248
|
1635
1648
|
# JPG: [~filesize] 53248
|
1649
|
+
# 0x2047 - first seen for ILCE-9M3, November 2023
|
1650
|
+
# 0x2048 - first seen for ILCE-9M3
|
1651
|
+
# 0x2049 - undef[2]
|
1652
|
+
0x204a => { #JR
|
1653
|
+
Name => 'FocusLocation2',
|
1654
|
+
Writable => 'int16u',
|
1655
|
+
Count => 4,
|
1656
|
+
NOTES => 'same as FocusLocation within one pixel',
|
1657
|
+
},
|
1636
1658
|
0x3000 => {
|
1637
1659
|
Name => 'ShotInfo',
|
1638
1660
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
|
@@ -1704,7 +1726,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1704
1726
|
# 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/1F/1M2/E10
|
1705
1727
|
# 0x31 (e) for ILCE-1/7M4/7SM3, ILME-FX3
|
1706
1728
|
# 0x32 (e) for ILCE-7RM5, ILME-FX30
|
1707
|
-
# 0x33 (e) for ILCE-6700
|
1729
|
+
# 0x33 (e) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
|
1708
1730
|
# first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106, 89, 63 respectively
|
1709
1731
|
{
|
1710
1732
|
Name => 'Tag9400a',
|
@@ -1826,6 +1848,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1826
1848
|
# 0x25 (37) ILCE-7M4
|
1827
1849
|
# 0x26 (38) ILCE-7RM5, ILME-FX30
|
1828
1850
|
# 0x27 (39) ILCE-6700/7CM2/7CR, ZV-E1
|
1851
|
+
# 0x28 (40) ILCE-9M3
|
1829
1852
|
# var var SLT-A58/A99V, HV, ILCA-68/77M2/99M2
|
1830
1853
|
# only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7, 0xbb, 0x92, 0x28)
|
1831
1854
|
# Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26\xd6]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7\xbb\x92\x28]\x01/',
|
@@ -1904,11 +1927,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1904
1927
|
Name => 'Tag9406',
|
1905
1928
|
# - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08),
|
1906
1929
|
# or 0x03 (enc. 0x1b) for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, and ILCA-99M2
|
1907
|
-
# or 0x04 (enc. 0x40) for ILCE-6700, ZV-E1
|
1908
1930
|
# third byte must be 0x02 or 0x03 (enciphered 0x08 or 0x1b) - ref JR
|
1909
1931
|
# (applies to most SLT/ILCA and NEX/ILCE models, but no DSC models)
|
1910
|
-
Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s
|
1932
|
+
Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s',
|
1911
1933
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406' },
|
1934
|
+
},{
|
1935
|
+
Name => 'Tag9406b',
|
1936
|
+
# - first byte 0x04 (enc. 0x40) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
|
1937
|
+
Condition => '$$valPt =~ /^[\x40]/s',
|
1938
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406b' },
|
1912
1939
|
},{
|
1913
1940
|
Name => 'Sony_0x9406',
|
1914
1941
|
%unknownCipherData,
|
@@ -2001,6 +2028,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2001
2028
|
'3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
|
2002
2029
|
'4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
|
2003
2030
|
'4 0 1 0' => 'ARW 4.0.1', #github#195 (ZV-E1)
|
2031
|
+
'5 0 0 0' => 'ARW 5.0', # (ILCE-9M3)
|
2004
2032
|
# what about cRAW images?
|
2005
2033
|
},
|
2006
2034
|
},
|
@@ -2107,6 +2135,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2107
2135
|
389 => 'ZV-1F', #IB
|
2108
2136
|
390 => 'ILCE-7RM5', #IB
|
2109
2137
|
391 => 'ILME-FX30', #JR
|
2138
|
+
392 => 'ILCE-9M3', #JR
|
2110
2139
|
393 => 'ZV-E1', #JR
|
2111
2140
|
394 => 'ILCE-6700', #JR
|
2112
2141
|
395 => 'ZV-1M2', #JR
|
@@ -8397,7 +8426,7 @@ my %isoSetting2010 = (
|
|
8397
8426
|
},
|
8398
8427
|
0x002a => [{
|
8399
8428
|
Name => 'Quality2',
|
8400
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8429
|
+
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8401
8430
|
PrintConv => {
|
8402
8431
|
0 => 'JPEG',
|
8403
8432
|
1 => 'RAW',
|
@@ -8414,15 +8443,15 @@ my %isoSetting2010 = (
|
|
8414
8443
|
6 => 'RAW + HEIF',
|
8415
8444
|
},
|
8416
8445
|
}],
|
8417
|
-
0x0047 => {
|
8418
|
-
Name => 'SonyImageHeight',
|
8419
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8420
|
-
Format => 'int16u',
|
8421
|
-
PrintConv => '$val > 0 ? 8*$val : "n.a."',
|
8422
|
-
},
|
8446
|
+
# 0x0047 => { # often incorrect, requires 16x for some models
|
8447
|
+
# Name => 'SonyImageHeight',
|
8448
|
+
# Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8449
|
+
# Format => 'int16u',
|
8450
|
+
# PrintConv => '$val > 0 ? 8*$val : "n.a."',
|
8451
|
+
# },
|
8423
8452
|
0x0053 => {
|
8424
8453
|
Name => 'ModelReleaseYear',
|
8425
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8454
|
+
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
|
8426
8455
|
Format => 'int8u',
|
8427
8456
|
PrintConv => 'sprintf("20%.2d", $val)',
|
8428
8457
|
},
|
@@ -8461,10 +8490,11 @@ my %isoSetting2010 = (
|
|
8461
8490
|
FIRST_ENTRY => 0,
|
8462
8491
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
8463
8492
|
DATAMEMBER => [ 0 ],
|
8464
|
-
IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
8493
|
+
IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
8465
8494
|
0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
|
8466
8495
|
|
8467
8496
|
0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8497
|
+
0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8468
8498
|
0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8469
8499
|
0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8470
8500
|
0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
@@ -9013,30 +9043,19 @@ my %isoSetting2010 = (
|
|
9013
9043
|
FORMAT => 'int8u',
|
9014
9044
|
WRITABLE => 1,
|
9015
9045
|
FIRST_ENTRY => 0,
|
9016
|
-
DATAMEMBER => [ 0 ],
|
9017
9046
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
9018
9047
|
# 0x0000: 1 for SLT-A37/A57/A65/A77, NEX-5N/7/F3/VG20
|
9019
9048
|
# 2 for SLT-A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCA-68/77M2, ILCE-3000/3500/7/7M2/7R/7S/5000/6000
|
9020
9049
|
# 3 for ILCA-99M2, ILCE-6100/6300/6400/6500/6600/7C/7M3/7M4/7RM2/7RM3/7RM4/7RM5/7SM2/7SM3/9/9M2/1
|
9021
|
-
# 4 for ILCE-6700/7CM2/7CR, ZV-E1
|
9022
|
-
0x0000 => { Name => 'Ver9406', Hidden => 1, RawConv => '$$self{Ver9406} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
|
9023
9050
|
# 0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ??
|
9024
9051
|
# 0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend.
|
9025
|
-
|
9026
|
-
0x0005 => [{
|
9052
|
+
0x0005 => {
|
9027
9053
|
Name => 'BatteryTemperature',
|
9028
|
-
Condition => '$$self{Ver9406} != 4',
|
9029
9054
|
ValueConv => '($val - 32) / 1.8', # convert to Celsius
|
9030
9055
|
ValueConvInv => '$val * 1.8 + 32',
|
9031
9056
|
PrintConv => 'sprintf("%.1f C",$val)',
|
9032
9057
|
PrintConvInv => '$val=~s/\s*C//; $val',
|
9033
|
-
},
|
9034
|
-
Name => 'BatteryLevel',
|
9035
|
-
Condition => '$$self{Ver9406} == 4',
|
9036
|
-
RawConv => '$val ? $val : undef', # only valid when not 0
|
9037
|
-
PrintConv => '"$val%"',
|
9038
|
-
PrintConvInv => '$val=~s/\s*\%//; $val',
|
9039
|
-
}],
|
9058
|
+
},
|
9040
9059
|
# 0x0006: usually 0, seen non-zero values only for SLT-A99V, ILCA-77M2/99M2 and ILCE-7/7R/7RM2/9: BatteryLevel Grip ?
|
9041
9060
|
0x0006 => {
|
9042
9061
|
Name => 'BatteryLevelGrip1',
|
@@ -9047,7 +9066,6 @@ my %isoSetting2010 = (
|
|
9047
9066
|
# 0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel
|
9048
9067
|
0x0007 => {
|
9049
9068
|
Name => 'BatteryLevel',
|
9050
|
-
Condition => '$$self{Ver9406} != 4',
|
9051
9069
|
PrintConv => '"$val%"',
|
9052
9070
|
PrintConvInv => '$val=~s/\s*\%//; $val',
|
9053
9071
|
},
|
@@ -9066,6 +9084,49 @@ my %isoSetting2010 = (
|
|
9066
9084
|
# 0x0025: 0 or 1 for other SLT and NEX (0x0022, 0x0023, 0x0024 = 255)
|
9067
9085
|
);
|
9068
9086
|
|
9087
|
+
# Tag9406b (ref JR)
|
9088
|
+
%Image::ExifTool::Sony::Tag9406b = (
|
9089
|
+
PROCESS_PROC => \&ProcessEnciphered,
|
9090
|
+
WRITE_PROC => \&WriteEnciphered,
|
9091
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
9092
|
+
FORMAT => 'int8u',
|
9093
|
+
WRITABLE => 1,
|
9094
|
+
FIRST_ENTRY => 0,
|
9095
|
+
DATAMEMBER => [ 1, 4, 6 ],
|
9096
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
9097
|
+
# 0x0000: 4 for ILCE-6700/7CM2/7CR/9M3, ZV-E1
|
9098
|
+
0x0001 => {
|
9099
|
+
Name => 'Battery2',
|
9100
|
+
Hidden => 1,
|
9101
|
+
RawConv => '$$self{Battery2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
|
9102
|
+
# 0 for single battery, 1 for 2 batteries
|
9103
|
+
},
|
9104
|
+
0x0004 => {
|
9105
|
+
Name => 'BatteryStatus1',
|
9106
|
+
Hidden => 1,
|
9107
|
+
# seen 3, 5, 7: when 3 or 7 0x0005 appears valid; when 5, 0x0005 always 0
|
9108
|
+
RawConv => '$$self{BatteryStatus1} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
|
9109
|
+
},
|
9110
|
+
0x0005 => {
|
9111
|
+
Name => 'BatteryLevel',
|
9112
|
+
Condition => '$$self{BatteryStatus1} != 5',
|
9113
|
+
PrintConv => '"$val%"',
|
9114
|
+
PrintConvInv => '$val=~s/\s*\%//; $val',
|
9115
|
+
},
|
9116
|
+
0x0006 => {
|
9117
|
+
Name => 'BatteryStatus2',
|
9118
|
+
Condition => '$$self{Battery2} == 1',
|
9119
|
+
Hidden => 1,
|
9120
|
+
RawConv => '$$self{BatteryStatus2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
|
9121
|
+
},
|
9122
|
+
0x0007 => {
|
9123
|
+
Name => 'BatteryLevel2',
|
9124
|
+
Condition => '$$self{Battery2} == 1 and $$self{BatteryStatus2} != 5',
|
9125
|
+
PrintConv => '"$val%"',
|
9126
|
+
PrintConvInv => '$val=~s/\s*\%//; $val',
|
9127
|
+
},
|
9128
|
+
);
|
9129
|
+
|
9069
9130
|
# Tag940a (ref PH, decoded mainly from A77)
|
9070
9131
|
%Image::ExifTool::Sony::Tag940a = (
|
9071
9132
|
PROCESS_PROC => \&ProcessEnciphered,
|
@@ -9760,7 +9821,7 @@ my %isoSetting2010 = (
|
|
9760
9821
|
WRITE_PROC => \&WriteEnciphered,
|
9761
9822
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
9762
9823
|
FORMAT => 'int8u',
|
9763
|
-
NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3, ILME-FX3/FX30, ZV-E1.',
|
9824
|
+
NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.',
|
9764
9825
|
FIRST_ENTRY => 0,
|
9765
9826
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
9766
9827
|
0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
|
@@ -9944,7 +10005,7 @@ my %isoSetting2010 = (
|
|
9944
10005
|
},
|
9945
10006
|
0x08e5 => {
|
9946
10007
|
Name => 'APS-CSizeCapture',
|
9947
|
-
Condition => '$$self{Model} =~ /^(ILCE-7RM5|ZV-E1)\b/',
|
10008
|
+
Condition => '$$self{Model} =~ /^(ILCE-(7CM2|7CR|7RM5)|ZV-E1)\b/',
|
9948
10009
|
PrintConv => {
|
9949
10010
|
0 => 'Off',
|
9950
10011
|
1 => 'On',
|