exiftool_vendored 12.68.0 → 12.70.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 +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',
|