exiftool_vendored 12.57.0 → 12.59.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 +39 -0
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -0
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +76 -57
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -14
- data/bin/lib/Image/ExifTool/Canon.pm +26 -6
- data/bin/lib/Image/ExifTool/DJI.pm +28 -2
- data/bin/lib/Image/ExifTool/Exif.pm +24 -5
- data/bin/lib/Image/ExifTool/FlashPix.pm +28 -10
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
- data/bin/lib/Image/ExifTool/LIF.pm +10 -2
- data/bin/lib/Image/ExifTool/LNK.pm +5 -4
- data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +9 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +390 -114
- data/bin/lib/Image/ExifTool/Olympus.pm +87 -7
- data/bin/lib/Image/ExifTool/PNG.pm +15 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +16 -11
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +38 -6
- data/bin/lib/Image/ExifTool/README +8 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +41 -13
- data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +4 -4
- data/bin/lib/Image/ExifTool/Sony.pm +23 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4464 -4441
- data/bin/lib/Image/ExifTool/TagNames.pod +117 -36
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +49 -0
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +74 -14
- data/bin/lib/Image/ExifTool/XMP.pm +19 -4
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool.pm +131 -17
- data/bin/lib/Image/ExifTool.pod +40 -5
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
40
40
|
use Image::ExifTool::Exif;
|
|
41
41
|
use Image::ExifTool::APP12;
|
|
42
42
|
|
|
43
|
-
$VERSION = '2.
|
|
43
|
+
$VERSION = '2.81';
|
|
44
44
|
|
|
45
45
|
sub PrintLensInfo($$$);
|
|
46
46
|
|
|
@@ -3165,21 +3165,38 @@ my %indexInfo = (
|
|
|
3165
3165
|
PrintHex => 1,
|
|
3166
3166
|
ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
|
|
3167
3167
|
ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
|
|
3168
|
-
PrintConv => [
|
|
3168
|
+
PrintConv => [ # herb values added:
|
|
3169
|
+
# based on code of W.P. in https://exiftool.org/forum/index.php?topic=14144.0
|
|
3169
3170
|
{
|
|
3170
|
-
0x00 => '(none)',
|
|
3171
|
-
0x01 => 'Center',
|
|
3171
|
+
# 0x00 => '(none)',
|
|
3172
|
+
# 0x01 => 'Center',
|
|
3172
3173
|
# need to fill this in...
|
|
3174
|
+
0x00 => '(none)',
|
|
3175
|
+
0x02 => 'Top-center (horizontal)',
|
|
3176
|
+
0x04 => 'Right (horizontal)',
|
|
3177
|
+
0x05 => 'Mid-right (horizontal)',
|
|
3178
|
+
0x06 => 'Center (horizontal)',
|
|
3179
|
+
0x07 => 'Mid-left (horizontal)',
|
|
3180
|
+
0x08 => 'Left (horizontal)',
|
|
3181
|
+
0x0a => 'Bottom-center (horizontal)',
|
|
3182
|
+
0x0c => 'Top-center (vertical)',
|
|
3183
|
+
0x0f => 'Right (vertical)',
|
|
3184
|
+
0x15 => 'Bottom-center (vertical)',
|
|
3185
|
+
0x10 => 'Mid-right (vertical)',
|
|
3186
|
+
0x11 => 'Center (vertical)',
|
|
3187
|
+
0x12 => 'Mid-left (vertical)',
|
|
3188
|
+
0x13 => 'Left (vertical)',
|
|
3173
3189
|
},
|
|
3174
3190
|
{
|
|
3175
3191
|
0x00 => 'Single Target',
|
|
3176
3192
|
0x40 => 'All Target', # (guess)
|
|
3177
3193
|
},
|
|
3178
3194
|
]
|
|
3179
|
-
},{ #
|
|
3195
|
+
},{ #herb all camera model except E-Mxxx and OM-x
|
|
3180
3196
|
Name => 'AFPoint',
|
|
3197
|
+
Condition => '$$self{Model} !~ /^(E-M|OM-)/ ',
|
|
3181
3198
|
Writable => 'int16u',
|
|
3182
|
-
Notes => 'other
|
|
3199
|
+
Notes => 'models other than E-Mxxx and OM-x',
|
|
3183
3200
|
RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
|
|
3184
3201
|
PrintConv => {
|
|
3185
3202
|
# (E-P1 always writes 0, maybe other models do too - PH)
|
|
@@ -3189,10 +3206,73 @@ my %indexInfo = (
|
|
|
3189
3206
|
3 => 'Center (vertical)', #6 (E-510)
|
|
3190
3207
|
255 => 'None',
|
|
3191
3208
|
},
|
|
3209
|
+
},{ #herb all newer models E-Mxxx and OM-x; we do not know details
|
|
3210
|
+
Name => 'AFPoint',
|
|
3211
|
+
Writable => 'int16u',
|
|
3212
|
+
Notes => 'other models',
|
|
3192
3213
|
}
|
|
3193
3214
|
],
|
|
3194
3215
|
# 0x31a Continuous AF parameters?
|
|
3195
|
-
#
|
|
3216
|
+
0x31b => [ #herb, based on investigations of abgestumpft: https://exiftool.org/forum/index.php?topic=14527.0
|
|
3217
|
+
# for newer models E-Mxxx and OM-x
|
|
3218
|
+
{
|
|
3219
|
+
Name => 'AFPointDetails',
|
|
3220
|
+
Condition => '$$self{Model} =~ m/^E-M|^OM-/ ',
|
|
3221
|
+
Writable => 'int16u',
|
|
3222
|
+
Notes => 'models E-Mxxx and OM-x',
|
|
3223
|
+
PrintHex => 1,
|
|
3224
|
+
ValueConv => '(($val >> 13) & 0x7) . " " . (($val >> 12) & 0x1) . " " . (($val >> 11) & 0x1) . " " .
|
|
3225
|
+
# subject detect face and eye half press
|
|
3226
|
+
(($val >> 8) & 0x3) . " " . (($val >> 7) & 0x1) . " " . (($val >> 5) & 0x1) . " " .
|
|
3227
|
+
# eye AF face detect x-AF with MF
|
|
3228
|
+
(($val >> 4) & 0x1) . " " . (($val >> 3) & 0x1) . " " . ($val & 0x7)',
|
|
3229
|
+
# release object found MF...
|
|
3230
|
+
PrintConvColumns => 4,
|
|
3231
|
+
PrintConv => [
|
|
3232
|
+
{
|
|
3233
|
+
# should be identical to AISubjectTrackingMode
|
|
3234
|
+
0 => 'No Subject Detection',
|
|
3235
|
+
1 => 'Motorsports',
|
|
3236
|
+
2 => 'Airplanes',
|
|
3237
|
+
3 => 'Trains',
|
|
3238
|
+
4 => 'Birds',
|
|
3239
|
+
5 => 'Dogs & Cats',
|
|
3240
|
+
},{
|
|
3241
|
+
0 => 'Face Priority',
|
|
3242
|
+
1 => 'Target Priority',
|
|
3243
|
+
},{
|
|
3244
|
+
0 => 'Normal AF',
|
|
3245
|
+
1 => 'AF on Half Press',
|
|
3246
|
+
},{
|
|
3247
|
+
0 => 'No Eye-AF',
|
|
3248
|
+
1 => 'Right Eye Priority',
|
|
3249
|
+
2 => 'Left Eye Priority',
|
|
3250
|
+
3 => 'Both Eyes Priority',
|
|
3251
|
+
},{
|
|
3252
|
+
0 => 'No Face Detection',
|
|
3253
|
+
1 => 'Face Detection',
|
|
3254
|
+
},{
|
|
3255
|
+
0 => 'No MF',
|
|
3256
|
+
1 => 'With MF',
|
|
3257
|
+
},{
|
|
3258
|
+
0 => 'AF Priority',
|
|
3259
|
+
1 => 'Release Priority',
|
|
3260
|
+
},{
|
|
3261
|
+
0 => 'No Object found',
|
|
3262
|
+
1 => 'Object found',
|
|
3263
|
+
},{
|
|
3264
|
+
0 => 'MF',
|
|
3265
|
+
1 => 'S-AF',
|
|
3266
|
+
2 => 'C-AF',
|
|
3267
|
+
6 => 'C-AF + TR',
|
|
3268
|
+
},
|
|
3269
|
+
],
|
|
3270
|
+
},{ # for older models
|
|
3271
|
+
Name => 'AFPointDetails',
|
|
3272
|
+
Writable => 'int16u',
|
|
3273
|
+
Notes => 'other models',
|
|
3274
|
+
}
|
|
3275
|
+
],
|
|
3196
3276
|
0x328 => { #PH
|
|
3197
3277
|
Name => 'AFInfo',
|
|
3198
3278
|
SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' },
|
|
@@ -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.63';
|
|
40
40
|
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
|
@@ -1374,6 +1374,7 @@ sub ProcessPNG($$)
|
|
|
1374
1374
|
my $datCount = 0;
|
|
1375
1375
|
my $datBytes = 0;
|
|
1376
1376
|
my $fastScan = $et->Options('FastScan');
|
|
1377
|
+
my $md5 = $$et{ImageDataMD5};
|
|
1377
1378
|
my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
|
|
1378
1379
|
my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
|
|
1379
1380
|
|
|
@@ -1453,6 +1454,7 @@ sub ProcessPNG($$)
|
|
|
1453
1454
|
if ($datCount and $chunk ne $datChunk) {
|
|
1454
1455
|
my $s = $datCount > 1 ? 's' : '';
|
|
1455
1456
|
print $out "$fileType $datChunk ($datCount chunk$s, total $datBytes bytes)\n";
|
|
1457
|
+
print $out "$$et{INDENT}(ImageDataMD5: $datBytes bytes of $datChunk data)\n" if $md5;
|
|
1456
1458
|
$datCount = $datBytes = 0;
|
|
1457
1459
|
}
|
|
1458
1460
|
}
|
|
@@ -1539,7 +1541,17 @@ sub ProcessPNG($$)
|
|
|
1539
1541
|
}
|
|
1540
1542
|
# skip over data chunks if possible/necessary
|
|
1541
1543
|
} elsif (not $validate or $len > $chunkSizeLimit) {
|
|
1542
|
-
|
|
1544
|
+
if ($md5) {
|
|
1545
|
+
while ($len) {
|
|
1546
|
+
my $n = $len > 65536 ? 65536 : $len;
|
|
1547
|
+
$raf->Read($dbuf,$n) == $n or last;
|
|
1548
|
+
$md5->add($dbuf);
|
|
1549
|
+
$len -= $n;
|
|
1550
|
+
}
|
|
1551
|
+
$raf->Read($cbuf, 4) == 4 or $et->Warn('Truncated data'), last;
|
|
1552
|
+
} else {
|
|
1553
|
+
$raf->Seek($len + 4, 1) or $et->Warn('Seek error'), last;
|
|
1554
|
+
}
|
|
1543
1555
|
next;
|
|
1544
1556
|
}
|
|
1545
1557
|
} elsif ($wasDat and $isTxtChunk{$chunk}) {
|
|
@@ -1558,6 +1570,7 @@ sub ProcessPNG($$)
|
|
|
1558
1570
|
$et->Warn("Corrupted $fileType image") unless $wasEnd;
|
|
1559
1571
|
last;
|
|
1560
1572
|
}
|
|
1573
|
+
$md5->add($dbuf) if $md5 and $datChunk; # add to MD5 if necessary
|
|
1561
1574
|
if ($verbose or $validate or ($outfile and not $fastScan)) {
|
|
1562
1575
|
# check CRC when in verbose mode (since we don't care about speed)
|
|
1563
1576
|
my $crc = CalculateCRC(\$hbuf, undef, 4);
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
use Image::ExifTool::Exif;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.28';
|
|
25
25
|
|
|
26
26
|
sub ProcessJpgFromRaw($$$);
|
|
27
27
|
sub WriteJpgFromRaw($$$);
|
|
@@ -266,6 +266,7 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
|
266
266
|
PanasonicHack => 1,
|
|
267
267
|
OffsetPair => 0x117, # (use StripByteCounts as the offset pair)
|
|
268
268
|
NotRealPair => 1, # (to avoid Validate warning)
|
|
269
|
+
IsImageData => 1,
|
|
269
270
|
},
|
|
270
271
|
0x119 => {
|
|
271
272
|
Name => 'DistortionInfo',
|
|
@@ -296,6 +297,20 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
|
296
297
|
},
|
|
297
298
|
},
|
|
298
299
|
# 0x122 - int32u: RAWDataOffset for the GH5s/GX9, or pointer to end of raw data for G9 (forum9295)
|
|
300
|
+
0x127 => { #github193 (newer models)
|
|
301
|
+
Name => 'JpgFromRaw2',
|
|
302
|
+
Groups => { 2 => 'Preview' },
|
|
303
|
+
DataTag => 'JpgFromRaw2',
|
|
304
|
+
RawConv => '$self->ValidateImage(\$val,$tag)',
|
|
305
|
+
},
|
|
306
|
+
0x13b => {
|
|
307
|
+
Name => 'Artist',
|
|
308
|
+
Groups => { 2 => 'Author' },
|
|
309
|
+
Permanent => 1, # (so we don't add it if the model doesn't write it)
|
|
310
|
+
Writable => 'string',
|
|
311
|
+
WriteGroup => 'IFD0',
|
|
312
|
+
RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
|
|
313
|
+
},
|
|
299
314
|
0x2bc => { # PH Extension!!
|
|
300
315
|
Name => 'ApplicationNotes', # (writable directory!)
|
|
301
316
|
Writable => 'int8u',
|
|
@@ -318,6 +333,17 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
|
318
333
|
noise-reduction strengths the R, G and B channels
|
|
319
334
|
},
|
|
320
335
|
},
|
|
336
|
+
0x8298 => { #github193
|
|
337
|
+
Name => 'Copyright',
|
|
338
|
+
Groups => { 2 => 'Author' },
|
|
339
|
+
Permanent => 1, # (so we don't add it if the model doesn't write it)
|
|
340
|
+
Format => 'undef',
|
|
341
|
+
Writable => 'string',
|
|
342
|
+
WriteGroup => 'IFD0',
|
|
343
|
+
RawConv => $Image::ExifTool::Exif::Main{0x8298}{RawConv},
|
|
344
|
+
RawConvInv => $Image::ExifTool::Exif::Main{0x8298}{RawConvInv},
|
|
345
|
+
PrintConvInv => $Image::ExifTool::Exif::Main{0x8298}{PrintConvInv},
|
|
346
|
+
},
|
|
321
347
|
0x83bb => { # PH Extension!!
|
|
322
348
|
Name => 'IPTC-NAA', # (writable directory!)
|
|
323
349
|
Format => 'undef', # convert binary values as undef
|
|
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
|
|
|
58
58
|
use Image::ExifTool::GPS;
|
|
59
59
|
use Image::ExifTool::HP;
|
|
60
60
|
|
|
61
|
-
$VERSION = '3.
|
|
61
|
+
$VERSION = '3.42';
|
|
62
62
|
|
|
63
63
|
sub CryptShutterCount($$);
|
|
64
64
|
sub PrintFilter($$$);
|
|
@@ -72,10 +72,7 @@ sub DecodeAFPoints($$$$;$);
|
|
|
72
72
|
Notes => q{
|
|
73
73
|
The first number gives the series of the lens, and the second identifies the
|
|
74
74
|
lens model. Note that newer series numbers may not always be properly
|
|
75
|
-
identified by cameras running older firmware versions.
|
|
76
|
-
been added to differentiate lenses which would otherwise have the same
|
|
77
|
-
LensType, and are used by the Composite LensID tag when attempting to
|
|
78
|
-
identify the specific lens model.
|
|
75
|
+
identified by cameras running older firmware versions.
|
|
79
76
|
},
|
|
80
77
|
OTHER => sub {
|
|
81
78
|
my ($val, $inv, $conv) = @_;
|
|
@@ -4081,6 +4078,7 @@ my %binaryDataAttrs = (
|
|
|
4081
4078
|
ValueConvInv => '$val=~s/\.\d+$//; $val',
|
|
4082
4079
|
PrintConv => \%pentaxLensTypes,
|
|
4083
4080
|
SeparateTable => 1,
|
|
4081
|
+
PrintInt => 1,
|
|
4084
4082
|
},
|
|
4085
4083
|
3 => { #PH
|
|
4086
4084
|
Name => 'ExtenderStatus',
|
|
@@ -4104,6 +4102,7 @@ my %binaryDataAttrs = (
|
|
|
4104
4102
|
ValueConvInv => '$val=~s/\.\d+$//; $val',
|
|
4105
4103
|
PrintConv => \%pentaxLensTypes,
|
|
4106
4104
|
SeparateTable => 1,
|
|
4105
|
+
PrintInt => 1,
|
|
4107
4106
|
},
|
|
4108
4107
|
3 => {
|
|
4109
4108
|
Name => 'LensData',
|
|
@@ -4139,6 +4138,7 @@ my %binaryDataAttrs = (
|
|
|
4139
4138
|
},
|
|
4140
4139
|
PrintConv => \%pentaxLensTypes,
|
|
4141
4140
|
SeparateTable => 1,
|
|
4141
|
+
PrintInt => 1,
|
|
4142
4142
|
},
|
|
4143
4143
|
4 => {
|
|
4144
4144
|
Name => 'LensData',
|
|
@@ -4174,6 +4174,7 @@ my %binaryDataAttrs = (
|
|
|
4174
4174
|
},
|
|
4175
4175
|
PrintConv => \%pentaxLensTypes,
|
|
4176
4176
|
SeparateTable => 1,
|
|
4177
|
+
PrintInt => 1,
|
|
4177
4178
|
},
|
|
4178
4179
|
13 => {
|
|
4179
4180
|
Name => 'LensData',
|
|
@@ -4209,6 +4210,7 @@ my %binaryDataAttrs = (
|
|
|
4209
4210
|
},
|
|
4210
4211
|
PrintConv => \%pentaxLensTypes,
|
|
4211
4212
|
SeparateTable => 1,
|
|
4213
|
+
PrintInt => 1,
|
|
4212
4214
|
},
|
|
4213
4215
|
12 => {
|
|
4214
4216
|
Name => 'LensData',
|
|
@@ -4245,6 +4247,7 @@ my %binaryDataAttrs = (
|
|
|
4245
4247
|
},
|
|
4246
4248
|
PrintConv => \%pentaxLensTypes,
|
|
4247
4249
|
SeparateTable => 1,
|
|
4250
|
+
PrintInt => 1,
|
|
4248
4251
|
},
|
|
4249
4252
|
15 => {
|
|
4250
4253
|
Name => 'LensData',
|
|
@@ -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.08';
|
|
19
19
|
|
|
20
20
|
sub WritePhaseOne($$$);
|
|
21
21
|
sub ProcessPhaseOne($$$);
|
|
@@ -84,6 +84,7 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
|
|
|
84
84
|
Name => 'RawData',
|
|
85
85
|
Format => 'undef', # (actually 2-byte integers, but don't convert)
|
|
86
86
|
Binary => 1,
|
|
87
|
+
IsImageData => 1,
|
|
87
88
|
PutFirst => 1,
|
|
88
89
|
Writable => 0,
|
|
89
90
|
Drop => 1, # don't copy to other file types
|
|
@@ -584,6 +585,7 @@ sub ProcessPhaseOne($$$)
|
|
|
584
585
|
my $dirLen = $$dirInfo{DirLen} || $$dirInfo{DataLen} - $dirStart;
|
|
585
586
|
my $binary = $et->Options('Binary');
|
|
586
587
|
my $verbose = $et->Options('Verbose');
|
|
588
|
+
my $md5 = $$et{ImageDataMD5};
|
|
587
589
|
my $htmlDump = $$et{HTML_DUMP};
|
|
588
590
|
|
|
589
591
|
return 0 if $dirLen < 12;
|
|
@@ -676,6 +678,17 @@ sub ProcessPhaseOne($$$)
|
|
|
676
678
|
}
|
|
677
679
|
}
|
|
678
680
|
}
|
|
681
|
+
if ($md5 and $tagInfo and $$tagInfo{IsImageData}) {
|
|
682
|
+
my ($pos, $len) = ($valuePtr, $size);
|
|
683
|
+
while ($len) {
|
|
684
|
+
my $n = $len > 65536 ? 65536 : $len;
|
|
685
|
+
my $tmp = substr($$dataPt, $pos, $n);
|
|
686
|
+
$md5->add($tmp);
|
|
687
|
+
$len -= $n;
|
|
688
|
+
$pos += $n;
|
|
689
|
+
}
|
|
690
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $size bytes of PhaseOne:$$tagInfo{Name})\n");
|
|
691
|
+
}
|
|
679
692
|
my %parms = (
|
|
680
693
|
DirName => $ifdType,
|
|
681
694
|
Index => $index,
|
|
@@ -28,7 +28,7 @@ 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.69';
|
|
32
32
|
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
|
34
34
|
sub WritePhotoshop($$$);
|
|
@@ -74,7 +74,7 @@ my %thumbnailInfo = (
|
|
|
74
74
|
my @tags = qw{ImageWidth ImageHeight FileType};
|
|
75
75
|
my $info = $et->ImageInfo(\$val, @tags);
|
|
76
76
|
my ($w, $h, $type) = @$info{@tags};
|
|
77
|
-
$w and $h and $type eq 'JPEG' or warn("Not a valid JPEG image\n"), return undef;
|
|
77
|
+
$w and $h and $type and $type eq 'JPEG' or warn("Not a valid JPEG image\n"), return undef;
|
|
78
78
|
my $wbytes = int(($w * 24 + 31) / 32) * 4;
|
|
79
79
|
return pack('N6n2', 1, $w, $h, $wbytes, $wbytes * $h, length($val), 24, 1) . $val;
|
|
80
80
|
},
|
|
@@ -706,7 +706,7 @@ sub ProcessLayersAndMask($$$)
|
|
|
706
706
|
local $_;
|
|
707
707
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
708
708
|
my $raf = $$dirInfo{RAF};
|
|
709
|
-
my $fileType = $$et{
|
|
709
|
+
my $fileType = $$et{FileType};
|
|
710
710
|
my $data;
|
|
711
711
|
|
|
712
712
|
return 0 unless $fileType eq 'PSD' or $fileType eq 'PSB'; # (no layer section in CS1 files)
|
|
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
47
47
|
use Image::ExifTool::Exif;
|
|
48
48
|
use Image::ExifTool::GPS;
|
|
49
49
|
|
|
50
|
-
$VERSION = '2.
|
|
50
|
+
$VERSION = '2.84';
|
|
51
51
|
|
|
52
52
|
sub ProcessMOV($$;$);
|
|
53
53
|
sub ProcessKeys($$$);
|
|
@@ -447,15 +447,16 @@ 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 ImageDataMD5
|
|
451
|
+
my %md5Box = ( vide => { %eeStd }, soun => { %eeStd } );
|
|
452
|
+
|
|
450
453
|
# boxes and their containers for the various handler types that we want to save
|
|
451
454
|
# when the ExtractEmbedded is enabled (currently only the 'gps ' container name is
|
|
452
455
|
# used, but others have been checked against all available sample files and may be
|
|
453
456
|
# useful in the future if the names are used for different boxes on other locations)
|
|
454
457
|
my %eeBox = (
|
|
455
458
|
# (note: vide is only processed if specific atoms exist in the VideoSampleDesc)
|
|
456
|
-
vide => { %eeStd,
|
|
457
|
-
JPEG => 'stsd',
|
|
458
|
-
},
|
|
459
|
+
vide => { %eeStd, JPEG => 'stsd' },
|
|
459
460
|
text => { %eeStd },
|
|
460
461
|
meta => { %eeStd },
|
|
461
462
|
sbtl => { %eeStd },
|
|
@@ -1976,7 +1977,7 @@ my %eeBox2 = (
|
|
|
1976
1977
|
Name => 'SanyoMOV',
|
|
1977
1978
|
Condition => q{
|
|
1978
1979
|
$$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
|
|
1979
|
-
|
|
1980
|
+
$$self{FileType} eq "MOV"
|
|
1980
1981
|
},
|
|
1981
1982
|
SubDirectory => {
|
|
1982
1983
|
TagTable => 'Image::ExifTool::Sanyo::MOV',
|
|
@@ -1987,7 +1988,7 @@ my %eeBox2 = (
|
|
|
1987
1988
|
Name => 'SanyoMP4',
|
|
1988
1989
|
Condition => q{
|
|
1989
1990
|
$$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
|
|
1990
|
-
|
|
1991
|
+
$$self{FileType} eq "MP4"
|
|
1991
1992
|
},
|
|
1992
1993
|
SubDirectory => {
|
|
1993
1994
|
TagTable => 'Image::ExifTool::Sanyo::MP4',
|
|
@@ -7161,7 +7162,7 @@ my %eeBox2 = (
|
|
|
7161
7162
|
$$self{AudioFormat} = $val;
|
|
7162
7163
|
return undef unless $val =~ /^[\w ]{4}$/i;
|
|
7163
7164
|
# check for protected audio format
|
|
7164
|
-
$self->OverrideFileType('M4P') if $val eq 'drms' and $$self{
|
|
7165
|
+
$self->OverrideFileType('M4P') if $val eq 'drms' and $$self{FileType} eq 'M4A';
|
|
7165
7166
|
return $val;
|
|
7166
7167
|
},
|
|
7167
7168
|
# see this link for print conversions (not complete):
|
|
@@ -9285,7 +9286,8 @@ sub ProcessMOV($$;$)
|
|
|
9285
9286
|
$$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
|
|
9286
9287
|
|
|
9287
9288
|
my $ee = $$et{OPTIONS}{ExtractEmbedded};
|
|
9288
|
-
|
|
9289
|
+
my $md5 = $$et{ImageDataMD5};
|
|
9290
|
+
if ($ee or $md5) {
|
|
9289
9291
|
$unkOpt = $$et{OPTIONS}{Unknown};
|
|
9290
9292
|
require 'Image/ExifTool/QuickTimeStream.pl';
|
|
9291
9293
|
}
|
|
@@ -9367,7 +9369,7 @@ sub ProcessMOV($$;$)
|
|
|
9367
9369
|
# set flag to store additional information for ExtractEmbedded option
|
|
9368
9370
|
my $handlerType = $$et{HandlerType};
|
|
9369
9371
|
if ($eeBox{$handlerType} and $eeBox{$handlerType}{$tag}) {
|
|
9370
|
-
if ($ee) {
|
|
9372
|
+
if ($ee or $md5) {
|
|
9371
9373
|
# (there is another 'gps ' box with a track log that doesn't contain offsets)
|
|
9372
9374
|
if ($tag ne 'gps ' or $eeBox{$handlerType}{$tag} eq $dirID) {
|
|
9373
9375
|
$eeTag = 1;
|
|
@@ -9379,6 +9381,9 @@ sub ProcessMOV($$;$)
|
|
|
9379
9381
|
} elsif ($ee and $ee > 1 and $eeBox2{$handlerType} and $eeBox2{$handlerType}{$tag}) {
|
|
9380
9382
|
$eeTag = 1;
|
|
9381
9383
|
$$et{OPTIONS}{Unknown} = 1;
|
|
9384
|
+
} elsif ($md5 and $md5Box{$handlerType} and $md5Box{$handlerType}{$tag}) {
|
|
9385
|
+
$eeTag = 1;
|
|
9386
|
+
$$et{OPTIONS}{Unknown} = 1;
|
|
9382
9387
|
}
|
|
9383
9388
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
|
9384
9389
|
|
|
@@ -9611,7 +9616,7 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9611
9616
|
}
|
|
9612
9617
|
if ($tag eq 'stbl') {
|
|
9613
9618
|
# process sample data when exiting SampleTable box if extracting embedded
|
|
9614
|
-
ProcessSamples($et) if $ee;
|
|
9619
|
+
ProcessSamples($et) if $ee or $md5;
|
|
9615
9620
|
} elsif ($tag eq 'minf') {
|
|
9616
9621
|
$$et{HandlerType} = ''; # reset handler type at end of media info box
|
|
9617
9622
|
}
|
|
@@ -9809,7 +9814,7 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9809
9814
|
++$index if defined $index;
|
|
9810
9815
|
}
|
|
9811
9816
|
# tweak file type based on track content ("iso*" and "dash" ftyp only)
|
|
9812
|
-
if ($topLevel and $$et{
|
|
9817
|
+
if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
|
|
9813
9818
|
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
|
|
9814
9819
|
$$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
|
|
9815
9820
|
{
|
|
@@ -599,6 +599,8 @@ my %insvLimit = (
|
|
|
599
599
|
0x1a => 'Firmware',
|
|
600
600
|
0x2a => {
|
|
601
601
|
Name => 'Parameters',
|
|
602
|
+
# (see https://exiftool.org/forum/index.php?msg=78942)
|
|
603
|
+
Notes => 'number of lenses, 6-axis orientation of each lens, raw resolution',
|
|
602
604
|
ValueConv => '$val =~ tr/_/ /; $val',
|
|
603
605
|
},
|
|
604
606
|
);
|
|
@@ -1125,23 +1127,37 @@ sub Process_text($$$;$)
|
|
|
1125
1127
|
# Inputs: 0) ExifTool ref
|
|
1126
1128
|
# Notes: Also accesses ExifTool RAF*, SET_GROUP1, HandlerType, MetaFormat,
|
|
1127
1129
|
# ee*, and avcC elements (* = must exist)
|
|
1130
|
+
# - may be called either due to ExtractEmbedded option, or ImageDataMD5 requested
|
|
1131
|
+
# - MD5 includes only video and audio data
|
|
1128
1132
|
sub ProcessSamples($)
|
|
1129
1133
|
{
|
|
1130
1134
|
my $et = shift;
|
|
1131
1135
|
my ($raf, $ee) = @$et{qw(RAF ee)};
|
|
1132
|
-
my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent);
|
|
1136
|
+
my ($i, $buff, $pos, $hdrLen, $hdrFmt, @time, @dur, $oldIndent, $md5);
|
|
1133
1137
|
|
|
1134
1138
|
return unless $ee;
|
|
1135
1139
|
delete $$et{ee}; # use only once
|
|
1136
1140
|
|
|
1137
|
-
|
|
1141
|
+
my $eeOpt = $et->Options('ExtractEmbedded');
|
|
1138
1142
|
my $type = $$et{HandlerType} || '';
|
|
1139
1143
|
if ($type eq 'vide') {
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1144
|
+
# only process specific types of video streams
|
|
1145
|
+
$md5 = $$et{ImageDataMD5};
|
|
1146
|
+
# only process specific video types if ExtractEmbedded was used
|
|
1147
|
+
# (otherwise we are only here to calculate the audio/video MD5)
|
|
1148
|
+
if ($eeOpt) {
|
|
1149
|
+
if ($$ee{avcC}) { $type = 'avcC' }
|
|
1150
|
+
elsif ($$ee{JPEG}) { $type = 'JPEG' }
|
|
1151
|
+
else { return unless $md5 }
|
|
1152
|
+
}
|
|
1153
|
+
} elsif ($type eq 'soun') {
|
|
1154
|
+
$md5 = $$et{ImageDataMD5};
|
|
1155
|
+
return unless $md5;
|
|
1156
|
+
} else {
|
|
1157
|
+
return unless $eeOpt; # (don't do MD5 on other types)
|
|
1143
1158
|
}
|
|
1144
1159
|
|
|
1160
|
+
my $md5size = 0;
|
|
1145
1161
|
my ($start, $size) = @$ee{qw(start size)};
|
|
1146
1162
|
#
|
|
1147
1163
|
# determine sample start offsets from chunk offsets (stco) and sample-to-chunk table (stsc),
|
|
@@ -1160,13 +1176,16 @@ sub ProcessSamples($)
|
|
|
1160
1176
|
$timeDelta = shift @$stts;
|
|
1161
1177
|
}
|
|
1162
1178
|
my $ts = $$et{MediaTS} || 1;
|
|
1179
|
+
my @chunkSize; # total size of each chunk
|
|
1163
1180
|
foreach $chunkStart (@$stco) {
|
|
1164
1181
|
if ($iChunk >= $nextChunk and @$stsc) {
|
|
1165
1182
|
($startChunk, $samplesPerChunk, $descIdx) = @{shift @$stsc};
|
|
1166
1183
|
$nextChunk = $$stsc[0][0] if @$stsc;
|
|
1167
1184
|
}
|
|
1168
1185
|
@$size < @$start + $samplesPerChunk and $et->WarnOnce('Sample size error'), last;
|
|
1186
|
+
last unless defined $chunkStart and length $chunkStart;
|
|
1169
1187
|
my $sampleStart = $chunkStart;
|
|
1188
|
+
my $chunkSize = 0;
|
|
1170
1189
|
Sample: for ($i=0; ; ) {
|
|
1171
1190
|
push @$start, $sampleStart;
|
|
1172
1191
|
if (defined $time) {
|
|
@@ -1184,12 +1203,19 @@ Sample: for ($i=0; ; ) {
|
|
|
1184
1203
|
--$timeCount;
|
|
1185
1204
|
}
|
|
1186
1205
|
# (eventually should use the description indices: $descIdx)
|
|
1206
|
+
$chunkSize += $$size[$#$start];
|
|
1187
1207
|
last if ++$i >= $samplesPerChunk;
|
|
1188
1208
|
$sampleStart += $$size[$#$start];
|
|
1189
1209
|
}
|
|
1210
|
+
push @chunkSize, $chunkSize;
|
|
1190
1211
|
++$iChunk;
|
|
1191
1212
|
}
|
|
1192
1213
|
@$start == @$size or $et->WarnOnce('Incorrect sample start/size count'), return;
|
|
1214
|
+
# process as chunks if we are only interested in calculating MD5
|
|
1215
|
+
if ($type eq 'soun' or $type eq 'vide') {
|
|
1216
|
+
$start = $stco;
|
|
1217
|
+
$size = \@chunkSize;
|
|
1218
|
+
}
|
|
1193
1219
|
}
|
|
1194
1220
|
#
|
|
1195
1221
|
# extract and parse the sample data
|
|
@@ -1221,6 +1247,10 @@ Sample: for ($i=0; ; ) {
|
|
|
1221
1247
|
my $size = $$size[$i];
|
|
1222
1248
|
next unless $raf->Seek($$start[$i], 0) and $raf->Read($buff, $size) == $size;
|
|
1223
1249
|
|
|
1250
|
+
if ($md5) {
|
|
1251
|
+
$md5->add($buff);
|
|
1252
|
+
$md5size += length $buff;
|
|
1253
|
+
}
|
|
1224
1254
|
if ($type eq 'avcC') {
|
|
1225
1255
|
next if length($buff) <= $hdrLen;
|
|
1226
1256
|
# scan through all NAL units and send them to ParseH264Video()
|
|
@@ -1347,6 +1377,8 @@ Sample: for ($i=0; ; ) {
|
|
|
1347
1377
|
SetGPSDateTime($et, $tagTbl, $time[$i]) if $$et{FoundGPSLatitude} and not $$et{FoundGPSDateTime};
|
|
1348
1378
|
}
|
|
1349
1379
|
if ($verbose) {
|
|
1380
|
+
my $str = $type eq 'soun' ? 'Audio' : 'Video';
|
|
1381
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $md5size bytes of $str data)\n") if $md5size;
|
|
1350
1382
|
$$et{INDENT} = $oldIndent;
|
|
1351
1383
|
$et->VPrint(0, "--------------------------\n");
|
|
1352
1384
|
}
|
|
@@ -1488,7 +1520,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1488
1520
|
# Kenwood dashcam sometimes stores absolute year and local time
|
|
1489
1521
|
# (but sometimes year since 2000 and UTC time in same video!)
|
|
1490
1522
|
require Time::Local;
|
|
1491
|
-
my $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$yr
|
|
1523
|
+
my $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$yr);
|
|
1492
1524
|
($sec,$min,$hr,$day,$mon,$yr) = gmtime($time);
|
|
1493
1525
|
$yr += 1900;
|
|
1494
1526
|
++$mon;
|
|
@@ -411,6 +411,10 @@ numerical, and generated automatically otherwise.
|
|
|
411
411
|
|
|
412
412
|
'IsComposite' - flag set for Composite tags
|
|
413
413
|
|
|
414
|
+
'IsImageData' - flag set if this is an image data offset to
|
|
415
|
+
be included in ImageDataMD5 calculation. Must have an
|
|
416
|
+
OffsetPair entry which is the ID of the corresponding size.
|
|
417
|
+
|
|
414
418
|
'IsOffset' - flag set if the tag represents an offset to some
|
|
415
419
|
data, and causes value will be adjusted to an absolute file
|
|
416
420
|
offset. If set to 2, the offset base of the parent directory
|
|
@@ -472,6 +476,10 @@ numerical, and generated automatically otherwise.
|
|
|
472
476
|
documentation, padded to the number of digits given by the
|
|
473
477
|
PrintHex value.
|
|
474
478
|
|
|
479
|
+
'PrintInt' - remove decimal part of tag ID in HTML tag name
|
|
480
|
+
documentation. (To avoid confusing ExifTool users because
|
|
481
|
+
the LensType decimal numbers are for internal use only.)
|
|
482
|
+
|
|
475
483
|
'PrintSort' - causes PrintConv values to be sorted by value
|
|
476
484
|
rather than key in the HTML tag name documentation.
|
|
477
485
|
|