exiftool_vendored 13.02.0 → 13.03.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 +23 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +53 -24
- data/bin/lib/Image/ExifTool/Apple.pm +2 -2
- data/bin/lib/Image/ExifTool/Exif.pm +8 -1
- data/bin/lib/Image/ExifTool/GIF.pm +143 -92
- data/bin/lib/Image/ExifTool/JPEG.pm +9 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +10 -2
- data/bin/lib/Image/ExifTool/PDF.pm +29 -2
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +11 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +6 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5594 -5583
- data/bin/lib/Image/ExifTool/TagNames.pod +43 -4
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +13 -4
- data/bin/lib/Image/ExifTool/Writer.pl +16 -11
- data/bin/lib/Image/ExifTool/XMP.pm +7 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +60 -0
- data/bin/lib/Image/ExifTool.pm +94 -67
- data/bin/lib/Image/ExifTool.pod +16 -3
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use vars qw($VERSION);
|
12
12
|
use Image::ExifTool qw(:DataAccess :Utils);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.37';
|
15
15
|
|
16
16
|
sub ProcessOcad($$$);
|
17
17
|
sub ProcessJPEG_HDR($$$);
|
@@ -228,6 +228,10 @@ sub ProcessJPEG_HDR($$$);
|
|
228
228
|
Name => 'InfiRayIsothermal',
|
229
229
|
Condition => '$$self{HasIJPEG}',
|
230
230
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Isothermal' },
|
231
|
+
}, {
|
232
|
+
Name => 'SEAL',
|
233
|
+
Condition => '$$valPt =~ /^SEAL\0/',
|
234
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
231
235
|
}],
|
232
236
|
APP9 => [{
|
233
237
|
Name => 'MediaJukebox',
|
@@ -237,6 +241,10 @@ sub ProcessJPEG_HDR($$$);
|
|
237
241
|
Name => 'InfiRaySensor',
|
238
242
|
Condition => '$$self{HasIJPEG}',
|
239
243
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Sensor' },
|
244
|
+
}, {
|
245
|
+
Name => 'SEAL',
|
246
|
+
Condition => '$$valPt =~ /^SEAL\0/',
|
247
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
240
248
|
}],
|
241
249
|
APP10 => {
|
242
250
|
Name => 'Comment',
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.17';
|
19
19
|
|
20
20
|
sub HandleStruct($$;$$$$);
|
21
21
|
|
@@ -685,6 +685,14 @@ my %uidInfo = (
|
|
685
685
|
Name => 'Projection',
|
686
686
|
SubDirectory => { TagTable => 'Image::ExifTool::Matroska::Projection' },
|
687
687
|
},
|
688
|
+
#
|
689
|
+
# other
|
690
|
+
#
|
691
|
+
0x5345414c => { # ('SEAL' in hex)
|
692
|
+
Name => 'SEAL',
|
693
|
+
NotEBML => 1, # don't process SubDirectory as EBML elements
|
694
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
695
|
+
},
|
688
696
|
);
|
689
697
|
|
690
698
|
# Spherical video v2 projection tags (ref https://github.com/google/spatial-media/blob/master/docs/spherical-video-v2-rfc.md)
|
@@ -1047,7 +1055,7 @@ sub ProcessMKV($$)
|
|
1047
1055
|
$seekInfoOnly = 1;
|
1048
1056
|
}
|
1049
1057
|
if ($tagInfo) {
|
1050
|
-
if ($$tagInfo{SubDirectory}) {
|
1058
|
+
if ($$tagInfo{SubDirectory} and not $$tagInfo{NotEBML}) {
|
1051
1059
|
# stop processing at first cluster unless we are using -v -U or -ee
|
1052
1060
|
# or there are Tags after this
|
1053
1061
|
if ($$tagInfo{Name} eq 'Cluster' and $processAll < 2) {
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
22
22
|
require Exporter;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.60';
|
25
25
|
|
26
26
|
sub FetchObject($$$$);
|
27
27
|
sub ExtractObject($$;$$);
|
@@ -349,6 +349,7 @@ my %supportedFilter = (
|
|
349
349
|
# tags in PDF ICCBased, Cs1 and CS0 dictionaries
|
350
350
|
%Image::ExifTool::PDF::ICCBased = (
|
351
351
|
_stream => {
|
352
|
+
Name => 'ICC_Profile',
|
352
353
|
SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
|
353
354
|
},
|
354
355
|
);
|
@@ -470,6 +471,7 @@ my %supportedFilter = (
|
|
470
471
|
# tags in PDF AIMetaData dictionary
|
471
472
|
%Image::ExifTool::PDF::AIMetaData = (
|
472
473
|
_stream => {
|
474
|
+
Name => 'AIStream',
|
473
475
|
SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
|
474
476
|
},
|
475
477
|
);
|
@@ -477,6 +479,7 @@ my %supportedFilter = (
|
|
477
479
|
# tags in PDF ImageResources dictionary
|
478
480
|
%Image::ExifTool::PDF::ImageResources = (
|
479
481
|
_stream => {
|
482
|
+
Name => 'PhotoshopStream',
|
480
483
|
SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
|
481
484
|
},
|
482
485
|
);
|
@@ -2161,6 +2164,20 @@ sub ProcessDict($$$$;$$)
|
|
2161
2164
|
last;
|
2162
2165
|
}
|
2163
2166
|
# decode stream if necessary
|
2167
|
+
if ($cryptInfo and ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3} and
|
2168
|
+
$$dict{Length} and $$dict{Length} > 10000) and not $$dict{_decrypted} and
|
2169
|
+
not $$et{PDF_CAPTURE}) # (capturing PDF for writing?)
|
2170
|
+
{
|
2171
|
+
my $type = $$dict{Type} || '';
|
2172
|
+
if ($type ne '/Metadata' or $$dict{Length} > 100000) {
|
2173
|
+
if ($$et{OPTIONS}{IgnoreMinorErrors}) {
|
2174
|
+
$et->WarnOnce("Decrypting large $$tagInfo{Name} (will be slow)");
|
2175
|
+
} else {
|
2176
|
+
$et->WarnOnce("Skipping large AES-encrypted $$tagInfo{Name}", 2);
|
2177
|
+
last;
|
2178
|
+
}
|
2179
|
+
}
|
2180
|
+
}
|
2164
2181
|
DecodeStream($et, $dict) or last;
|
2165
2182
|
if ($verbose > 2) {
|
2166
2183
|
$et->VPrint(2,"$$et{INDENT}$$et{DIR_NAME} stream data\n");
|
@@ -2237,7 +2254,17 @@ sub ReadPDF($$)
|
|
2237
2254
|
$raf->Read($buff, $len) == $len or return -3;
|
2238
2255
|
# find the LAST xref table in the file (may be multiple %%EOF marks,
|
2239
2256
|
# and comments between "startxref" and "%%EOF")
|
2240
|
-
$buff =~ /^.*startxref(\s+)(\d+)(\s+)(%[^\x0d\x0a]*\s+)
|
2257
|
+
$buff =~ /^.*startxref(\s+)(\d+)(\s+)((%[^\x0d\x0a]*\s+)*)%%EOF/s or return -4;
|
2258
|
+
# parse comments to read SEAL information
|
2259
|
+
if ($4) {
|
2260
|
+
my @com = split /[\x0d\x0d]+/, $4;
|
2261
|
+
foreach (@com) {
|
2262
|
+
/^(%+\s*)<seal seal=/ or next;
|
2263
|
+
my $dat = substr $_, length($1);
|
2264
|
+
my $tbl = GetTagTable('Image::ExifTool::XMP::SEAL');
|
2265
|
+
$et->ProcessDirectory({ DataPt => \$dat }, $tbl);
|
2266
|
+
}
|
2267
|
+
}
|
2241
2268
|
my $ws = $1 . $3;
|
2242
2269
|
my $xr = $2;
|
2243
2270
|
push @xrefOffsets, $xr, 'Main';
|
@@ -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.69';
|
40
40
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
@@ -371,6 +371,10 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
|
|
371
371
|
IgnoreProp => { meta => 1 }, # ignore 'meta' container
|
372
372
|
},
|
373
373
|
},
|
374
|
+
seAl => {
|
375
|
+
Name => 'SEAL',
|
376
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
377
|
+
},
|
374
378
|
# mkBF,mkTS,mkBS,mkBT ? - written by Adobe FireWorks
|
375
379
|
);
|
376
380
|
|
@@ -980,8 +984,15 @@ sub FoundPNG($$$$;$$$$)
|
|
980
984
|
my $processProc = $$subdir{ProcessProc};
|
981
985
|
# nothing more to do if writing and subdirectory is not writable
|
982
986
|
my $subTable = GetTagTable($$subdir{TagTable});
|
983
|
-
|
984
|
-
|
987
|
+
if ($outBuff and not $$subTable{WRITE_PROC}) {
|
988
|
+
if ($$et{DEL_GROUP}{$dirName}) {
|
989
|
+
# non-writable directories may be deleted as a group (eg. SEAL)
|
990
|
+
$et->VPrint(0, " Deleting $dirName\n");
|
991
|
+
$$outBuff = '';
|
992
|
+
++$$et{CHANGED};
|
993
|
+
}
|
994
|
+
return 1;
|
995
|
+
}
|
985
996
|
my %subdirInfo = (
|
986
997
|
DataPt => \$val,
|
987
998
|
DirStart => 0,
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.11';
|
20
20
|
|
21
21
|
#------------------------------------------------------------------------------
|
22
22
|
# Read or write information in a PPM/PGM/PBM image
|
@@ -29,7 +29,7 @@ sub ProcessPPM($$)
|
|
29
29
|
my $outfile = $$dirInfo{OutFile};
|
30
30
|
my $verbose = $et->Options('Verbose');
|
31
31
|
my $out = $et->Options('TextOut');
|
32
|
-
my ($buff, $num, $type, %info);
|
32
|
+
my ($buff, $num, $type, %info, $seal);
|
33
33
|
#
|
34
34
|
# read as much of the image as necessary to extract the header and comments
|
35
35
|
#
|
@@ -77,6 +77,7 @@ sub ProcessPPM($$)
|
|
77
77
|
if (defined $info{Comment}) {
|
78
78
|
$info{Comment} =~ s/^# ?//mg; # remove "# " at the start of each line
|
79
79
|
$info{Comment} =~ s/[\n\r]+$//; # remove trailing newline
|
80
|
+
$seal = 1 if $info{Comment} =~ /^<seal seal=/;
|
80
81
|
}
|
81
82
|
$et->SetFileType($type);
|
82
83
|
my $len = pos($buff);
|
@@ -91,6 +92,10 @@ sub ProcessPPM($$)
|
|
91
92
|
++$$et{CHANGED};
|
92
93
|
$et->VerboseValue('- Comment', $oldComment) if defined $oldComment;
|
93
94
|
$et->VerboseValue('+ Comment', $newComment) if defined $newComment;
|
95
|
+
} elsif ($seal and $$et{DEL_GROUP}{SEAL}) {
|
96
|
+
# delete SEAL comment
|
97
|
+
$et->VerboseValue('- Comment', $oldComment);
|
98
|
+
++$$et{CHANGED};
|
94
99
|
} else {
|
95
100
|
$newComment = $oldComment; # use existing comment
|
96
101
|
}
|
@@ -116,6 +121,10 @@ sub ProcessPPM($$)
|
|
116
121
|
print $out "$type header ($len bytes):\n";
|
117
122
|
$et->VerboseDump(\$buff, Len => $len);
|
118
123
|
}
|
124
|
+
if ($seal) {
|
125
|
+
$et->ProcessDirectory({ DataPt => \$info{Comment} }, GetTagTable('Image::ExifTool::XMP::SEAL'));
|
126
|
+
delete $info{Comment};
|
127
|
+
}
|
119
128
|
my $tag;
|
120
129
|
foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
|
121
130
|
$et->FoundTag($tag, $info{$tag}) if defined $info{$tag};
|
@@ -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 = '3.
|
51
|
+
$VERSION = '3.05';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -902,6 +902,10 @@ my %userDefined = (
|
|
902
902
|
},
|
903
903
|
# '35AX'? - seen "AT" (Yada RoadCam Pro 4K dashcam)
|
904
904
|
cust => 'CustomInfo', # 70mai A810
|
905
|
+
SEAL => {
|
906
|
+
Name => 'SEAL',
|
907
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
908
|
+
},
|
905
909
|
);
|
906
910
|
|
907
911
|
# stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
|
@@ -3097,6 +3101,7 @@ my %userDefined = (
|
|
3097
3101
|
10 => {
|
3098
3102
|
Name => 'VideoFullRangeFlag',
|
3099
3103
|
Mask => 0x80,
|
3104
|
+
PrintConv => { 0 => 'Limited', 1 => 'Full' },
|
3100
3105
|
},
|
3101
3106
|
);
|
3102
3107
|
|
@@ -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.69';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -664,6 +664,10 @@ my %code2charset = (
|
|
664
664
|
SubDirectory => { TagTable => 'Image::ExifTool::RIFF::Acidizer' },
|
665
665
|
},
|
666
666
|
guan => 'Guano', #forum14831
|
667
|
+
SEAL => {
|
668
|
+
Name => 'SEAL',
|
669
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
670
|
+
},
|
667
671
|
);
|
668
672
|
|
669
673
|
# the maker notes used by some digital cameras
|
@@ -2120,7 +2124,8 @@ sub ProcessRIFF($$)
|
|
2120
2124
|
my $tagInfo = $$tagTbl{$tag};
|
2121
2125
|
# (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
|
2122
2126
|
if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
|
2123
|
-
$raf->Read($buff, $len2)
|
2127
|
+
$raf->Read($buff, $len2) >= $len or $err=1, next;
|
2128
|
+
length($buff) == $len2 or $et->Warn("No padding on odd-sized $tag chunk");
|
2124
2129
|
if ($hash and $isImageData{$tag}) {
|
2125
2130
|
$hash->add($buff);
|
2126
2131
|
$et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
|