exiftool_vendored 12.57.0 → 12.59.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 +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
@@ -843,7 +843,8 @@ my %prismPublicationDate = (
|
|
843
843
|
AVOID => 1,
|
844
844
|
NOTES => q{
|
845
845
|
Publishing Requirements for Industry Standard Metadata 3.0 namespace
|
846
|
-
tags. (see
|
846
|
+
tags. (see
|
847
|
+
L<https://www.w3.org/Submission/2020/SUBM-prism-20200910/prism-basic.html/>)
|
847
848
|
},
|
848
849
|
academicField => { }, # (3.0)
|
849
850
|
aggregateIssueNumber => { Writable => 'integer' }, # (3.0)
|
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.59';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -75,6 +75,7 @@ sub GetAllGroups($;$);
|
|
75
75
|
sub GetNewGroups($);
|
76
76
|
sub GetDeleteGroups();
|
77
77
|
sub AddUserDefinedTags($%);
|
78
|
+
sub SetAlternateFile($$$);
|
78
79
|
# non-public routines below
|
79
80
|
sub InsertTagValues($$$;$$$);
|
80
81
|
sub IsWritable($);
|
@@ -1821,6 +1822,16 @@ my %systemTagsNotes = (
|
|
1821
1822
|
if specifically requested
|
1822
1823
|
},
|
1823
1824
|
},
|
1825
|
+
ImageDataMD5 => {
|
1826
|
+
Notes => q{
|
1827
|
+
MD5 of image data. Generated only if specifically requested for JPEG and
|
1828
|
+
TIFF-based images, CR3, MRW and PNG images, MOV/MP4 videos, and RIFF-based
|
1829
|
+
files. The MD5 includes the main image data, plus JpgFromRaw/OtherImage for
|
1830
|
+
some formats, but does not include ThumbnailImage or PreviewImage. Includes
|
1831
|
+
video and audio data for MOV/MP4. The L<XMP-et:OriginalImageMD5
|
1832
|
+
tag|XMP.html#ExifTool> provides a place to store these values in the file.
|
1833
|
+
},
|
1834
|
+
},
|
1824
1835
|
);
|
1825
1836
|
|
1826
1837
|
# tags defined by UserParam option (added at runtime)
|
@@ -2045,6 +2056,7 @@ sub new
|
|
2045
2056
|
$$self{FILE_SEQUENCE} = 0; # sequence number for files when reading
|
2046
2057
|
$$self{FILES_WRITTEN} = 0; # count of files successfully written
|
2047
2058
|
$$self{INDENT2} = ''; # indentation of verbose messages from SetNewValue
|
2059
|
+
$$self{ALT_EXIFTOOL} = { }; # alternate exiftool objects
|
2048
2060
|
|
2049
2061
|
# initialize our new groups for writing
|
2050
2062
|
$self->SetNewGroups(@defaultWriteGroups);
|
@@ -2479,8 +2491,33 @@ sub ExtractInfo($;@)
|
|
2479
2491
|
$self->WarnOnce('Install Time::HiRes to generate ProcessingTime');
|
2480
2492
|
}
|
2481
2493
|
}
|
2482
|
-
|
2494
|
+
|
2495
|
+
# create MD5 object if ImageDataMD5 is requested
|
2496
|
+
if ($$req{imagedatamd5} and not $$self{ImageDataMD5}) {
|
2497
|
+
if (require Digest::MD5) {
|
2498
|
+
$$self{ImageDataMD5} = Digest::MD5->new;
|
2499
|
+
} else {
|
2500
|
+
$self->WarnOnce('Install Digest::MD5 to calculate image data MD5');
|
2501
|
+
}
|
2502
|
+
}
|
2483
2503
|
++$$self{FILE_SEQUENCE}; # count files read
|
2504
|
+
# extract information from alternate files if necessary
|
2505
|
+
my ($g8, $altExifTool);
|
2506
|
+
foreach $g8 (keys %{$$self{ALT_EXIFTOOL}}) {
|
2507
|
+
$altExifTool = $$self{ALT_EXIFTOOL}{$g8};
|
2508
|
+
next if $$altExifTool{DID_EXTRACT}; # avoid extracting twice
|
2509
|
+
$$altExifTool{OPTIONS} = $$self{OPTIONS};
|
2510
|
+
$$altExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET};
|
2511
|
+
$$altExifTool{REQ_TAG_LOOKUP} = $$self{REQ_TAG_LOOKUP};
|
2512
|
+
$altExifTool->ExtractInfo($$altExifTool{ALT_FILE});
|
2513
|
+
# set family 8 group name for all tags
|
2514
|
+
foreach (keys %{$$altExifTool{VALUE}}) {
|
2515
|
+
my $ex = $$altExifTool{TAG_EXTRA}{$_};
|
2516
|
+
$ex or $ex = $$altExifTool{TAG_EXTRA}{$_} = { };
|
2517
|
+
$$ex{G8} = $g8;
|
2518
|
+
}
|
2519
|
+
$$altExifTool{DID_EXTRACT} = 1;
|
2520
|
+
}
|
2484
2521
|
}
|
2485
2522
|
|
2486
2523
|
my $filename = $$self{FILENAME}; # image file name ('' if already open)
|
@@ -2870,6 +2907,10 @@ sub ExtractInfo($;@)
|
|
2870
2907
|
# restore necessary members when exiting re-entrant code
|
2871
2908
|
$$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
|
2872
2909
|
SetByteOrder($saveOrder);
|
2910
|
+
} elsif ($$self{ImageDataMD5}) {
|
2911
|
+
my $digest = $$self{ImageDataMD5}->hexdigest;
|
2912
|
+
# (don't store empty digest)
|
2913
|
+
$self->FoundTag(ImageDataMD5 => $digest) unless $digest eq 'd41d8cd98f00b204e9800998ecf8427e';
|
2873
2914
|
}
|
2874
2915
|
|
2875
2916
|
# ($type may be undef without an Error when processing sub-documents)
|
@@ -3501,6 +3542,10 @@ sub GetGroup($$;$)
|
|
3501
3542
|
$groups[6] = $$ex{G6};
|
3502
3543
|
}
|
3503
3544
|
}
|
3545
|
+
if ($$ex{G8}) {
|
3546
|
+
$groups[7] = '';
|
3547
|
+
$groups[8] = $$ex{G8};
|
3548
|
+
}
|
3504
3549
|
# generate tag ID group names unless obviously not needed
|
3505
3550
|
unless ($noID) {
|
3506
3551
|
my $id = $$tagInfo{KeysID} || $$tagInfo{TagID};
|
@@ -4134,7 +4179,11 @@ sub SplitFileName($)
|
|
4134
4179
|
} else {
|
4135
4180
|
($name = $file) =~ tr/\\/\//;
|
4136
4181
|
# remove path
|
4137
|
-
|
4182
|
+
if ($name =~ s/(.*)\///) {
|
4183
|
+
$dir = length($1) ? $1 : '/';
|
4184
|
+
} else {
|
4185
|
+
$dir = '.';
|
4186
|
+
}
|
4138
4187
|
}
|
4139
4188
|
return ($dir, $name);
|
4140
4189
|
}
|
@@ -4297,9 +4346,9 @@ sub GetFileTime($$)
|
|
4297
4346
|
# on Windows, try to work around incorrect file times when daylight saving time is in effect
|
4298
4347
|
if ($^O eq 'MSWin32') {
|
4299
4348
|
if (not eval { require Win32::API }) {
|
4300
|
-
$self->WarnOnce('Install Win32::API for proper handling of Windows file times');
|
4349
|
+
$self->WarnOnce('Install Win32::API for proper handling of Windows file times', 1);
|
4301
4350
|
} elsif (not eval { require Win32API::File }) {
|
4302
|
-
$self->WarnOnce('Install Win32API::File for proper handling of Windows file times');
|
4351
|
+
$self->WarnOnce('Install Win32API::File for proper handling of Windows file times', 1);
|
4303
4352
|
} else {
|
4304
4353
|
# get Win32 handle, needed for GetFileTime
|
4305
4354
|
my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
|
@@ -4575,11 +4624,18 @@ sub SetFoundTags($)
|
|
4575
4624
|
my $tagHash = $$self{VALUE};
|
4576
4625
|
my $reqTag;
|
4577
4626
|
foreach $reqTag (@$reqTags) {
|
4578
|
-
my (@matches, $group, $allGrp, $allTag, $byValue);
|
4627
|
+
my (@matches, $group, $allGrp, $allTag, $byValue, $g8, $altOrder);
|
4628
|
+
my $et = $self;
|
4579
4629
|
if ($reqTag =~ /^(.*):(.+)/) {
|
4580
4630
|
($group, $tag) = ($1, $2);
|
4581
4631
|
if ($group =~ /^(\*|all)$/i) {
|
4582
4632
|
$allGrp = 1;
|
4633
|
+
} elsif ($reqTag =~ /\bfile(\d+):/i) {
|
4634
|
+
$g8 = "File$1";
|
4635
|
+
$altOrder = ($1 + 1) * 100000;
|
4636
|
+
$et = $$self{ALT_EXIFTOOL}{$g8} || $self;
|
4637
|
+
$fileOrder = $$et{FILE_ORDER};
|
4638
|
+
$tagHash = $$et{VALUE};
|
4583
4639
|
} elsif ($group !~ /^[-\w:]*$/) {
|
4584
4640
|
$self->Warn("Invalid group name '${group}'");
|
4585
4641
|
$group = 'invalid';
|
@@ -4621,7 +4677,7 @@ sub SetFoundTags($)
|
|
4621
4677
|
}
|
4622
4678
|
if (defined $group and not $allGrp) {
|
4623
4679
|
# keep only specified group
|
4624
|
-
@matches = $
|
4680
|
+
@matches = $et->GroupMatches($group, \@matches);
|
4625
4681
|
next unless @matches or not $allTag;
|
4626
4682
|
}
|
4627
4683
|
if (@matches > 1) {
|
@@ -4630,9 +4686,9 @@ sub SetFoundTags($)
|
|
4630
4686
|
# return only the highest priority tag unless duplicates wanted
|
4631
4687
|
unless ($doDups or $allTag or $allGrp) {
|
4632
4688
|
$tag = shift @matches;
|
4633
|
-
my $oldPriority = $$
|
4689
|
+
my $oldPriority = $$et{PRIORITY}{$tag} || 1;
|
4634
4690
|
foreach (@matches) {
|
4635
|
-
my $priority = $$
|
4691
|
+
my $priority = $$et{PRIORITY}{$_};
|
4636
4692
|
$priority = 1 unless defined $priority;
|
4637
4693
|
next unless $priority >= $oldPriority;
|
4638
4694
|
$tag = $_;
|
@@ -4646,6 +4702,22 @@ sub SetFoundTags($)
|
|
4646
4702
|
# bogus file order entry to avoid warning if sorting in file order
|
4647
4703
|
$$self{FILE_ORDER}{$matches[0]} = 9999;
|
4648
4704
|
}
|
4705
|
+
# copy over necessary information for tags from alternate files
|
4706
|
+
if ($g8) {
|
4707
|
+
my $tag;
|
4708
|
+
foreach $tag (@matches) {
|
4709
|
+
my $vtag = $tag;
|
4710
|
+
$vtag =~ s/( |$)/ #[$g8]/;
|
4711
|
+
$$self{VALUE}{$vtag} = $$et{VALUE}{$tag};
|
4712
|
+
$$self{TAG_INFO}{$vtag} = $$et{TAG_INFO}{$tag};
|
4713
|
+
$$self{TAG_EXTRA}{$vtag} = $$et{TAG_EXTRA}{$tag} || { };
|
4714
|
+
$$self{FILE_ORDER}{$vtag} = ($$et{FILE_ORDER}{$tag} || 0) + $altOrder;
|
4715
|
+
$tag = $vtag;
|
4716
|
+
}
|
4717
|
+
# restore variables to original values for main file
|
4718
|
+
$fileOrder = $$self{FILE_ORDER};
|
4719
|
+
$tagHash = $$self{VALUE};
|
4720
|
+
}
|
4649
4721
|
# save indices of tags extracted by value
|
4650
4722
|
push @byValue, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $byValue;
|
4651
4723
|
# save indices of wildcard tags
|
@@ -5868,7 +5940,8 @@ sub ConvertTimeSpan($;$)
|
|
5868
5940
|
#------------------------------------------------------------------------------
|
5869
5941
|
# Patched timelocal() that fixes ActivePerl timezone bug
|
5870
5942
|
# Inputs/Returns: same as timelocal()
|
5871
|
-
# Notes: must 'require Time::Local' before calling this routine
|
5943
|
+
# Notes: must 'require Time::Local' before calling this routine.
|
5944
|
+
# Also note that year should be full year, and not relative to 1900 as with localtime
|
5872
5945
|
sub TimeLocal(@)
|
5873
5946
|
{
|
5874
5947
|
my $tm = Time::Local::timelocal(@_);
|
@@ -6327,7 +6400,6 @@ sub ProcessJPEG($$)
|
|
6327
6400
|
{
|
6328
6401
|
local $_;
|
6329
6402
|
my ($self, $dirInfo) = @_;
|
6330
|
-
my ($ch, $s, $length);
|
6331
6403
|
my $options = $$self{OPTIONS};
|
6332
6404
|
my $verbose = $$options{Verbose};
|
6333
6405
|
my $out = $$options{TextOut};
|
@@ -6336,10 +6408,17 @@ sub ProcessJPEG($$)
|
|
6336
6408
|
my $req = $$self{REQ_TAG_LOOKUP};
|
6337
6409
|
my $htmlDump = $$self{HTML_DUMP};
|
6338
6410
|
my %dumpParms = ( Out => $out );
|
6411
|
+
my ($ch, $s, $length, $md5, $md5size);
|
6339
6412
|
my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk);
|
6340
6413
|
my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
|
6341
6414
|
my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
|
6342
6415
|
|
6416
|
+
# get pointer to MD5 object if it exists and we are the top-level JPEG
|
6417
|
+
if ($$self{FILE_TYPE} eq 'JPEG' and not $$self{DOC_NUM}) {
|
6418
|
+
$md5 = $$self{ImageDataMD5};
|
6419
|
+
$md5size = 0;
|
6420
|
+
}
|
6421
|
+
|
6343
6422
|
# check to be sure this is a valid JPG (or J2C, or EXV) file
|
6344
6423
|
return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/;
|
6345
6424
|
if ($s eq "\xff\x01") {
|
@@ -6386,7 +6465,9 @@ sub ProcessJPEG($$)
|
|
6386
6465
|
#
|
6387
6466
|
# read ahead to the next segment unless we have reached EOI, SOS or SOD
|
6388
6467
|
#
|
6389
|
-
unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer
|
6468
|
+
unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $md5) or
|
6469
|
+
$marker==0x93))
|
6470
|
+
{
|
6390
6471
|
# read up to next marker (JPEG markers begin with 0xff)
|
6391
6472
|
my $buff;
|
6392
6473
|
$raf->ReadLine($buff) or last;
|
@@ -6416,6 +6497,19 @@ sub ProcessJPEG($$)
|
|
6416
6497
|
$nextSegPos = $raf->Tell();
|
6417
6498
|
$len -= 4; # subtract size of length word
|
6418
6499
|
last unless $raf->Seek($len, 1);
|
6500
|
+
} elsif ($md5 and defined $marker and ($marker == 0x00 or $marker == 0xda or
|
6501
|
+
($marker >= 0xd0 and $marker <= 0xd7)))
|
6502
|
+
{
|
6503
|
+
# calculate MD5 for image data (includes leading ff d9 but not trailing ff da)
|
6504
|
+
$md5->add("\xff" . chr($marker));
|
6505
|
+
my $n = $skipped - (length($buff) - 1); # number of extra 0xff's
|
6506
|
+
if (not $n) {
|
6507
|
+
$buff = substr($buff, 0, -1); # remove trailing 0xff
|
6508
|
+
} elsif ($n > 1) {
|
6509
|
+
$buff .= "\xff" x ($n - 1); # add back extra 0xff's
|
6510
|
+
}
|
6511
|
+
$md5->add($buff);
|
6512
|
+
$md5size += $skipped + 2;
|
6419
6513
|
}
|
6420
6514
|
# read second segment too if this was the first
|
6421
6515
|
next unless defined $marker;
|
@@ -6626,7 +6720,7 @@ sub ProcessJPEG($$)
|
|
6626
6720
|
next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
|
6627
6721
|
}
|
6628
6722
|
# must scan to EOI if Validate or JpegCompressionFactor used
|
6629
|
-
next if $$options{Validate} or $calcImageLen or $$req{trailer};
|
6723
|
+
next if $$options{Validate} or $calcImageLen or $$req{trailer} or $md5;
|
6630
6724
|
# nothing interesting to parse after start of scan (SOS)
|
6631
6725
|
$success = 1;
|
6632
6726
|
last; # all done parsing file
|
@@ -7009,7 +7103,7 @@ sub ProcessJPEG($$)
|
|
7009
7103
|
$self->FoundTag('PreviewImage', $preview);
|
7010
7104
|
undef $preview;
|
7011
7105
|
}
|
7012
|
-
} elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, PreviewImage)
|
7106
|
+
} elsif ($marker == 0xe4) { # APP4 (InfiRay, "SCALADO", FPXR, DJI, PreviewImage)
|
7013
7107
|
if ($$segDataPt =~ /^SCALADO\0/ and $length >= 16) {
|
7014
7108
|
$dumpType = 'SCALADO';
|
7015
7109
|
my ($num, $idx, $len) = unpack('x8n2N', $$segDataPt);
|
@@ -7040,6 +7134,16 @@ sub ProcessJPEG($$)
|
|
7040
7134
|
DirStart(\%dirInfo, 0, 0);
|
7041
7135
|
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams');
|
7042
7136
|
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7137
|
+
} elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^(.{32})?.{32}\x2c\x01\x20\0/s) {
|
7138
|
+
$dumpType = 'DJI ThermalParams2';
|
7139
|
+
DirStart(\%dirInfo, $1 ? 32 : 0, 0);
|
7140
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams2');
|
7141
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7142
|
+
} elsif ($$self{Make} eq 'DJI' and $$segDataPt =~ /^.{32}\xaa\x55\x38\0/s) {
|
7143
|
+
$dumpType = 'DJI ThermalParams3';
|
7144
|
+
DirStart(\%dirInfo, 32, 0);
|
7145
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::ThermalParams3');
|
7146
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7043
7147
|
} elsif ($$self{HasIJPEG} and $length >= 120) {
|
7044
7148
|
$dumpType = 'InfiRay Factory';
|
7045
7149
|
SetByteOrder('II');
|
@@ -7153,6 +7257,13 @@ sub ProcessJPEG($$)
|
|
7153
7257
|
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7154
7258
|
delete $$self{SET_GROUP0};
|
7155
7259
|
delete $$self{SET_GROUP1};
|
7260
|
+
} elsif ($$segDataPt =~ /^DJI-DBG\0/) {
|
7261
|
+
$dumpType = 'DJI Info';
|
7262
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::DJI::Info');
|
7263
|
+
DirStart(\%dirInfo, 8, 0);
|
7264
|
+
$$self{SET_GROUP0} = 'APP7';
|
7265
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
7266
|
+
delete $$self{SET_GROUP0};
|
7156
7267
|
} elsif ($$segDataPt =~ /^\x1aQualcomm Camera Attributes/) {
|
7157
7268
|
# found in HP iPAQ_VoiceMessenger
|
7158
7269
|
$dumpType = 'Qualcomm';
|
@@ -7413,6 +7524,8 @@ sub ProcessJPEG($$)
|
|
7413
7524
|
delete $extendedXMP{$guid};
|
7414
7525
|
}
|
7415
7526
|
}
|
7527
|
+
# print verbose MD5 message if necessary
|
7528
|
+
print $out "$$self{INDENT}(ImageDataMD5: $md5size bytes of JPEG image data)\n" if $md5size and $verbose;
|
7416
7529
|
# calculate JPEGDigest if requested
|
7417
7530
|
if (@dqt) {
|
7418
7531
|
require Image::ExifTool::JPEGDigest;
|
@@ -7681,7 +7794,7 @@ sub DoProcessTIFF($$;$)
|
|
7681
7794
|
}
|
7682
7795
|
}
|
7683
7796
|
# update FileType if necessary now that we know more about the file
|
7684
|
-
if ($$self{DNGVersion} and $$self{
|
7797
|
+
if ($$self{DNGVersion} and $$self{FileType} !~ /^(DNG|GPR)$/) {
|
7685
7798
|
# override whatever FileType we set since we now know it is DNG
|
7686
7799
|
$self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
|
7687
7800
|
}
|
@@ -8567,7 +8680,7 @@ sub DoEscape($$)
|
|
8567
8680
|
sub SetFileType($;$$$)
|
8568
8681
|
{
|
8569
8682
|
my ($self, $fileType, $mimeType, $normExt) = @_;
|
8570
|
-
unless ($$self{
|
8683
|
+
unless ($$self{FileType} and not $$self{DOC_NUM}) {
|
8571
8684
|
my $baseType = $$self{FILE_TYPE};
|
8572
8685
|
my $ext = $$self{FILE_EXT};
|
8573
8686
|
$fileType or $fileType = $baseType;
|
@@ -8586,7 +8699,8 @@ sub SetFileType($;$$$)
|
|
8586
8699
|
$normExt = $fileTypeExt{$fileType};
|
8587
8700
|
$normExt = $fileType unless defined $normExt;
|
8588
8701
|
}
|
8589
|
-
$$self{FileType}
|
8702
|
+
# ($$self{FileType} is the file type of the main document)
|
8703
|
+
$$self{FileType} = $fileType unless $$self{DOC_NUM};
|
8590
8704
|
$self->FoundTag('FileType', $fileType);
|
8591
8705
|
$self->FoundTag('FileTypeExtension', uc $normExt);
|
8592
8706
|
$self->FoundTag('MIMEType', $mimeType || 'application/unknown');
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -1727,10 +1727,11 @@ sensitive, and may be prefixed by one or more family 0, 1, 2 or 7 group
|
|
1727
1727
|
names with optional leading family numbers, separated by colons (eg.
|
1728
1728
|
'exif:iso'). A leading '-' indicates tags to be excluded (eg. '-comment'),
|
1729
1729
|
or a trailing '#' causes the ValueConv value to be copied (same as setting
|
1730
|
-
the Type option to 'ValueConv' for this tag only).
|
1731
|
-
|
1732
|
-
|
1733
|
-
|
1730
|
+
the Type option to 'ValueConv' for this tag only). A leading '+' sets the
|
1731
|
+
Replace option to 0 on a per-tag basis (see Options below). Wildcards ('*'
|
1732
|
+
and '?') may be used in the tag name. A tag name of '*' is commonly used
|
1733
|
+
when a group is specified to copy all tags in the group (eg. 'XMP:*'). A
|
1734
|
+
special feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
|
1734
1735
|
'SRCTAGE<gt>DSTTAG') to be specified to copy information to a tag with a
|
1735
1736
|
different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may contain
|
1736
1737
|
wildcards and/or be prefixed by a group name (eg.
|
@@ -1769,7 +1770,9 @@ copies all information while preserving the original family 1 groups, while
|
|
1769
1770
|
The options are the same was for L</SetNewValue>, and are passed directly
|
1770
1771
|
to L</SetNewValue> internally, with a few exceptions:
|
1771
1772
|
|
1772
|
-
- The Replace option defaults to 1 instead of 0 as with L</SetNewValue
|
1773
|
+
- The Replace option defaults to 1 instead of 0 as with L</SetNewValue>,
|
1774
|
+
however the tag name argument may be prefixed with '+' to set the Replace
|
1775
|
+
option to 0 for this argument only.
|
1773
1776
|
|
1774
1777
|
- The AddValue or DelValue option is set for individual tags if '+>' or '->'
|
1775
1778
|
(or '+E<lt>' or '-E<lt>') are used.
|
@@ -1870,6 +1873,31 @@ None.
|
|
1870
1873
|
|
1871
1874
|
=back
|
1872
1875
|
|
1876
|
+
=head2 SetAlternateFile
|
1877
|
+
|
1878
|
+
Specify alternate file from which to read metadata. Tags from the alternate
|
1879
|
+
file are available after L</ExtractInfo> is called or during a call to
|
1880
|
+
L</SetNewValuesFromFile> by using a family 8 group name (eg. 'File1' in the
|
1881
|
+
example below).
|
1882
|
+
|
1883
|
+
$exifTool->SetAlternateFile(File1 => 'images/test1.jpg');
|
1884
|
+
|
1885
|
+
=over 4
|
1886
|
+
|
1887
|
+
=item Inputs:
|
1888
|
+
|
1889
|
+
0) ExifTool object reference
|
1890
|
+
|
1891
|
+
1) Family 8 group name, case insensitive (eg. 'File1', 'File2'...)
|
1892
|
+
|
1893
|
+
2) Name of alternate input file, or undef to reset
|
1894
|
+
|
1895
|
+
=item Return Values:
|
1896
|
+
|
1897
|
+
1 on success, or 0 if the group name is invalid.
|
1898
|
+
|
1899
|
+
=back
|
1900
|
+
|
1873
1901
|
=head2 SetFileModifyDate
|
1874
1902
|
|
1875
1903
|
Write the filesystem modification or creation time from the new value of the
|
@@ -2088,6 +2116,7 @@ The group family numbers are currently available:
|
|
2088
2116
|
5) Metadata Path (eg. JPEG-APP1-IFD0-ExifIFD)
|
2089
2117
|
6) EXIF/TIFF Format (eg. int8u, int32u, undef, string)
|
2090
2118
|
7) Tag ID (eg. ID-271, ID-rights, ID-a9aut)
|
2119
|
+
8) Alternate File Number (eg. File1, File2, File3...)
|
2091
2120
|
|
2092
2121
|
Families 0 and 1 are based on the file structure, and are similar except
|
2093
2122
|
that family 1 is more specific and sub-divides some groups to give more
|
@@ -2140,6 +2169,8 @@ non-numerical ID's may or may not have characters other than [-_A-Za-z0-9]
|
|
2140
2169
|
converted to hex. Note that unlike other group names, the tag ID's of
|
2141
2170
|
family 7 group names are case sensitive (but the leading "ID-" is not).
|
2142
2171
|
|
2172
|
+
Family 8 specifies the alternate file set from a call to L</SetAlternateFile>.
|
2173
|
+
|
2143
2174
|
See L</GetAllGroups [static]> for complete lists of group names.
|
2144
2175
|
|
2145
2176
|
=back
|
@@ -2392,6 +2423,10 @@ leading "0x" if the HexTagIDs option is set, or decimal otherwise.
|
|
2392
2423
|
Characters in non-numerical ID's which are not valid in a group name are
|
2393
2424
|
returned as 2 hex digits.)
|
2394
2425
|
|
2426
|
+
=item Family 8 (Alternate File):
|
2427
|
+
|
2428
|
+
File#
|
2429
|
+
|
2395
2430
|
=back
|
2396
2431
|
|
2397
2432
|
Note: This function may also be called as an ExifTool member function to
|
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.59.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-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|