exiftool_vendored 12.62.0 → 12.63.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 +29 -1
- data/bin/MANIFEST +1 -0
- data/bin/META.json +4 -1
- data/bin/META.yml +4 -1
- data/bin/Makefile.PL +7 -1
- data/bin/README +10 -7
- data/bin/exiftool +22 -16
- data/bin/lib/Image/ExifTool/7Z.pm +793 -0
- data/bin/lib/Image/ExifTool/Canon.pm +1 -0
- data/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
- data/bin/lib/Image/ExifTool/Exif.pm +31 -14
- data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
- data/bin/lib/Image/ExifTool/GPS.pm +5 -2
- data/bin/lib/Image/ExifTool/Geotag.pm +4 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +225 -28
- data/bin/lib/Image/ExifTool/MPF.pm +2 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- data/bin/lib/Image/ExifTool/PNG.pm +6 -6
- data/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +41 -12
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +18 -18
- data/bin/lib/Image/ExifTool/README +1 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +11 -9
- data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
- data/bin/lib/Image/ExifTool/Sony.pm +102 -8
- data/bin/lib/Image/ExifTool/TagLookup.pm +982 -953
- data/bin/lib/Image/ExifTool/TagNames.pod +75 -5
- data/bin/lib/Image/ExifTool/Validate.pm +17 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
- data/bin/lib/Image/ExifTool/Writer.pl +7 -6
- data/bin/lib/Image/ExifTool/XMP.pm +14 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +32 -0
- data/bin/lib/Image/ExifTool/ZIP.pm +5 -5
- data/bin/lib/Image/ExifTool.pm +54 -33
- data/bin/lib/Image/ExifTool.pod +17 -6
- data/bin/perl-Image-ExifTool.spec +6 -6
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -36,7 +36,7 @@ use strict;
|
|
36
36
|
use vars qw($VERSION $AUTOLOAD %stdCase);
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
38
38
|
|
39
|
-
$VERSION = '1.
|
39
|
+
$VERSION = '1.64';
|
40
40
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
@@ -1374,7 +1374,7 @@ sub ProcessPNG($$)
|
|
1374
1374
|
my $datCount = 0;
|
1375
1375
|
my $datBytes = 0;
|
1376
1376
|
my $fastScan = $et->Options('FastScan');
|
1377
|
-
my $
|
1377
|
+
my $hash = $$et{ImageDataHash};
|
1378
1378
|
my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
|
1379
1379
|
my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
|
1380
1380
|
|
@@ -1454,7 +1454,7 @@ sub ProcessPNG($$)
|
|
1454
1454
|
if ($datCount and $chunk ne $datChunk) {
|
1455
1455
|
my $s = $datCount > 1 ? 's' : '';
|
1456
1456
|
print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n";
|
1457
|
-
print $out "$$et{INDENT}(
|
1457
|
+
print $out "$$et{INDENT}(ImageDataHash: $datBytes bytes of $datChunk data)\n" if $hash;
|
1458
1458
|
$datCount = $datBytes = 0;
|
1459
1459
|
}
|
1460
1460
|
}
|
@@ -1541,8 +1541,8 @@ sub ProcessPNG($$)
|
|
1541
1541
|
}
|
1542
1542
|
# skip over data chunks if possible/necessary
|
1543
1543
|
} elsif (not $validate or $len > $chunkSizeLimit) {
|
1544
|
-
if ($
|
1545
|
-
$et->
|
1544
|
+
if ($hash) {
|
1545
|
+
$et->ImageDataHash($raf, $len);
|
1546
1546
|
$raf->Read($cbuf, 4) == 4 or $et->Warn('Truncated data'), last;
|
1547
1547
|
} else {
|
1548
1548
|
$raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last;
|
@@ -1565,7 +1565,7 @@ sub ProcessPNG($$)
|
|
1565
1565
|
$et->Warn("Corrupted $fileType image") unless $wasEnd;
|
1566
1566
|
last;
|
1567
1567
|
}
|
1568
|
-
$
|
1568
|
+
$hash->add($dbuf) if $hash and $datChunk; # add to hash if necessary
|
1569
1569
|
if ($verbose or $validate or ($outfile and not $fastScan)) {
|
1570
1570
|
# check CRC when in verbose mode (since we don't care about speed)
|
1571
1571
|
my $crc = CalculateCRC(\$hbuf, undef, 4);
|
@@ -15,7 +15,7 @@ use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
use Image::ExifTool::Exif;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.09';
|
19
19
|
|
20
20
|
sub WritePhaseOne($$$);
|
21
21
|
sub ProcessPhaseOne($$$);
|
@@ -585,7 +585,7 @@ sub ProcessPhaseOne($$$)
|
|
585
585
|
my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
|
586
586
|
my $binary = $et->Options('Binary');
|
587
587
|
my $verbose = $et->Options('Verbose');
|
588
|
-
my $
|
588
|
+
my $hash = $$et{ImageDataHash};
|
589
589
|
my $htmlDump = $$et{HTML_DUMP};
|
590
590
|
|
591
591
|
return 0 if $dirLen < 12;
|
@@ -678,16 +678,16 @@ sub ProcessPhaseOne($$$)
|
|
678
678
|
}
|
679
679
|
}
|
680
680
|
}
|
681
|
-
if ($
|
681
|
+
if ($hash and $tagInfo and $$tagInfo{IsImageData}) {
|
682
682
|
my ($pos, $len) = ($valuePtr, $size);
|
683
683
|
while ($len) {
|
684
684
|
my $n = $len > 65536 ? 65536 : $len;
|
685
685
|
my $tmp = substr($$dataPt, $pos, $n);
|
686
|
-
$
|
686
|
+
$hash->add($tmp);
|
687
687
|
$len -= $n;
|
688
688
|
$pos += $n;
|
689
689
|
}
|
690
|
-
$et->VPrint(0, "$$et{INDENT}(
|
690
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: $size bytes of PhaseOne:$$tagInfo{Name})\n");
|
691
691
|
}
|
692
692
|
my %parms = (
|
693
693
|
DirName => $ifdType,
|
@@ -447,8 +447,8 @@ my %dupDirOK = ( ipco => 1, '----' => 1 );
|
|
447
447
|
my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl',
|
448
448
|
stsc => 'stbl', stts => 'stbl' );
|
449
449
|
|
450
|
-
# atoms required for generating
|
451
|
-
my %
|
450
|
+
# atoms required for generating ImageDataHash
|
451
|
+
my %hashBox = ( vide => { %eeStd }, soun => { %eeStd } );
|
452
452
|
|
453
453
|
# boxes and their containers for the various handler types that we want to save
|
454
454
|
# when the ExtractEmbedded is enabled (currently only the 'gps ' container name is
|
@@ -2867,6 +2867,25 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
2867
2867
|
Name => 'AV1Configuration',
|
2868
2868
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AV1Config' },
|
2869
2869
|
},
|
2870
|
+
clli => {
|
2871
|
+
Name => 'ContentLightLevel',
|
2872
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ContentLightLevel' },
|
2873
|
+
},
|
2874
|
+
# ref https://nokiatech.github.io/heif/technical.html
|
2875
|
+
# cclv - Content Color Volume
|
2876
|
+
# mdcv - Mastering Display Color Volume
|
2877
|
+
# rrtp - Required reference types
|
2878
|
+
# crtt - Creation time information
|
2879
|
+
# mdft - Modification time information
|
2880
|
+
# udes - User description
|
2881
|
+
# altt - Accessibility text
|
2882
|
+
# aebr - Auto exposure information
|
2883
|
+
# wbbr - White balance information
|
2884
|
+
# fobr - Focus information
|
2885
|
+
# afbr - Flash exposure information
|
2886
|
+
# dobr - Depth of field information
|
2887
|
+
# pano - Panorama information
|
2888
|
+
# iscl - Image Scaling
|
2870
2889
|
);
|
2871
2890
|
|
2872
2891
|
# ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
|
@@ -3128,6 +3147,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
3128
3147
|
},
|
3129
3148
|
);
|
3130
3149
|
|
3150
|
+
# ref https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/MPEG4Writer.cpp
|
3151
|
+
%Image::ExifTool::QuickTime::ContentLightLevel = (
|
3152
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
3153
|
+
GROUPS => { 2 => 'Video' },
|
3154
|
+
FIRST_ENTRY => 0,
|
3155
|
+
FORMAT => 'int16u',
|
3156
|
+
0 => 'MaxContentLightLevel',
|
3157
|
+
1 => 'MaxPicAverageLightLevel',
|
3158
|
+
);
|
3159
|
+
|
3131
3160
|
%Image::ExifTool::QuickTime::ItemRef = (
|
3132
3161
|
PROCESS_PROC => \&ProcessMOV,
|
3133
3162
|
WRITE_PROC => \&WriteQuickTime,
|
@@ -8787,15 +8816,15 @@ sub HandleItemInfo($)
|
|
8787
8816
|
$et->VPrint(0, "$$et{INDENT} [snip $snip bytes]\n") if $snip;
|
8788
8817
|
}
|
8789
8818
|
}
|
8790
|
-
# do
|
8791
|
-
if ($isImageData{$type} and $$et{
|
8792
|
-
my $
|
8819
|
+
# do hash of AVIF "av01" and HEIC image data
|
8820
|
+
if ($isImageData{$type} and $$et{ImageDataHash}) {
|
8821
|
+
my $hash = $$et{ImageDataHash};
|
8793
8822
|
my $tot = 0;
|
8794
8823
|
foreach $extent (@{$$item{Extents}}) {
|
8795
8824
|
$raf->Seek($$extent[1] + $base, 0) or $et->Warn("Seek error in $type image data"), last;
|
8796
|
-
$tot += $et->
|
8825
|
+
$tot += $et->ImageDataHash($raf, $$extent[2], "$type image", 1);
|
8797
8826
|
}
|
8798
|
-
$et->VPrint(0, "$$et{INDENT}(
|
8827
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: $tot bytes of $type data)\n") if $tot;
|
8799
8828
|
}
|
8800
8829
|
next unless $name;
|
8801
8830
|
# assemble the data for this item
|
@@ -9299,8 +9328,8 @@ sub ProcessMOV($$;$)
|
|
9299
9328
|
$$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
|
9300
9329
|
|
9301
9330
|
my $ee = $$et{OPTIONS}{ExtractEmbedded};
|
9302
|
-
my $
|
9303
|
-
if ($ee or $
|
9331
|
+
my $hash = $$et{ImageDataHash};
|
9332
|
+
if ($ee or $hash) {
|
9304
9333
|
$unkOpt = $$et{OPTIONS}{Unknown};
|
9305
9334
|
require 'Image/ExifTool/QuickTimeStream.pl';
|
9306
9335
|
}
|
@@ -9382,7 +9411,7 @@ sub ProcessMOV($$;$)
|
|
9382
9411
|
# set flag to store additional information for ExtractEmbedded option
|
9383
9412
|
my $handlerType = $$et{HandlerType};
|
9384
9413
|
if ($eeBox{$handlerType} and $eeBox{$handlerType}{$tag}) {
|
9385
|
-
if ($ee or $
|
9414
|
+
if ($ee or $hash) {
|
9386
9415
|
# (there is another 'gps ' box with a track log that doesn't contain offsets)
|
9387
9416
|
if ($tag ne 'gps ' or $eeBox{$handlerType}{$tag} eq $dirID) {
|
9388
9417
|
$eeTag = 1;
|
@@ -9394,7 +9423,7 @@ sub ProcessMOV($$;$)
|
|
9394
9423
|
} elsif ($ee and $ee > 1 and $eeBox2{$handlerType} and $eeBox2{$handlerType}{$tag}) {
|
9395
9424
|
$eeTag = 1;
|
9396
9425
|
$$et{OPTIONS}{Unknown} = 1;
|
9397
|
-
} elsif ($
|
9426
|
+
} elsif ($hash and $hashBox{$handlerType} and $hashBox{$handlerType}{$tag}) {
|
9398
9427
|
$eeTag = 1;
|
9399
9428
|
$$et{OPTIONS}{Unknown} = 1;
|
9400
9429
|
}
|
@@ -9629,7 +9658,7 @@ ItemID: foreach $id (keys %$items) {
|
|
9629
9658
|
}
|
9630
9659
|
if ($tag eq 'stbl') {
|
9631
9660
|
# process sample data when exiting SampleTable box if extracting embedded
|
9632
|
-
ProcessSamples($et) if $ee or $
|
9661
|
+
ProcessSamples($et) if $ee or $hash;
|
9633
9662
|
} elsif ($tag eq 'minf') {
|
9634
9663
|
$$et{HandlerType} = ''; # reset handler type at end of media info box
|
9635
9664
|
}
|
@@ -1128,14 +1128,14 @@ sub Process_text($$$;$)
|
|
1128
1128
|
# Inputs: 0) ExifTool ref
|
1129
1129
|
# Notes: Also accesses ExifTool RAF*, SET_GROUP1, HandlerType, MetaFormat,
|
1130
1130
|
# ee*, and avcC elements (* = must exist)
|
1131
|
-
# - may be called either due to ExtractEmbedded option, or
|
1132
|
-
# -
|
1131
|
+
# - may be called either due to ExtractEmbedded option, or ImageDataHash requested
|
1132
|
+
# - hash includes only video and audio data
|
1133
1133
|
sub ProcessSamples($)
|
1134
1134
|
{
|
1135
1135
|
my $et = shift;
|
1136
1136
|
my ($raf, $ee) = @$et{qw(RAF ee)};
|
1137
|
-
my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent, $
|
1138
|
-
my ($mdatOffset, $mdatSize); # (for range-checking samples when
|
1137
|
+
my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent, $hash);
|
1138
|
+
my ($mdatOffset, $mdatSize); # (for range-checking samples when hash is done)
|
1139
1139
|
|
1140
1140
|
return unless $ee;
|
1141
1141
|
delete $$et{ee}; # use only once
|
@@ -1144,22 +1144,22 @@ sub ProcessSamples($)
|
|
1144
1144
|
my $type = $$et{HandlerType} || '';
|
1145
1145
|
if ($type eq 'vide') {
|
1146
1146
|
# only process specific types of video streams
|
1147
|
-
$
|
1147
|
+
$hash = $$et{ImageDataHash};
|
1148
1148
|
# only process specific video types if ExtractEmbedded was used
|
1149
|
-
# (otherwise we are only here to calculate the audio/video
|
1149
|
+
# (otherwise we are only here to calculate the audio/video hash)
|
1150
1150
|
if ($eeOpt) {
|
1151
1151
|
if ($$ee{avcC}) { $type = 'avcC' }
|
1152
1152
|
elsif ($$ee{JPEG}) { $type = 'JPEG' }
|
1153
|
-
else { return unless $
|
1153
|
+
else { return unless $hash }
|
1154
1154
|
}
|
1155
1155
|
} elsif ($type eq 'soun') {
|
1156
|
-
$
|
1157
|
-
return unless $
|
1156
|
+
$hash = $$et{ImageDataHash};
|
1157
|
+
return unless $hash;
|
1158
1158
|
} else {
|
1159
|
-
return unless $eeOpt; # (don't do
|
1159
|
+
return unless $eeOpt; # (don't do hash on other types)
|
1160
1160
|
}
|
1161
1161
|
|
1162
|
-
my $
|
1162
|
+
my $hashSize = 0;
|
1163
1163
|
my ($start, $size) = @$ee{qw(start size)};
|
1164
1164
|
#
|
1165
1165
|
# determine sample start offsets from chunk offsets (stco) and sample-to-chunk table (stsc),
|
@@ -1213,7 +1213,7 @@ Sample: for ($i=0; ; ) {
|
|
1213
1213
|
++$iChunk;
|
1214
1214
|
}
|
1215
1215
|
@$start == @$size or $et->WarnOnce('Incorrect sample start/size count'), return;
|
1216
|
-
# process as chunks if we are only interested in calculating
|
1216
|
+
# process as chunks if we are only interested in calculating hash
|
1217
1217
|
if ($type eq 'soun' or $type eq 'vide') {
|
1218
1218
|
$start = $stco;
|
1219
1219
|
$size = \@chunkSize;
|
@@ -1232,7 +1232,7 @@ Sample: for ($i=0; ; ) {
|
|
1232
1232
|
$oldIndent = $$et{INDENT};
|
1233
1233
|
$$et{INDENT} = '';
|
1234
1234
|
}
|
1235
|
-
if ($
|
1235
|
+
if ($hash) {
|
1236
1236
|
$mdatSize = $$et{MediaDataSize};
|
1237
1237
|
$mdatOffset = $$et{MediaDataOffset} if defined $mdatSize;
|
1238
1238
|
}
|
@@ -1249,7 +1249,7 @@ Sample: for ($i=0; ; ) {
|
|
1249
1249
|
delete $$et{FoundGPSLatitude};
|
1250
1250
|
delete $$et{FoundGPSDateTime};
|
1251
1251
|
|
1252
|
-
# range check the sample data for
|
1252
|
+
# range check the sample data for hash if necessary
|
1253
1253
|
my $size = $$size[$i];
|
1254
1254
|
if (defined $mdatOffset) {
|
1255
1255
|
if ($$start[$i] < $mdatOffset) {
|
@@ -1268,9 +1268,9 @@ Sample: for ($i=0; ; ) {
|
|
1268
1268
|
next unless $n;
|
1269
1269
|
$size = $n;
|
1270
1270
|
}
|
1271
|
-
if ($
|
1272
|
-
$
|
1273
|
-
$
|
1271
|
+
if ($hash) {
|
1272
|
+
$hash->add($buff);
|
1273
|
+
$hashSize += length $buff;
|
1274
1274
|
}
|
1275
1275
|
if ($type eq 'avcC') {
|
1276
1276
|
next if length($buff) <= $hdrLen;
|
@@ -1399,7 +1399,7 @@ Sample: for ($i=0; ; ) {
|
|
1399
1399
|
}
|
1400
1400
|
if ($verbose) {
|
1401
1401
|
my $str = $type eq 'soun' ? 'Audio' : 'Video';
|
1402
|
-
$et->VPrint(0, "$$et{INDENT}(
|
1402
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: $hashSize bytes of $str data)\n") if $hashSize;
|
1403
1403
|
$$et{INDENT} = $oldIndent;
|
1404
1404
|
$et->VPrint(0, "--------------------------\n");
|
1405
1405
|
}
|
@@ -412,7 +412,7 @@ numerical, and generated automatically otherwise.
|
|
412
412
|
'IsComposite' - flag set for Composite tags
|
413
413
|
|
414
414
|
'IsImageData' - flag set if this is an image data offset to
|
415
|
-
be included in
|
415
|
+
be included in ImageDataHash calculation. Must have an
|
416
416
|
OffsetPair entry which is the ID of the corresponding size.
|
417
417
|
|
418
418
|
'IsOffset' - flag set if the tag represents an offset to some
|
@@ -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.65';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -38,7 +38,7 @@ sub ProcessSLLT($$$);
|
|
38
38
|
sub ProcessLucas($$$);
|
39
39
|
sub WriteRIFF($$);
|
40
40
|
|
41
|
-
# RIFF chunks containing image data (to include in
|
41
|
+
# RIFF chunks containing image data (to include in ImageDataHash digest)
|
42
42
|
my %isImageData = (
|
43
43
|
LIST_movi => 1, # (AVI: contains ##db, ##dc, ##wb)
|
44
44
|
data => 1, # (WAV)
|
@@ -652,6 +652,7 @@ my %code2charset = (
|
|
652
652
|
Name => 'Acidizer',
|
653
653
|
SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Acidizer' },
|
654
654
|
},
|
655
|
+
guan => 'Guano', #forum14831
|
655
656
|
);
|
656
657
|
|
657
658
|
# the maker notes used by some digital cameras
|
@@ -1987,7 +1988,7 @@ sub ProcessRIFF($$)
|
|
1987
1988
|
my $unknown = $et->Options('Unknown');
|
1988
1989
|
my $validate = $et->Options('Validate');
|
1989
1990
|
my $ee = $et->Options('ExtractEmbedded');
|
1990
|
-
my $
|
1991
|
+
my $hash = $$et{ImageDataHash};
|
1991
1992
|
|
1992
1993
|
# verify this is a valid RIFF file
|
1993
1994
|
return 0 unless $raf->Read($buff, 12) == 12;
|
@@ -2045,6 +2046,7 @@ sub ProcessRIFF($$)
|
|
2045
2046
|
} else {
|
2046
2047
|
next;
|
2047
2048
|
}
|
2049
|
+
last;
|
2048
2050
|
}
|
2049
2051
|
# stop when we hit the audio data or AVI index or AVI movie data
|
2050
2052
|
# --> no more because Adobe Bridge stores XMP after this!!
|
@@ -2067,9 +2069,9 @@ sub ProcessRIFF($$)
|
|
2067
2069
|
# (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
|
2068
2070
|
if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
|
2069
2071
|
$raf->Read($buff, $len2) == $len2 or $err=1, last;
|
2070
|
-
if ($
|
2071
|
-
$
|
2072
|
-
$et->VPrint(0, "$$et{INDENT}(
|
2072
|
+
if ($hash and $isImageData{$tag}) {
|
2073
|
+
$hash->add($buff);
|
2074
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
|
2073
2075
|
}
|
2074
2076
|
my $setGroups;
|
2075
2077
|
if ($tagInfo and ref $tagInfo eq 'HASH' and $$tagInfo{SetGroups}) {
|
@@ -2099,10 +2101,10 @@ sub ProcessRIFF($$)
|
|
2099
2101
|
next; # (must not increment $pos)
|
2100
2102
|
} else {
|
2101
2103
|
my $rewind;
|
2102
|
-
# do
|
2103
|
-
if ($
|
2104
|
+
# do hash if required
|
2105
|
+
if ($hash and $isImageData{$tag}) {
|
2104
2106
|
$rewind = $raf->Tell();
|
2105
|
-
$et->
|
2107
|
+
$et->ImageDataHash($raf, $len2, "'${tag}' chunk");
|
2106
2108
|
}
|
2107
2109
|
if ($tag eq 'LIST_movi' and $ee) {
|
2108
2110
|
$raf->Seek($rewind, 0) or $err = 1, last if $rewind;
|
@@ -19,7 +19,7 @@ package Image::ExifTool::Shortcuts;
|
|
19
19
|
use strict;
|
20
20
|
use vars qw($VERSION);
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.68';
|
23
23
|
|
24
24
|
# this is a special table used to define command-line shortcuts
|
25
25
|
# (documentation Notes may be added for these via %shortcutNotes in BuildTagLookup.pm)
|
@@ -276,6 +276,7 @@ $VERSION = '1.67';
|
|
276
276
|
'FileModifyDate',
|
277
277
|
'FileName',
|
278
278
|
],
|
279
|
+
ImageDataMD5 => [ 'ImageDataHash' ], # (for backward compatibilty)
|
279
280
|
);
|
280
281
|
|
281
282
|
#------------------------------------------------------------------------------
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::Sigma;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.31';
|
20
20
|
|
21
21
|
sub ProcessX3FHeader($$$);
|
22
22
|
sub ProcessX3FDirectory($$$);
|
@@ -549,9 +549,9 @@ sub ProcessX3FDirectory($$$)
|
|
549
549
|
$len -= 28;
|
550
550
|
# ignore all image data but JPEG compressed (version 2.0, type 2, format 18)
|
551
551
|
unless ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/) {
|
552
|
-
# do
|
553
|
-
if ($$et{
|
554
|
-
$et->
|
552
|
+
# do hash on non-preview data if requested
|
553
|
+
if ($$et{ImageDataHash} and substr($buff,8,1) ne "\x02") {
|
554
|
+
$et->ImageDataHash($raf, $len, 'SigmaRaw IMAG');
|
555
555
|
}
|
556
556
|
next;
|
557
557
|
}
|
@@ -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.61';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -1061,7 +1061,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1061
1061
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
|
1062
1062
|
},{
|
1063
1063
|
Name => 'Tag2010i', # ?
|
1064
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-(1F?|E10))\b/',
|
1064
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX95|HX99|RX0M2)|ZV-(1F?|E10))\b/',
|
1065
1065
|
SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
|
1066
1066
|
},{
|
1067
1067
|
Name => 'Tag_0x2010',
|
@@ -1137,7 +1137,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1137
1137
|
# FocusMode for SLT/HV/ILCA and NEX/ILCE; doesn't seem to apply to DSC models (always 0)
|
1138
1138
|
# from 2018: at least DSC-RX10M4 and RX100M6 also use this tag
|
1139
1139
|
Name => 'FocusMode',
|
1140
|
-
Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)',
|
1140
|
+
Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2)/)',
|
1141
1141
|
Writable => 'int8u',
|
1142
1142
|
Priority => 0,
|
1143
1143
|
PrintConv => {
|
@@ -1169,7 +1169,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1169
1169
|
},
|
1170
1170
|
},{
|
1171
1171
|
Name => 'AFAreaModeSetting',
|
1172
|
-
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV
|
1172
|
+
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2))/',
|
1173
1173
|
Notes => 'NEX, ILCE and some DSC models',
|
1174
1174
|
RawConv => '$$self{AFAreaILCE} = $val',
|
1175
1175
|
DataMember => 'AFAreaILCE',
|
@@ -1205,7 +1205,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1205
1205
|
# observed values in range (0 0) to (640 480), with center (320 240) often seen
|
1206
1206
|
# for NEX-5R/6, positions appear to be in an 11x9 grid
|
1207
1207
|
Name => 'FlexibleSpotPosition',
|
1208
|
-
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV
|
1208
|
+
Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|ZV-|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2))/',
|
1209
1209
|
Writable => 'int16u',
|
1210
1210
|
Count => 2,
|
1211
1211
|
Notes => q{
|
@@ -1365,7 +1365,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1365
1365
|
# from 2018: at least DSC-RX10M4 and RX100M6 also use this tag
|
1366
1366
|
0x2021 => { #JR
|
1367
1367
|
Name => 'AFTracking',
|
1368
|
-
Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)/)',
|
1368
|
+
Condition => '($$self{Model} !~ /^DSC-/) or ($$self{Model} =~ /^DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX95|HX99|RX0M2)/)',
|
1369
1369
|
Writable => 'int8u',
|
1370
1370
|
PrintConv => {
|
1371
1371
|
0 => 'Off',
|
@@ -2070,6 +2070,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2070
2070
|
390 => 'ILCE-7RM5', #IB
|
2071
2071
|
391 => 'ILME-FX30', #JR
|
2072
2072
|
393 => 'ZV-E1', #JR
|
2073
|
+
395 => 'ZV-1M2', #JR
|
2073
2074
|
},
|
2074
2075
|
},
|
2075
2076
|
0xb020 => { #2
|
@@ -6182,6 +6183,7 @@ my %pictureProfile2010 = (
|
|
6182
6183
|
31 => 'Gamma S-Log3 (PP8 or PP9)', #14
|
6183
6184
|
33 => 'Gamma HLG2 (PP10)', #14
|
6184
6185
|
34 => 'Gamma HLG3', #IB
|
6186
|
+
36 => 'Off',
|
6185
6187
|
37 => 'FL',
|
6186
6188
|
38 => 'VV2',
|
6187
6189
|
39 => 'IN',
|
@@ -6637,8 +6639,30 @@ my %isoSetting2010 = (
|
|
6637
6639
|
},
|
6638
6640
|
#0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6639
6641
|
#0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6642
|
+
0x192c => {
|
6643
|
+
Name => 'AspectRatio',
|
6644
|
+
Condition => '$$self{Model} !~ /^(DSC-RX100|Stellar)\b/',
|
6645
|
+
PrintConv => {
|
6646
|
+
0 => '16:9',
|
6647
|
+
1 => '4:3',
|
6648
|
+
2 => '3:2',
|
6649
|
+
3 => '1:1',
|
6650
|
+
5 => 'Panorama',
|
6651
|
+
},
|
6652
|
+
},
|
6640
6653
|
#0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6641
6654
|
#0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6655
|
+
0x1a88 => {
|
6656
|
+
Name => 'AspectRatio',
|
6657
|
+
Condition => '$$self{Model} =~ /^(DSC-RX100|Stellar)\b/',
|
6658
|
+
PrintConv => {
|
6659
|
+
0 => '16:9',
|
6660
|
+
1 => '4:3',
|
6661
|
+
2 => '3:2',
|
6662
|
+
3 => '1:1',
|
6663
|
+
5 => 'Panorama',
|
6664
|
+
},
|
6665
|
+
},
|
6642
6666
|
);
|
6643
6667
|
|
6644
6668
|
%Image::ExifTool::Sony::Tag2010f = ( #JR
|
@@ -6714,6 +6738,16 @@ my %isoSetting2010 = (
|
|
6714
6738
|
},
|
6715
6739
|
#0x1914 => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6716
6740
|
#0x1918 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6741
|
+
0x192c => {
|
6742
|
+
Name => 'AspectRatio',
|
6743
|
+
PrintConv => {
|
6744
|
+
0 => '16:9',
|
6745
|
+
1 => '4:3',
|
6746
|
+
2 => '3:2',
|
6747
|
+
3 => '1:1',
|
6748
|
+
5 => 'Panorama',
|
6749
|
+
},
|
6750
|
+
},
|
6717
6751
|
#0x192e => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6718
6752
|
#0x1930 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6719
6753
|
);
|
@@ -6845,6 +6879,16 @@ my %isoSetting2010 = (
|
|
6845
6879
|
},
|
6846
6880
|
# 0x1940 => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6847
6881
|
# 0x1944 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6882
|
+
0x1958 => {
|
6883
|
+
Name => 'AspectRatio',
|
6884
|
+
PrintConv => {
|
6885
|
+
0 => '16:9',
|
6886
|
+
1 => '4:3',
|
6887
|
+
2 => '3:2',
|
6888
|
+
3 => '1:1',
|
6889
|
+
5 => 'Panorama',
|
6890
|
+
},
|
6891
|
+
},
|
6848
6892
|
# 0x195a => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6849
6893
|
# 0x195c => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6850
6894
|
);
|
@@ -6982,6 +7026,16 @@ my %isoSetting2010 = (
|
|
6982
7026
|
Condition => '$$self{Model} !~ /^DSC-/',
|
6983
7027
|
PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'},
|
6984
7028
|
},
|
7029
|
+
0x192c => {
|
7030
|
+
Name => 'AspectRatio',
|
7031
|
+
PrintConv => {
|
7032
|
+
0 => '16:9',
|
7033
|
+
1 => '4:3',
|
7034
|
+
2 => '3:2',
|
7035
|
+
3 => '1:1',
|
7036
|
+
5 => 'Panorama',
|
7037
|
+
},
|
7038
|
+
},
|
6985
7039
|
# 0x1970 => { Name => 'SonyImageWidth', Format => 'int16u' },
|
6986
7040
|
# 0x1974 => { Name => 'SonyImageHeight', Format => 'int16u' },
|
6987
7041
|
# 0x198a => { Name => 'SonyImageWidth', Format => 'int16u' },
|
@@ -7113,6 +7167,16 @@ my %isoSetting2010 = (
|
|
7113
7167
|
Condition => '$$self{Model} !~ /^DSC-/',
|
7114
7168
|
PrintConv => { 11 => '11 (APS-C)', 16 => '16 (Full-frame)'},
|
7115
7169
|
},
|
7170
|
+
0x188c => {
|
7171
|
+
Name => 'AspectRatio',
|
7172
|
+
PrintConv => {
|
7173
|
+
0 => '16:9',
|
7174
|
+
1 => '4:3',
|
7175
|
+
2 => '3:2',
|
7176
|
+
3 => '1:1',
|
7177
|
+
5 => 'Panorama',
|
7178
|
+
},
|
7179
|
+
},
|
7116
7180
|
);
|
7117
7181
|
|
7118
7182
|
%Image::ExifTool::Sony::Tag202a = (
|
@@ -8273,6 +8337,30 @@ my %isoSetting2010 = (
|
|
8273
8337
|
Format => 'int8u',
|
8274
8338
|
PrintConv => 'sprintf("20%.2d", $val)',
|
8275
8339
|
},
|
8340
|
+
0x0133 => {
|
8341
|
+
Name => 'ShutterType',
|
8342
|
+
Condition => '$$self{Model} =~ /^(DSC-(HX350|HX400V|HX60V|HX80|HX90|HX90V|QX30|RX10|RX10M2|RX10M3|RX100M3|RX100M4))\b/',
|
8343
|
+
PrintConv => {
|
8344
|
+
7 => 'Electronic',
|
8345
|
+
23 => 'Mechanical',
|
8346
|
+
},
|
8347
|
+
},
|
8348
|
+
0x0139 => {
|
8349
|
+
Name => 'ShutterType',
|
8350
|
+
Condition => '$$self{Model} =~ /^(DSC-(HX95|HX99|RX0|RX0M2|RX10M4|RX100M5|RX100M5A|RX100M6))\b/',
|
8351
|
+
PrintConv => {
|
8352
|
+
7 => 'Electronic',
|
8353
|
+
23 => 'Mechanical',
|
8354
|
+
},
|
8355
|
+
},
|
8356
|
+
0x013f => {
|
8357
|
+
Name => 'ShutterType',
|
8358
|
+
Condition => '$$self{Model} =~ /^(DSC-RX100M7|ZV-(1|1F|1M2))\b/',
|
8359
|
+
PrintConv => {
|
8360
|
+
7 => 'Electronic',
|
8361
|
+
23 => 'Mechanical',
|
8362
|
+
},
|
8363
|
+
},
|
8276
8364
|
);
|
8277
8365
|
|
8278
8366
|
%Image::ExifTool::Sony::Tag9401 = ( # JR
|
@@ -8284,7 +8372,7 @@ my %isoSetting2010 = (
|
|
8284
8372
|
FIRST_ENTRY => 0,
|
8285
8373
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
8286
8374
|
DATAMEMBER => [ 0 ],
|
8287
|
-
IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
8375
|
+
IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
8288
8376
|
0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
|
8289
8377
|
|
8290
8378
|
0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
@@ -8292,7 +8380,8 @@ my %isoSetting2010 = (
|
|
8292
8380
|
0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8293
8381
|
0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8294
8382
|
0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8295
|
-
0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8383
|
+
0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/ and $$self{Model} !~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8384
|
+
0x04ba => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 155 and $$self{Model} =~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8296
8385
|
0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8297
8386
|
0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8298
8387
|
0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
@@ -8690,6 +8779,11 @@ my %isoSetting2010 = (
|
|
8690
8779
|
10 => 'Night View/Portrait',
|
8691
8780
|
11 => 'Autumn Leaves',
|
8692
8781
|
13 => 'Sepia',
|
8782
|
+
15 => 'FL',
|
8783
|
+
16 => 'VV2',
|
8784
|
+
17 => 'IN',
|
8785
|
+
18 => 'SH',
|
8786
|
+
255 => 'Off',
|
8693
8787
|
},
|
8694
8788
|
},
|
8695
8789
|
0x0052 => {
|