exiftool_vendored 12.57.0 → 12.58.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 +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
|