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.
@@ -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.36';
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.16';
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.59';
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+)*%%EOF/s or return -4;
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.68';
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
- return 1 if $outBuff and not $$subTable{WRITE_PROC};
984
- my $dirName = $$subdir{DirName} || $tagName;
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.10';
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.04';
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.68';
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) == $len2 or $err=1, next;
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");