exiftool_vendored 13.06.0 → 13.08.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 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +6 -5
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -3
- data/bin/lib/Image/ExifTool/Canon.pm +19 -1
- data/bin/lib/Image/ExifTool/DJI.pm +1 -1
- data/bin/lib/Image/ExifTool/Exif.pm +2 -2
- data/bin/lib/Image/ExifTool/FITS.pm +2 -2
- data/bin/lib/Image/ExifTool/FLIF.pm +2 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +11 -11
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +3 -3
- data/bin/lib/Image/ExifTool/IPTC.pm +2 -2
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +6 -6
- data/bin/lib/Image/ExifTool/M2TS.pm +39 -9
- data/bin/lib/Image/ExifTool/MXF.pm +2 -2
- data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +15 -15
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +4 -4
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +3 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +63 -3
- data/bin/lib/Image/ExifTool/Protobuf.pm +4 -4
- data/bin/lib/Image/ExifTool/QuickTime.pm +23 -14
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +336 -91
- data/bin/lib/Image/ExifTool/README +4 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +3 -3
- data/bin/lib/Image/ExifTool/Sony.pm +2 -2
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +4 -3
- data/bin/lib/Image/ExifTool/TagLookup.pm +6979 -6970
- data/bin/lib/Image/ExifTool/TagNames.pod +26 -5
- data/bin/lib/Image/ExifTool/VCard.pm +2 -2
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteExif.pl +2 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +4 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
- data/bin/lib/Image/ExifTool/Writer.pl +16 -16
- data/bin/lib/Image/ExifTool/XMP.pm +9 -9
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool.pm +58 -57
- data/bin/lib/Image/ExifTool.pod +1 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -2525,7 +2525,7 @@ sub ReadMXFValue($$$)
|
|
2525
2525
|
} elsif ($type =~ /(Array|Batch)/ and $len > 16) {
|
2526
2526
|
my ($count, $size) = unpack('NN', $val);
|
2527
2527
|
# validate data length
|
2528
|
-
$len == 8 + $count * $size or $et->
|
2528
|
+
$len == 8 + $count * $size or $et->Warn("Bad array or batch size");
|
2529
2529
|
my ($i, @a);
|
2530
2530
|
for ($i=0; $i<$count; ++$i) {
|
2531
2531
|
my $pos = 8 + $i * $size;
|
@@ -2626,7 +2626,7 @@ sub ProcessLocalSet($$$)
|
|
2626
2626
|
$extra = sprintf(', Local 0x%.4x', $loc);
|
2627
2627
|
} else {
|
2628
2628
|
$tag = $loc;
|
2629
|
-
# $et->
|
2629
|
+
# $et->Warn('Missing local key for at least one tag');
|
2630
2630
|
$extra = ', NOT IN PRIMER!';
|
2631
2631
|
}
|
2632
2632
|
my $tagInfo = $$tagTablePtr{$tag};
|
@@ -1097,7 +1097,7 @@ sub ProcessMKV($$)
|
|
1097
1097
|
if ($more >= 0x80000000) {
|
1098
1098
|
last unless $et->Options('LargeFileSupport');
|
1099
1099
|
if ($et->Options('LargeFileSupport') eq '2') {
|
1100
|
-
$et->
|
1100
|
+
$et->Warn('Processing large block (LargeFileSupport is 2)');
|
1101
1101
|
}
|
1102
1102
|
}
|
1103
1103
|
$raf->Seek($more, 1) or last;
|
@@ -907,7 +907,7 @@ sub WriteXtraValue($$$)
|
|
907
907
|
$type = 72;
|
908
908
|
}
|
909
909
|
} else {
|
910
|
-
$et->
|
910
|
+
$et->Warn("Error converting value for Microsoft:$$tagInfo{Name}");
|
911
911
|
}
|
912
912
|
SetByteOrder('MM');
|
913
913
|
if (defined $type) {
|
@@ -1215,7 +1215,7 @@ sub DecodeStream($$)
|
|
1215
1215
|
# be sure we can process all the filters before we take the time to do the decryption
|
1216
1216
|
foreach $filter (@filters) {
|
1217
1217
|
next if $supportedFilter{$filter};
|
1218
|
-
$et->
|
1218
|
+
$et->Warn("Unsupported Filter $filter");
|
1219
1219
|
return 0;
|
1220
1220
|
}
|
1221
1221
|
# apply decryption first if required (and if the default encryption
|
@@ -1244,7 +1244,7 @@ sub DecodeStream($$)
|
|
1244
1244
|
if (ref $decodeParms eq 'HASH') {
|
1245
1245
|
$pre = $$decodeParms{Predictor};
|
1246
1246
|
if ($pre and $pre ne '1' and $pre ne '12') {
|
1247
|
-
$et->
|
1247
|
+
$et->Warn("FlateDecode Predictor $pre currently not supported");
|
1248
1248
|
return 0;
|
1249
1249
|
}
|
1250
1250
|
}
|
@@ -1259,7 +1259,7 @@ sub DecodeStream($$)
|
|
1259
1259
|
return 0;
|
1260
1260
|
}
|
1261
1261
|
} else {
|
1262
|
-
$et->
|
1262
|
+
$et->Warn('Install Compress::Zlib to process filtered streams');
|
1263
1263
|
return 0;
|
1264
1264
|
}
|
1265
1265
|
next unless $pre and $pre eq '12'; # 12 = 'up' prediction
|
@@ -1268,7 +1268,7 @@ sub DecodeStream($$)
|
|
1268
1268
|
my $cols = $$decodeParms{Columns};
|
1269
1269
|
unless ($cols) {
|
1270
1270
|
# currently only support 'up' prediction
|
1271
|
-
$et->
|
1271
|
+
$et->Warn('No Columns for decoding stream');
|
1272
1272
|
return 0;
|
1273
1273
|
}
|
1274
1274
|
my @bytes = unpack('C*', $$dict{_stream});
|
@@ -1276,7 +1276,7 @@ sub DecodeStream($$)
|
|
1276
1276
|
my $buff = '';
|
1277
1277
|
while (@bytes > $cols) {
|
1278
1278
|
unless (($_ = shift @bytes) == 2) {
|
1279
|
-
$et->
|
1279
|
+
$et->Warn("Unsupported PNG filter $_"); # (yes, PNG)
|
1280
1280
|
return 0;
|
1281
1281
|
}
|
1282
1282
|
foreach (@pre) {
|
@@ -1296,11 +1296,11 @@ sub DecodeStream($$)
|
|
1296
1296
|
my $name = $$decodeParms{Name};
|
1297
1297
|
next unless defined $name or $name eq 'Identity';
|
1298
1298
|
if ($name ne 'StdCF') {
|
1299
|
-
$et->
|
1299
|
+
$et->Warn("Unsupported Crypt Filter $name");
|
1300
1300
|
return 0;
|
1301
1301
|
}
|
1302
1302
|
unless ($cryptInfo) {
|
1303
|
-
$et->
|
1303
|
+
$et->Warn('Missing Encrypt StdCF entry');
|
1304
1304
|
return 0;
|
1305
1305
|
}
|
1306
1306
|
# decrypt the stream manually because we want to:
|
@@ -1318,15 +1318,15 @@ sub DecodeStream($$)
|
|
1318
1318
|
# make sure we don't have any unsupported decoding parameters
|
1319
1319
|
if (ref $decodeParms eq 'HASH') {
|
1320
1320
|
if ($$decodeParms{Predictor}) {
|
1321
|
-
$et->
|
1321
|
+
$et->Warn("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
|
1322
1322
|
return 0;
|
1323
1323
|
} elsif ($$decodeParms{EarlyChange}) {
|
1324
|
-
$et->
|
1324
|
+
$et->Warn("LZWDecode EarlyChange currently not supported");
|
1325
1325
|
return 0;
|
1326
1326
|
}
|
1327
1327
|
}
|
1328
1328
|
unless (DecodeLZW(\$$dict{_stream})) {
|
1329
|
-
$et->
|
1329
|
+
$et->Warn('LZW decompress error');
|
1330
1330
|
return 0;
|
1331
1331
|
}
|
1332
1332
|
|
@@ -1362,7 +1362,7 @@ sub DecodeStream($$)
|
|
1362
1362
|
last if $_ eq '~';
|
1363
1363
|
# (both $n and $val are zero again now)
|
1364
1364
|
}
|
1365
|
-
$err and $et->
|
1365
|
+
$err and $et->Warn("ASCII85Decode error $err");
|
1366
1366
|
$$dict{_stream} = pack('C*', @out);
|
1367
1367
|
}
|
1368
1368
|
}
|
@@ -1830,7 +1830,7 @@ sub ProcessDict($$$$;$$)
|
|
1830
1830
|
|
1831
1831
|
$nesting = ($nesting || 0) + 1;
|
1832
1832
|
if ($nesting > 50) {
|
1833
|
-
$et->
|
1833
|
+
$et->Warn('Nesting too deep (directory ignored)');
|
1834
1834
|
return;
|
1835
1835
|
}
|
1836
1836
|
# save entire dictionary for rewriting if specified
|
@@ -1990,7 +1990,7 @@ sub ProcessDict($$$$;$$)
|
|
1990
1990
|
if ($$tagInfo{IgnoreDuplicates}) {
|
1991
1991
|
my $flag = "ProcessedPDF_$tag";
|
1992
1992
|
if ($$et{$flag}) {
|
1993
|
-
next if $et->
|
1993
|
+
next if $et->Warn("Ignored duplicate $tag dictionary", 2);
|
1994
1994
|
} else {
|
1995
1995
|
$$et{$flag} = 1;
|
1996
1996
|
}
|
@@ -2171,9 +2171,9 @@ sub ProcessDict($$$$;$$)
|
|
2171
2171
|
my $type = $$dict{Type} || '';
|
2172
2172
|
if ($type ne '/Metadata' or $$dict{Length} > 100000) {
|
2173
2173
|
if ($$et{OPTIONS}{IgnoreMinorErrors}) {
|
2174
|
-
$et->
|
2174
|
+
$et->Warn("Decrypting large $$tagInfo{Name} (will be slow)");
|
2175
2175
|
} else {
|
2176
|
-
$et->
|
2176
|
+
$et->Warn("Skipping large AES-encrypted $$tagInfo{Name}", 2);
|
2177
2177
|
last;
|
2178
2178
|
}
|
2179
2179
|
}
|
@@ -269,7 +269,7 @@ sub ExtractObject($$;$)
|
|
269
269
|
if ($type == 13) { # dict
|
270
270
|
# prevent infinite recursion
|
271
271
|
if (defined $parent and length $parent > 1000) {
|
272
|
-
$et->
|
272
|
+
$et->Warn('Possible deep recursion while parsing PLIST');
|
273
273
|
return undef;
|
274
274
|
}
|
275
275
|
my $tagTablePtr = $$plistInfo{TagTablePtr};
|
@@ -965,7 +965,7 @@ sub FoundPNG($$$$;$$$$)
|
|
965
965
|
my $processed;
|
966
966
|
if ($$tagInfo{SubDirectory}) {
|
967
967
|
if ($$et{OPTIONS}{Validate} and $$tagInfo{NonStandard}) {
|
968
|
-
$et->
|
968
|
+
$et->Warn("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
|
969
969
|
}
|
970
970
|
my $subdir = $$tagInfo{SubDirectory};
|
971
971
|
my $dirName = $$subdir{DirName} || $tagName;
|
@@ -1471,7 +1471,7 @@ sub ProcessPNG($$)
|
|
1471
1471
|
|
1472
1472
|
if ($wasEnd) {
|
1473
1473
|
last unless $n; # stop now if normal end of PNG
|
1474
|
-
$et->
|
1474
|
+
$et->Warn("Trailer data after $fileType $endChunk chunk", 1);
|
1475
1475
|
$wasTrailer = 1;
|
1476
1476
|
last if $n < 8;
|
1477
1477
|
$$et{SET_GROUP1} = 'Trailer';
|
@@ -1500,7 +1500,7 @@ sub ProcessPNG($$)
|
|
1500
1500
|
} elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
|
1501
1501
|
$et->Warn('Non-standard PNG image (Apple iPhone format)');
|
1502
1502
|
} else {
|
1503
|
-
$et->
|
1503
|
+
$et->Warn("$fileType image did not start with $hdrChunk");
|
1504
1504
|
}
|
1505
1505
|
}
|
1506
1506
|
if ($outfile and ($isDatChunk{$chunk} or $chunk eq $endChunk) and @txtOffset) {
|
@@ -1594,7 +1594,7 @@ sub ProcessPNG($$)
|
|
1594
1594
|
} else {
|
1595
1595
|
$msg = 'fixed';
|
1596
1596
|
}
|
1597
|
-
$et->
|
1597
|
+
$et->Warn("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
|
1598
1598
|
}
|
1599
1599
|
# read chunk data and CRC
|
1600
1600
|
unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
|
@@ -2802,7 +2802,7 @@ sub ProcessLeicaTrailer($;$)
|
|
2802
2802
|
}
|
2803
2803
|
} else { # M (Type 240)
|
2804
2804
|
# scan for the lens type (M writes 114 bytes of garbage first)
|
2805
|
-
if ($buff =~ /\G.{114}([\x20-\
|
2805
|
+
if ($buff =~ /\G.{114}([\x20-\x7e]*\0*)/sg and length($1) >= 50) {
|
2806
2806
|
$expect = 114;
|
2807
2807
|
}
|
2808
2808
|
}
|
@@ -450,7 +450,7 @@ sub WritePhaseOne($$$)
|
|
450
450
|
|
451
451
|
return undef if $dirLen < 12;
|
452
452
|
unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
|
453
|
-
$et->
|
453
|
+
$et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
|
454
454
|
return undef;
|
455
455
|
}
|
456
456
|
my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
|
@@ -591,7 +591,7 @@ sub ProcessPhaseOne($$$)
|
|
591
591
|
|
592
592
|
return 0 if $dirLen < 12;
|
593
593
|
unless ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{ENTRY_SIZE}) {
|
594
|
-
$et->
|
594
|
+
$et->Warn("No ENTRY_SIZE for $$tagTablePtr{TABLE_NAME}");
|
595
595
|
return undef;
|
596
596
|
}
|
597
597
|
my $entrySize = $$tagTablePtr{VARS}{ENTRY_SIZE};
|
@@ -632,7 +632,7 @@ sub ProcessPhaseOne($$$)
|
|
632
632
|
$formatSize = Get32u($dataPt, $entry+4);
|
633
633
|
$formatStr = $formatName[$formatSize];
|
634
634
|
unless ($formatStr) {
|
635
|
-
$et->
|
635
|
+
$et->Warn("Unrecognized $ifdType format size $formatSize",1);
|
636
636
|
$formatSize = 1;
|
637
637
|
$formatStr = 'undef';
|
638
638
|
}
|
@@ -28,11 +28,12 @@ use strict;
|
|
28
28
|
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
30
30
|
|
31
|
-
$VERSION = '1.
|
31
|
+
$VERSION = '1.72';
|
32
32
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
34
34
|
sub WritePhotoshop($$$);
|
35
35
|
sub ProcessLayers($$$);
|
36
|
+
sub ProcessChannelOptions($$$);
|
36
37
|
|
37
38
|
# PrintFlags bit definitions (ref forum13785)
|
38
39
|
%printFlags = (
|
@@ -322,7 +323,13 @@ my %unicodeString = (
|
|
322
323
|
0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7
|
323
324
|
0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7
|
324
325
|
0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7
|
325
|
-
0x0435 => {
|
326
|
+
0x0435 => {
|
327
|
+
Name => 'ChannelOptions', #7/forum16762
|
328
|
+
SubDirectory => {
|
329
|
+
TagTable => 'Image::ExifTool::Photoshop::ChannelOptions',
|
330
|
+
Start => 4,
|
331
|
+
},
|
332
|
+
},
|
326
333
|
0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7
|
327
334
|
0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7
|
328
335
|
0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7
|
@@ -350,6 +357,40 @@ my %unicodeString = (
|
|
350
357
|
0x2710 => { Unknown => 1, Name => 'PrintFlagsInfo' },
|
351
358
|
);
|
352
359
|
|
360
|
+
# Photoshop channel options (ref forum16762)
|
361
|
+
%Image::ExifTool::Photoshop::ChannelOptions = (
|
362
|
+
PROCESS_PROC => \&ProcessChannelOptions,
|
363
|
+
VARS => { IS_BINARY => 1 },
|
364
|
+
GROUPS => { 2 => 'Image' },
|
365
|
+
0 => {
|
366
|
+
Name => 'ChannelColorSpace',
|
367
|
+
Format => 'int16u',
|
368
|
+
PrintConv => {
|
369
|
+
0 => 'RGB',
|
370
|
+
1 => 'HSB',
|
371
|
+
2 => 'CMYK',
|
372
|
+
7 => 'Lab',
|
373
|
+
8 => 'Grayscale',
|
374
|
+
},
|
375
|
+
},
|
376
|
+
2 => {
|
377
|
+
Name => 'ChannelColorData',
|
378
|
+
Format => 'int16u[4]',
|
379
|
+
},
|
380
|
+
11 => {
|
381
|
+
Name => 'ChannelOpacity',
|
382
|
+
PrintConv => '"$val%"',
|
383
|
+
},
|
384
|
+
12 => {
|
385
|
+
Name => 'ChannelColorIndicates',
|
386
|
+
PrintConv => {
|
387
|
+
0 => 'Selected Areas',
|
388
|
+
1 => 'Masked Areas',
|
389
|
+
2 => 'Spot Color',
|
390
|
+
},
|
391
|
+
},
|
392
|
+
);
|
393
|
+
|
353
394
|
# Photoshop JPEG quality record (ref 2)
|
354
395
|
%Image::ExifTool::Photoshop::JPEG_Quality = (
|
355
396
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -755,6 +796,25 @@ sub ProcessLayersAndMask($$$)
|
|
755
796
|
return $raf->Seek($end, 0) ? 1 : 0;
|
756
797
|
}
|
757
798
|
|
799
|
+
#------------------------------------------------------------------------------
|
800
|
+
# Process Photoshop channel options (ref forum16762)
|
801
|
+
# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref
|
802
|
+
# Returns: 1 on success
|
803
|
+
sub ProcessChannelOptions($$$)
|
804
|
+
{
|
805
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
806
|
+
my $end = $$dirInfo{DirStart} + $$dirInfo{DirLen};
|
807
|
+
$$dirInfo{DirLen} = 13;
|
808
|
+
my $i;
|
809
|
+
for ($i=0; $$dirInfo{DirStart} + 13 <= $end; ++$i) {
|
810
|
+
$$et{SET_GROUP1} = "Channel$i";
|
811
|
+
$et->ProcessBinaryData($dirInfo, $tagTablePtr);
|
812
|
+
$$dirInfo{DirStart} += 13;
|
813
|
+
}
|
814
|
+
delete $$et{SET_GROUP1};
|
815
|
+
return 1;
|
816
|
+
}
|
817
|
+
|
758
818
|
#------------------------------------------------------------------------------
|
759
819
|
# Process Photoshop layers (beginning with layer count)
|
760
820
|
# Inputs: 0) ExifTool ref, 1) DirInfo ref, 2) tag table ref
|
@@ -1050,7 +1110,7 @@ sub ProcessPhotoshop($$$)
|
|
1050
1110
|
if ($$et{VALUE}{IPTCDigest} and $$et{VALUE}{CurrentIPTCDigest} and
|
1051
1111
|
$$et{VALUE}{IPTCDigest} ne $$et{VALUE}{CurrentIPTCDigest})
|
1052
1112
|
{
|
1053
|
-
$et->
|
1113
|
+
$et->Warn('IPTCDigest is not current. XMP may be out of sync');
|
1054
1114
|
}
|
1055
1115
|
delete $$et{LOW_PRIORITY_DIR}{'*'};
|
1056
1116
|
return $success;
|
@@ -127,7 +127,7 @@ sub ProcessProtobuf($$$;$)
|
|
127
127
|
my $pos = $$dirInfo{Pos};
|
128
128
|
last if $pos >= length $$dataPt;
|
129
129
|
my ($buff, $id, $type) = ReadRecord($dirInfo);
|
130
|
-
defined $buff or $et->
|
130
|
+
defined $buff or $et->Warn('Protobuf format error'), last;
|
131
131
|
if ($type == 2 and $buff =~ /\.proto$/) {
|
132
132
|
# save protocol name separately for directory type
|
133
133
|
$$et{ProtocolName}{$dirName} = substr($buff, 0, -6);
|
@@ -145,7 +145,7 @@ sub ProcessProtobuf($$$;$)
|
|
145
145
|
if ($type == 2 and $$tagInfo{Unknown}) {
|
146
146
|
if ($$tagInfo{IsProtobuf}) {
|
147
147
|
$$tagInfo{IsProtobuf} = 0 unless IsProtobuf(\$buff);
|
148
|
-
} elsif (not defined $$tagInfo{IsProtobuf} and $buff =~ /[^\x20-\
|
148
|
+
} elsif (not defined $$tagInfo{IsProtobuf} and $buff =~ /[^\x20-\x7e]/ and
|
149
149
|
IsProtobuf(\$buff))
|
150
150
|
{
|
151
151
|
$$tagInfo{IsProtobuf} = 1;
|
@@ -175,7 +175,7 @@ sub ProcessProtobuf($$$;$)
|
|
175
175
|
my %subdir = ( DataPt => \$buff, Base => $addr, DirName => $dirName );
|
176
176
|
ProcessProtobuf($et, \%subdir, $tagTbl, "$prefix$id-");
|
177
177
|
next;
|
178
|
-
} elsif ($buff !~ /[^\x20-\
|
178
|
+
} elsif ($buff !~ /[^\x20-\x7e]/) {
|
179
179
|
$val = $buff; # assume this is an ASCII string
|
180
180
|
} elsif (length($buff) % 4) {
|
181
181
|
$val = '0x' . unpack('H*', $buff);
|
@@ -201,7 +201,7 @@ sub ProcessProtobuf($$$;$)
|
|
201
201
|
);
|
202
202
|
}
|
203
203
|
# warn if we didn't finish exactly at the end of the buffer
|
204
|
-
$et->
|
204
|
+
$et->Warn('Truncated protobuf data') unless $prefix or $$dirInfo{Pos} == length $$dataPt;
|
205
205
|
return 1;
|
206
206
|
}
|
207
207
|
|
@@ -69,8 +69,9 @@ sub Process_gps0($$$);
|
|
69
69
|
sub Process_gsen($$$);
|
70
70
|
sub Process_gdat($$$);
|
71
71
|
sub Process_nbmt($$$);
|
72
|
+
sub ProcessLigoGPS($$$;$);
|
73
|
+
sub ProcessLigoJSON($$$);
|
72
74
|
sub ProcessKenwood($$$);
|
73
|
-
sub ProcessLIGO_JSON($$$);
|
74
75
|
sub ProcessRIFFTrailer($$$);
|
75
76
|
sub ProcessTTAD($$$);
|
76
77
|
sub ProcessNMEA($$$);
|
@@ -255,7 +256,7 @@ my %timeInfo = (
|
|
255
256
|
my $offset = (66 * 365 + 17) * 24 * 3600;
|
256
257
|
return $val - $offset if $val >= $offset or $$self{OPTIONS}{QuickTimeUTC};
|
257
258
|
if ($val and not $$self{IsWriting}) {
|
258
|
-
$self->
|
259
|
+
$self->Warn('Patched incorrect time zero for QuickTime date/time tag',1);
|
259
260
|
}
|
260
261
|
return $val;
|
261
262
|
},
|
@@ -584,6 +585,14 @@ my %userDefined = (
|
|
584
585
|
Condition => '$$valPt =~ /^\0[\0-\x04]..[a-zA-Z ]{4}/s',
|
585
586
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SkipInfo' },
|
586
587
|
},
|
588
|
+
{
|
589
|
+
Name => 'LigoGPSInfo',
|
590
|
+
Condition => '$$valPt =~ /^LIGOGPSINFO\0/',
|
591
|
+
SubDirectory => {
|
592
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
593
|
+
ProcessProc => \&ProcessLigoGPS,
|
594
|
+
},
|
595
|
+
},
|
587
596
|
{ Name => 'Skip', Unknown => 1, Binary => 1 },
|
588
597
|
],
|
589
598
|
wide => { Unknown => 1, Binary => 1 },
|
@@ -677,7 +686,7 @@ my %userDefined = (
|
|
677
686
|
Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
|
678
687
|
Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
|
679
688
|
RawConv => q{
|
680
|
-
$self->
|
689
|
+
$self->Warn('Use the ExtractEmbedded option to decode timed SensorData',3);
|
681
690
|
return \$val;
|
682
691
|
},
|
683
692
|
},
|
@@ -762,11 +771,11 @@ my %userDefined = (
|
|
762
771
|
ProcessProc => \&ProcessKenwood,
|
763
772
|
},
|
764
773
|
},{
|
765
|
-
Name => '
|
774
|
+
Name => 'LigoJSON',
|
766
775
|
Condition => '$$valPt =~ /^LIGOGPSINFO \{/',
|
767
776
|
SubDirectory => {
|
768
777
|
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
769
|
-
ProcessProc => \&
|
778
|
+
ProcessProc => \&ProcessLigoJSON,
|
770
779
|
},
|
771
780
|
},{
|
772
781
|
Name => 'FLIRData',
|
@@ -1303,7 +1312,7 @@ my %userDefined = (
|
|
1303
1312
|
Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/',
|
1304
1313
|
Notes => 'Garmin GPS sensor data',
|
1305
1314
|
RawConv => q{
|
1306
|
-
$self->
|
1315
|
+
$self->Warn('Use the ExtractEmbedded option to decode timed Garmin GPS',3);
|
1307
1316
|
return \$val;
|
1308
1317
|
},
|
1309
1318
|
},
|
@@ -1407,7 +1416,7 @@ my %userDefined = (
|
|
1407
1416
|
if ($val >= $offset or $$self{OPTIONS}{QuickTimeUTC}) {
|
1408
1417
|
$val -= $offset;
|
1409
1418
|
} elsif ($val and not $$self{IsWriting}) {
|
1410
|
-
$self->
|
1419
|
+
$self->Warn('Patched incorrect time zero for QuickTime date/time tag',1);
|
1411
1420
|
}
|
1412
1421
|
return $$self{CreateDate} = $val;
|
1413
1422
|
},
|
@@ -2557,7 +2566,7 @@ my %userDefined = (
|
|
2557
2566
|
TTID => { Name => 'TomTomID', ValueConv => 'unpack("x4H*",$val)' },
|
2558
2567
|
TTVI => { Name => 'TomTomVI', Format => 'int32u', Unknown => 1 }, # seen: "0 1 61 508 508"
|
2559
2568
|
# TTVD seen: "normal 720p 60fps 60fps 16/9 wide 1x"
|
2560
|
-
TTVD => { Name => 'TomTomVD', ValueConv => 'my @a = ($val =~ /[\x20-\
|
2569
|
+
TTVD => { Name => 'TomTomVD', ValueConv => 'my @a = ($val =~ /[\x20-\x7e]+/g); "@a"', List => 1 },
|
2561
2570
|
);
|
2562
2571
|
|
2563
2572
|
# User-specific media data atoms (ref 11)
|
@@ -9031,11 +9040,11 @@ sub HandleItemInfo($)
|
|
9031
9040
|
}
|
9032
9041
|
$warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
|
9033
9042
|
$warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
|
9034
|
-
$et->
|
9043
|
+
$et->Warn($warn) if $warn and $name;
|
9035
9044
|
$warn = 'Not this file' if $$item{DataReferenceIndex}; # (can only extract from "this file")
|
9036
9045
|
unless (($$item{Extents} and @{$$item{Extents}}) or $warn) {
|
9037
9046
|
$warn = "No Extents for $type item";
|
9038
|
-
$et->
|
9047
|
+
$et->Warn($warn) if $name;
|
9039
9048
|
}
|
9040
9049
|
if ($warn) {
|
9041
9050
|
$et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
|
@@ -9099,7 +9108,7 @@ sub HandleItemInfo($)
|
|
9099
9108
|
$et->VerboseDump(\$buff);
|
9100
9109
|
} else {
|
9101
9110
|
$warn = "Error inflating $name metadata";
|
9102
|
-
$et->
|
9111
|
+
$et->Warn($warn);
|
9103
9112
|
$et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
|
9104
9113
|
next;
|
9105
9114
|
}
|
@@ -9188,7 +9197,7 @@ sub HandleItemInfo($)
|
|
9188
9197
|
sub EEWarn($)
|
9189
9198
|
{
|
9190
9199
|
my $et = shift;
|
9191
|
-
$et->
|
9200
|
+
$et->Warn('The ExtractEmbedded option may find more tags in the media data',3);
|
9192
9201
|
}
|
9193
9202
|
|
9194
9203
|
#------------------------------------------------------------------------------
|
@@ -9675,7 +9684,7 @@ sub ProcessMOV($$;$)
|
|
9675
9684
|
$warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
|
9676
9685
|
last;
|
9677
9686
|
} elsif ($et->Options('LargeFileSupport') eq '2') {
|
9678
|
-
$et->
|
9687
|
+
$et->Warn('Processing large atom (LargeFileSupport is 2)');
|
9679
9688
|
}
|
9680
9689
|
}
|
9681
9690
|
$size = $hi * 4294967296 + $lo - 16;
|
@@ -9690,7 +9699,7 @@ sub ProcessMOV($$;$)
|
|
9690
9699
|
if ($$et{ValidatePath}{$path} and not $dupTagOK{$tag} and not $dupDirOK{$dirID}) {
|
9691
9700
|
my $i = Get32u(\$tag,0);
|
9692
9701
|
my $str = $i < 255 ? "index $i" : "tag '" . PrintableTagID($tag,2) . "'";
|
9693
|
-
$et->
|
9702
|
+
$et->Warn("Duplicate $str at " . join('-', @{$$et{PATH}}));
|
9694
9703
|
$$et{ValidatePath} = { } if $path eq 'MOV-moov'; # avoid warnings for all contained dups
|
9695
9704
|
}
|
9696
9705
|
$$et{ValidatePath}{$path} = 1;
|