exiftool_vendored 12.57.0 → 12.58.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 +14 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +25 -21
- 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 +2 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -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/Nikon.pm +385 -110
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +5 -5
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/README +8 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- 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 +4457 -4441
- data/bin/lib/Image/ExifTool/TagNames.pod +76 -12
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
- data/bin/lib/Image/ExifTool/Writer.pl +3 -1
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +57 -12
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
|
12
12
|
=head1 TAG TABLES
|
|
13
13
|
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
|
15
|
-
They contain a total of
|
|
15
|
+
They contain a total of 26381 tags, with 16854 unique tag names.
|
|
16
16
|
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
|
@@ -28,7 +28,8 @@ gives the order of values for a serial data stream.
|
|
|
28
28
|
A B<Tag Name> is the handle by which the information is accessed in
|
|
29
29
|
ExifTool. In some instances, more than one name may correspond to a single
|
|
30
30
|
tag ID. In these cases, the actual name used depends on the context in
|
|
31
|
-
which the information is found.
|
|
31
|
+
which the information is found. Valid characters in a tag name are A-Z,
|
|
32
|
+
a-z, 0-9, hyphen (-) and underline (_). Case is not significant. A
|
|
32
33
|
question mark (C<?>) after a tag name indicates that the information is
|
|
33
34
|
either not understood, not verified, or not very useful -- these tags are
|
|
34
35
|
not extracted by ExifTool unless the Unknown (-u) option is enabled. Be
|
|
@@ -124,6 +125,8 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
|
124
125
|
FPXR FlashPix
|
|
125
126
|
InfiRayFactory InfiRay Factory
|
|
126
127
|
ThermalParams DJI ThermalParams
|
|
128
|
+
ThermalParams2 DJI ThermalParams2
|
|
129
|
+
ThermalParams3 DJI ThermalParams3
|
|
127
130
|
PreviewImage no
|
|
128
131
|
'APP5' RMETA Ricoh RMETA
|
|
129
132
|
SamsungUniqueID Samsung APP5
|
|
@@ -140,6 +143,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
|
140
143
|
Huawei Unknown
|
|
141
144
|
Qualcomm Qualcomm
|
|
142
145
|
InfiRayOpMode InfiRay OpMode
|
|
146
|
+
DJI-DBG DJI Info
|
|
143
147
|
'APP8' SPIFF JPEG SPIFF
|
|
144
148
|
InfiRayIsothermal InfiRay Isothermal
|
|
145
149
|
'APP9' MediaJukebox JPEG MediaJukebox
|
|
@@ -10866,6 +10870,30 @@ Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.
|
|
|
10866
10870
|
86 DB no
|
|
10867
10871
|
88 KK no
|
|
10868
10872
|
|
|
10873
|
+
=head3 DJI ThermalParams2 Tags
|
|
10874
|
+
|
|
10875
|
+
Thermal parameters extracted from APP4 of DJI M3T RJPEG files.
|
|
10876
|
+
|
|
10877
|
+
Index1 Tag Name Writable
|
|
10878
|
+
------ -------- --------
|
|
10879
|
+
0 AmbientTemperature no
|
|
10880
|
+
4 ObjectDistance no
|
|
10881
|
+
8 Emissivity no
|
|
10882
|
+
12 RelativeHumidity no
|
|
10883
|
+
16 ReflectedTemperature no
|
|
10884
|
+
101 IDString no
|
|
10885
|
+
|
|
10886
|
+
=head3 DJI ThermalParams3 Tags
|
|
10887
|
+
|
|
10888
|
+
Thermal parameters extracted from APP4 of some DJI RJPEG files.
|
|
10889
|
+
|
|
10890
|
+
Index1 Tag Name Writable
|
|
10891
|
+
------ -------- --------
|
|
10892
|
+
4 RelativeHumidity no
|
|
10893
|
+
6 ObjectDistance no
|
|
10894
|
+
8 Emissivity no
|
|
10895
|
+
10 ReflectedTemperature no
|
|
10896
|
+
|
|
10869
10897
|
=head2 FLIR Tags
|
|
10870
10898
|
|
|
10871
10899
|
Information extracted from the maker notes of JPEG images from thermal
|
|
@@ -13707,6 +13735,8 @@ DiMAGE X and Xt.
|
|
|
13707
13735
|
ShotInfoD300b Nikon ShotInfoD300b
|
|
13708
13736
|
ShotInfoD300S Nikon ShotInfoD300S
|
|
13709
13737
|
ShotInfoD700 Nikon ShotInfoD700
|
|
13738
|
+
ShotInfoD780 Nikon ShotInfoD780
|
|
13739
|
+
ShotInfoD7500 Nikon ShotInfoD7500
|
|
13710
13740
|
ShotInfoD800 Nikon ShotInfoD800
|
|
13711
13741
|
ShotInfoD810 Nikon ShotInfoD810
|
|
13712
13742
|
ShotInfoD850 Nikon ShotInfoD850
|
|
@@ -14246,6 +14276,34 @@ firmware 1.02f.
|
|
|
14246
14276
|
647 ShutterCount int32u
|
|
14247
14277
|
804 CustomSettingsD700 NikonCustom SettingsD700
|
|
14248
14278
|
|
|
14279
|
+
=head3 Nikon ShotInfoD780 Tags
|
|
14280
|
+
|
|
14281
|
+
These tags are extracted from encrypted data in images from the D780.
|
|
14282
|
+
|
|
14283
|
+
Index Tag Name Writable
|
|
14284
|
+
----- -------- --------
|
|
14285
|
+
0 ShotInfoVersion no
|
|
14286
|
+
4 FirmwareVersion no
|
|
14287
|
+
156 OrientOffset Nikon OrientationInfo
|
|
14288
|
+
|
|
14289
|
+
=head3 Nikon OrientationInfo Tags
|
|
14290
|
+
|
|
14291
|
+
Index1 Tag Name Writable
|
|
14292
|
+
------ -------- --------
|
|
14293
|
+
0 RollAngle fixed32u
|
|
14294
|
+
4 PitchAngle fixed32u
|
|
14295
|
+
8 YawAngle fixed32u
|
|
14296
|
+
|
|
14297
|
+
=head3 Nikon ShotInfoD7500 Tags
|
|
14298
|
+
|
|
14299
|
+
These tags are extracted from encrypted data in images from the D7500.
|
|
14300
|
+
|
|
14301
|
+
Index Tag Name Writable
|
|
14302
|
+
----- -------- --------
|
|
14303
|
+
0 ShotInfoVersion no
|
|
14304
|
+
4 FirmwareVersion no
|
|
14305
|
+
160 OrientOffset Nikon OrientationInfo
|
|
14306
|
+
|
|
14249
14307
|
=head3 Nikon ShotInfoD800 Tags
|
|
14250
14308
|
|
|
14251
14309
|
These tags are extracted from encrypted data in images from the D800.
|
|
@@ -14299,14 +14357,6 @@ These tags are extracted from encrypted data in images from the D810.
|
|
|
14299
14357
|
4 ISOAutoShutterTime int8u & 0x3f
|
|
14300
14358
|
5 ISOAutoHiLimit int8u & 0xff
|
|
14301
14359
|
|
|
14302
|
-
=head3 Nikon OrientationInfo Tags
|
|
14303
|
-
|
|
14304
|
-
Index1 Tag Name Writable
|
|
14305
|
-
------ -------- --------
|
|
14306
|
-
0 RollAngle fixed32u
|
|
14307
|
-
4 PitchAngle fixed32u
|
|
14308
|
-
8 YawAngle fixed32u
|
|
14309
|
-
|
|
14310
14360
|
=head3 Nikon ShotInfoD850 Tags
|
|
14311
14361
|
|
|
14312
14362
|
These tags are extracted from encrypted data in images from the D850.
|
|
@@ -14606,6 +14656,7 @@ These tags are extracted from encrypted data in images from the Z9.
|
|
|
14606
14656
|
0 ShotInfoVersion no
|
|
14607
14657
|
4 FirmwareVersion no
|
|
14608
14658
|
48 SequenceOffset Nikon SeqInfoZ9
|
|
14659
|
+
88 Offset13 Nikon Offset13InfoZ9
|
|
14609
14660
|
132 OrientOffset Nikon OrientationInfo
|
|
14610
14661
|
140 MenuOffset Nikon MenuInfoZ9
|
|
14611
14662
|
|
|
@@ -14616,6 +14667,15 @@ These tags are extracted from encrypted data in images from the Z9.
|
|
|
14616
14667
|
32 FocusShiftShooting int8u~
|
|
14617
14668
|
40 IntervalShooting int16u~
|
|
14618
14669
|
|
|
14670
|
+
=head3 Nikon Offset13InfoZ9 Tags
|
|
14671
|
+
|
|
14672
|
+
Index1 Tag Name Writable
|
|
14673
|
+
------ -------- --------
|
|
14674
|
+
3048 AFAreaInitialXPosition int8s~
|
|
14675
|
+
3049 AFAreaInitialYPosition int8s~
|
|
14676
|
+
3050 AFAreaInitialWidth no
|
|
14677
|
+
3051 AFAreaInitialHeight no
|
|
14678
|
+
|
|
14619
14679
|
=head3 Nikon MenuInfoZ9 Tags
|
|
14620
14680
|
|
|
14621
14681
|
Index1 Tag Name Writable
|
|
@@ -14662,6 +14722,7 @@ These tags are used by the Z9.
|
|
|
14662
14722
|
556 SecondarySlotFunction int8u
|
|
14663
14723
|
572 DXCropAlert int8u
|
|
14664
14724
|
574 SubjectDetection int8u
|
|
14725
|
+
576 DynamicAFAreaSize int8u
|
|
14665
14726
|
604 MovieImageArea? int8u & 0x01
|
|
14666
14727
|
614 MovieType? int8u
|
|
14667
14728
|
616 MovieISOAutoHiLimit? int16u
|
|
@@ -14737,6 +14798,7 @@ These tags are used by the Z9 firmware 3.00.
|
|
|
14737
14798
|
576 SecondarySlotFunction int8u
|
|
14738
14799
|
592 DXCropAlert int8u
|
|
14739
14800
|
594 SubjectDetection int8u
|
|
14801
|
+
596 DynamicAFAreaSize int8u
|
|
14740
14802
|
636 HighFrequencyFlickerReductionShooting? int8u
|
|
14741
14803
|
646 MovieImageArea? int8u & 0x01
|
|
14742
14804
|
656 MovieType? int8u
|
|
@@ -14938,15 +15000,16 @@ Tags found in the encrypted LensData from cameras such as the Z6 and Z7.
|
|
|
14938
15000
|
18 MaxApertureAtMaxFocal int8u
|
|
14939
15001
|
19 MCUVersion int8u
|
|
14940
15002
|
20 EffectiveMaxAperture int8u
|
|
15003
|
+
47 NewLensData undef[17]
|
|
14941
15004
|
48 LensID int16u
|
|
14942
|
-
53 LensMountType
|
|
15005
|
+
53 LensMountType int8u
|
|
14943
15006
|
54 MaxAperture int16u
|
|
14944
15007
|
56 FNumber int16u
|
|
14945
15008
|
60 FocalLength int16u
|
|
14946
15009
|
76 FocusDistanceRangeWidth? int8u
|
|
14947
15010
|
78 FocusDistance int16u~
|
|
14948
15011
|
86 LensDriveEnd? int8u
|
|
14949
|
-
90 LensPositionAbsolute
|
|
15012
|
+
90 LensPositionAbsolute int32s
|
|
14950
15013
|
|
|
14951
15014
|
=head3 Nikon LensDataUnknown Tags
|
|
14952
15015
|
|
|
@@ -38055,6 +38118,7 @@ FileName.
|
|
|
38055
38118
|
ICC_Profile ICC_Profile yes!
|
|
38056
38119
|
ID3Size File no
|
|
38057
38120
|
IPTC IPTC yes!
|
|
38121
|
+
ImageDataMD5 File no
|
|
38058
38122
|
ImageHeight File no
|
|
38059
38123
|
ImageWidth File no
|
|
38060
38124
|
JPEGDigest File no
|
|
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
|
|
|
17
17
|
use strict;
|
|
18
18
|
use vars qw($VERSION %exifSpec);
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.20';
|
|
21
21
|
|
|
22
22
|
use Image::ExifTool qw(:Utils);
|
|
23
23
|
use Image::ExifTool::Exif;
|
|
@@ -437,8 +437,8 @@ sub ValidateExif($$$$$$$$)
|
|
|
437
437
|
$et->Warn(sprintf('Wrong IFD for 0x%.4x %s (should be %s not %s)', $tag, $$ti{Name}, $wgp, $ifd));
|
|
438
438
|
}
|
|
439
439
|
}
|
|
440
|
-
} elsif (not $otherSpec{$$et{
|
|
441
|
-
(not $otherSpec{$$et{
|
|
440
|
+
} elsif (not $otherSpec{$$et{FileType}} or
|
|
441
|
+
(not $otherSpec{$$et{FileType}}{$tag} and not $otherSpec{$$et{FileType}}{All}))
|
|
442
442
|
{
|
|
443
443
|
if ($tagTablePtr eq \%Image::ExifTool::Exif::Main or $$tagInfo{Unknown}) {
|
|
444
444
|
$et->Warn(sprintf('Non-standard %s tag 0x%.4x %s', $ifd, $tag, $$ti{Name}), 1);
|
|
@@ -459,8 +459,8 @@ sub ValidateExif($$$$$$$$)
|
|
|
459
459
|
$et->Warn(sprintf('Non-standard count (%d) for %s 0x%.4x %s', $count, $ifd, $tag, $$ti{Name}));
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
|
-
} elsif (not $otherSpec{$$et{
|
|
463
|
-
(not $otherSpec{$$et{
|
|
462
|
+
} elsif (not $otherSpec{$$et{FileType}} or
|
|
463
|
+
(not $otherSpec{$$et{FileType}}{$tag} and not $otherSpec{$$et{FileType}}{All}))
|
|
464
464
|
{
|
|
465
465
|
$et->Warn(sprintf('Unknown %s tag 0x%.4x', $ifd, $tag), 1);
|
|
466
466
|
}
|
|
@@ -419,6 +419,48 @@ sub ValidateImageData($$$;$)
|
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
+
#------------------------------------------------------------------------------
|
|
423
|
+
# Add specified image data to ImageDataMD5 hash
|
|
424
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) lookup for [tagInfo,value] based on tagID
|
|
425
|
+
sub AddImageDataMD5($$$)
|
|
426
|
+
{
|
|
427
|
+
my ($et, $dirInfo, $offsetInfo) = @_;
|
|
428
|
+
my ($tagID, $offset, $buff);
|
|
429
|
+
|
|
430
|
+
my $verbose = $et->Options('Verbose');
|
|
431
|
+
my $md5 = $$et{ImageDataMD5};
|
|
432
|
+
my $raf = $$dirInfo{RAF};
|
|
433
|
+
my $base = $$dirInfo{Base} || 0;
|
|
434
|
+
|
|
435
|
+
foreach $tagID (sort keys %$offsetInfo) {
|
|
436
|
+
next unless ref $$offsetInfo{$tagID} eq 'ARRAY'; # ignore scalar tag values used for Validate
|
|
437
|
+
my $tagInfo = $$offsetInfo{$tagID}[0];
|
|
438
|
+
next unless $$tagInfo{IsImageData} and $$tagInfo{OffsetPair}; # only consider image data
|
|
439
|
+
my $sizeID = $$tagInfo{OffsetPair};
|
|
440
|
+
next unless $sizeID and $$offsetInfo{$sizeID};
|
|
441
|
+
my @offsets = split ' ', $$offsetInfo{$tagID}[1];
|
|
442
|
+
my @sizes = split ' ', $$offsetInfo{$sizeID}[1];
|
|
443
|
+
my $total = 0;
|
|
444
|
+
foreach $offset (@offsets) {
|
|
445
|
+
my $size = shift @sizes;
|
|
446
|
+
next unless $offset =~ /^\d+$/ and $size and $size =~ /^\d+$/ and $size;
|
|
447
|
+
next unless $raf->Seek($offset+$base, 0);
|
|
448
|
+
while ($size) {
|
|
449
|
+
my $bytes = $size > 65536 ? 65536 : $size;
|
|
450
|
+
$raf->Read($buff, $bytes) or last;
|
|
451
|
+
$md5->add($buff);
|
|
452
|
+
$total += length($buff);
|
|
453
|
+
$size -= $bytes;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if ($verbose) {
|
|
457
|
+
my $name = "$$dirInfo{DirName}:$$tagInfo{Name}";
|
|
458
|
+
$name =~ s/Offsets|Start$//;
|
|
459
|
+
$et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $total bytes of $name data)\n");
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
422
464
|
#------------------------------------------------------------------------------
|
|
423
465
|
# Handle error while writing EXIF
|
|
424
466
|
# Inputs: 0) ExifTool ref, 1) error string, 2) tag table ref
|
|
@@ -1419,6 +1419,8 @@ sub SetNewValuesFromFile($$;@)
|
|
|
1419
1419
|
$tag =~ s/(.+?)\s*(>|<) ?//;
|
|
1420
1420
|
$$opts{EXPR} = 1; # flag this expression
|
|
1421
1421
|
} else {
|
|
1422
|
+
# (not sure why this is here because sign should be before '<')
|
|
1423
|
+
# (--> allows "<+" or "<-", which is an undocumented feature)
|
|
1422
1424
|
$opt = $1 if $tag =~ s/^([-+])\s*//;
|
|
1423
1425
|
}
|
|
1424
1426
|
}
|
|
@@ -4204,7 +4206,7 @@ sub WriteDirectory($$$;$)
|
|
|
4204
4206
|
return '' unless $dataPt or $$dirInfo{RAF}; # nothing to do if block never existed
|
|
4205
4207
|
# don't allow MakerNotes to be removed from RAW files
|
|
4206
4208
|
if ($blockName eq 'MakerNotes' and $rawType{$$self{FileType}}) {
|
|
4207
|
-
$self->Warn("Can't delete MakerNotes from $$self{
|
|
4209
|
+
$self->Warn("Can't delete MakerNotes from $$self{FileType}",1);
|
|
4208
4210
|
return undef;
|
|
4209
4211
|
}
|
|
4210
4212
|
$verb = 'Deleting';
|
|
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
|
|
|
50
50
|
use Image::ExifTool::GPS;
|
|
51
51
|
require Exporter;
|
|
52
52
|
|
|
53
|
-
$VERSION = '3.
|
|
53
|
+
$VERSION = '3.57';
|
|
54
54
|
@ISA = qw(Exporter);
|
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
|
56
56
|
|
|
@@ -3097,7 +3097,7 @@ sub ScanForXMP($$)
|
|
|
3097
3097
|
undef $buff;
|
|
3098
3098
|
}
|
|
3099
3099
|
}
|
|
3100
|
-
unless ($$et{
|
|
3100
|
+
unless ($$et{FileType}) {
|
|
3101
3101
|
$$et{FILE_TYPE} = $$et{FILE_EXT};
|
|
3102
3102
|
$et->SetFileType('<unknown file containing XMP>', undef, '');
|
|
3103
3103
|
}
|
data/bin/lib/Image/ExifTool.pm
CHANGED
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.58';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -1821,6 +1821,13 @@ my %systemTagsNotes = (
|
|
|
1821
1821
|
if specifically requested
|
|
1822
1822
|
},
|
|
1823
1823
|
},
|
|
1824
|
+
ImageDataMD5 => {
|
|
1825
|
+
Notes => q{
|
|
1826
|
+
MD5 of image data. Generated only if specifically requested for JPEG and
|
|
1827
|
+
TIFF-based images, except Panasonic raw for now. Includes image data,
|
|
1828
|
+
OtherImage and JpgFromRaw in the MD5, but not ThumbnailImage or PreviewImage
|
|
1829
|
+
},
|
|
1830
|
+
},
|
|
1824
1831
|
);
|
|
1825
1832
|
|
|
1826
1833
|
# tags defined by UserParam option (added at runtime)
|
|
@@ -2479,7 +2486,15 @@ sub ExtractInfo($;@)
|
|
|
2479
2486
|
$self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
|
|
2480
2487
|
}
|
|
2481
2488
|
}
|
|
2482
|
-
|
|
2489
|
+
|
|
2490
|
+
# create MD5 object if ImageDataMD5 is requested
|
|
2491
|
+
if ($$req{imagedatamd5} and not $$self{ImageDataMD5}) {
|
|
2492
|
+
if (require Digest::MD5) {
|
|
2493
|
+
$$self{ImageDataMD5} = Digest::MD5->new;
|
|
2494
|
+
} else {
|
|
2495
|
+
$self->WarnOnce('Install Digest::MD5 to calculate image data MD5');
|
|
2496
|
+
}
|
|
2497
|
+
}
|
|
2483
2498
|
++$$self{FILE_SEQUENCE}; # count files read
|
|
2484
2499
|
}
|
|
2485
2500
|
|
|
@@ -2870,6 +2885,10 @@ sub ExtractInfo($;@)
|
|
|
2870
2885
|
# restore necessary members when exiting re-entrant code
|
|
2871
2886
|
$$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
|
|
2872
2887
|
SetByteOrder($saveOrder);
|
|
2888
|
+
} elsif ($$self{ImageDataMD5}) {
|
|
2889
|
+
my $digest = $$self{ImageDataMD5}->hexdigest;
|
|
2890
|
+
# (don't store empty digest)
|
|
2891
|
+
$self->FoundTag(ImageDataMD5 => $digest) unless $digest eq 'd41d8cd98f00b204e9800998ecf8427e';
|
|
2873
2892
|
}
|
|
2874
2893
|
|
|
2875
2894
|
# ($type may be undef without an Error when processing sub-documents)
|
|
@@ -4297,9 +4316,9 @@ sub GetFileTime($$)
|
|
|
4297
4316
|
# on Windows, try to work around incorrect file times when daylight saving time is in effect
|
|
4298
4317
|
if ($^O eq 'MSWin32') {
|
|
4299
4318
|
if (not eval { require Win32::API }) {
|
|
4300
|
-
$self->WarnOnce('Install Win32::API for proper handling of Windows file times');
|
|
4319
|
+
$self->WarnOnce('Install Win32::API for proper handling of Windows file times', 1);
|
|
4301
4320
|
} elsif (not eval { require Win32API::File }) {
|
|
4302
|
-
$self->WarnOnce('Install Win32API::File for proper handling of Windows file times');
|
|
4321
|
+
$self->WarnOnce('Install Win32API::File for proper handling of Windows file times', 1);
|
|
4303
4322
|
} else {
|
|
4304
4323
|
# get Win32 handle, needed for GetFileTime
|
|
4305
4324
|
my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
|
|
@@ -5868,7 +5887,8 @@ sub ConvertTimeSpan($;$)
|
|
|
5868
5887
|
#------------------------------------------------------------------------------
|
|
5869
5888
|
# Patched timelocal() that fixes ActivePerl timezone bug
|
|
5870
5889
|
# Inputs/Returns: same as timelocal()
|
|
5871
|
-
# Notes: must 'require Time::Local' before calling this routine
|
|
5890
|
+
# Notes: must 'require Time::Local' before calling this routine.
|
|
5891
|
+
# Also note that year should be full year, and not relative to 1900 as with localtime
|
|
5872
5892
|
sub TimeLocal(@)
|
|
5873
5893
|
{
|
|
5874
5894
|
my $tm = Time::Local::timelocal(@_);
|
|
@@ -6338,7 +6358,10 @@ sub ProcessJPEG($$)
|
|
|
6338
6358
|
my %dumpParms = ( Out => $out );
|
|
6339
6359
|
my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk);
|
|
6340
6360
|
my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
|
|
6341
|
-
my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
|
|
6361
|
+
my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP, $md5);
|
|
6362
|
+
|
|
6363
|
+
# get pointer to MD5 object if it exists and we are the top-level JPEG
|
|
6364
|
+
$md5 = $$self{ImageDataMD5} if $$self{FILE_TYPE} eq 'JPEG' and not $$self{DOC_NUM};
|
|
6342
6365
|
|
|
6343
6366
|
# check to be sure this is a valid JPG (or J2C, or EXV) file
|
|
6344
6367
|
return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/;
|
|
@@ -6386,7 +6409,9 @@ sub ProcessJPEG($$)
|
|
|
6386
6409
|
#
|
|
6387
6410
|
# read ahead to the next segment unless we have reached EOI, SOS or SOD
|
|
6388
6411
|
#
|
|
6389
|
-
unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer
|
|
6412
|
+
unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $md5) or
|
|
6413
|
+
$marker==0x93))
|
|
6414
|
+
{
|
|
6390
6415
|
# read up to next marker (JPEG markers begin with 0xff)
|
|
6391
6416
|
my $buff;
|
|
6392
6417
|
$raf->ReadLine($buff) or last;
|
|
@@ -6416,6 +6441,8 @@ sub ProcessJPEG($$)
|
|
|
6416
6441
|
$nextSegPos = $raf->Tell();
|
|
6417
6442
|
$len -= 4; # subtract size of length word
|
|
6418
6443
|
last unless $raf->Seek($len, 1);
|
|
6444
|
+
} elsif ($md5 and defined $marker and ($marker == 0x00 or $marker == 0xda)) {
|
|
6445
|
+
$md5->add($buff); # (note: this includes the terminating 0xff's)
|
|
6419
6446
|
}
|
|
6420
6447
|
# read second segment too if this was the first
|
|
6421
6448
|
next unless defined $marker;
|
|
@@ -6626,7 +6653,7 @@ sub ProcessJPEG($$)
|
|
|
6626
6653
|
next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
|
|
6627
6654
|
}
|
|
6628
6655
|
# must scan to EOI if Validate or JpegCompressionFactor used
|
|
6629
|
-
next if $$options{Validate} or $calcImageLen or $$req{trailer};
|
|
6656
|
+
next if $$options{Validate} or $calcImageLen or $$req{trailer} or $md5;
|
|
6630
6657
|
# nothing interesting to parse after start of scan (SOS)
|
|
6631
6658
|
$success = 1;
|
|
6632
6659
|
last; # all done parsing file
|
|
@@ -7009,7 +7036,7 @@ sub ProcessJPEG($$)
|
|
|
7009
7036
|
$self->FoundTag('PreviewImage', $preview);
|
|
7010
7037
|
undef $preview;
|
|
7011
7038
|
}
|
|
7012
|
-
} elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, PreviewImage)
|
|
7039
|
+
} elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, DJI, PreviewImage)
|
|
7013
7040
|
if ($$segDataPt =~ /^SCALADO\0/ and $length >= 16) {
|
|
7014
7041
|
$dumpType = 'SCALADO';
|
|
7015
7042
|
my ($num, $idx, $len) = unpack('x8n2N', $$segDataPt);
|
|
@@ -7040,6 +7067,16 @@ sub ProcessJPEG($$)
|
|
|
7040
7067
|
DirStart(\%dirInfo, 0, 0);
|
|
7041
7068
|
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams');
|
|
7042
7069
|
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7070
|
+
} elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^(.{32})?.{32}\x2c\x01\x20\0/s) {
|
|
7071
|
+
$dumpType = 'DJI ThermalParams2';
|
|
7072
|
+
DirStart(\%dirInfo, $1 ? 32 : 0, 0);
|
|
7073
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams2');
|
|
7074
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7075
|
+
} elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^.{32}\xaa\x55\x38\0/s) {
|
|
7076
|
+
$dumpType = 'DJI ThermalParams3';
|
|
7077
|
+
DirStart(\%dirInfo, 32, 0);
|
|
7078
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams3');
|
|
7079
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7043
7080
|
} elsif ($$self{HasIJPEG} and $length >= 120) {
|
|
7044
7081
|
$dumpType = 'InfiRay Factory';
|
|
7045
7082
|
SetByteOrder('II');
|
|
@@ -7153,6 +7190,13 @@ sub ProcessJPEG($$)
|
|
|
7153
7190
|
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7154
7191
|
delete $$self{SET_GROUP0};
|
|
7155
7192
|
delete $$self{SET_GROUP1};
|
|
7193
|
+
} elsif ($$segDataPt =~ /^DJI-DBG\0/) {
|
|
7194
|
+
$dumpType = 'DJI Info';
|
|
7195
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::Info');
|
|
7196
|
+
DirStart(\%dirInfo, 8, 0);
|
|
7197
|
+
$$self{SET_GROUP0} = 'APP7';
|
|
7198
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7199
|
+
delete $$self{SET_GROUP0};
|
|
7156
7200
|
} elsif ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) {
|
|
7157
7201
|
# found in HP iPAQ_VoiceMessenger
|
|
7158
7202
|
$dumpType = 'Qualcomm';
|
|
@@ -7681,7 +7725,7 @@ sub DoProcessTIFF($$;$)
|
|
|
7681
7725
|
}
|
|
7682
7726
|
}
|
|
7683
7727
|
# update FileType if necessary now that we know more about the file
|
|
7684
|
-
if ($$self{DNGVersion} and $$self{
|
|
7728
|
+
if ($$self{DNGVersion} and $$self{FileType} !~ /^(DNG|GPR)$/) {
|
|
7685
7729
|
# override whatever FileType we set since we now know it is DNG
|
|
7686
7730
|
$self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
|
|
7687
7731
|
}
|
|
@@ -8567,7 +8611,7 @@ sub DoEscape($$)
|
|
|
8567
8611
|
sub SetFileType($;$$$)
|
|
8568
8612
|
{
|
|
8569
8613
|
my ($self, $fileType, $mimeType, $normExt) = @_;
|
|
8570
|
-
unless ($$self{
|
|
8614
|
+
unless ($$self{FileType} and not $$self{DOC_NUM}) {
|
|
8571
8615
|
my $baseType = $$self{FILE_TYPE};
|
|
8572
8616
|
my $ext = $$self{FILE_EXT};
|
|
8573
8617
|
$fileType or $fileType = $baseType;
|
|
@@ -8586,7 +8630,8 @@ sub SetFileType($;$$$)
|
|
|
8586
8630
|
$normExt = $fileTypeExt{$fileType};
|
|
8587
8631
|
$normExt = $fileType unless defined $normExt;
|
|
8588
8632
|
}
|
|
8589
|
-
$$self{FileType}
|
|
8633
|
+
# ($$self{FileType} is the file type of the main document)
|
|
8634
|
+
$$self{FileType} = $fileType unless $$self{DOC_NUM};
|
|
8590
8635
|
$self->FoundTag('FileType', $fileType);
|
|
8591
8636
|
$self->FoundTag('FileTypeExtension', uc $normExt);
|
|
8592
8637
|
$self->FoundTag('MIMEType', $mimeType || 'application/unknown');
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: exiftool_vendored
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 12.
|
|
4
|
+
version: 12.58.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matthew McEachen
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2023-
|
|
12
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: exiftool
|