exiftool_vendored 12.73.0 → 12.75.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 +41 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +46 -45
- data/bin/exiftool +97 -83
- data/bin/lib/File/RandomAccess.pm +31 -5
- data/bin/lib/File/RandomAccess.pod +4 -4
- data/bin/lib/Image/ExifTool/7Z.pm +3 -3
- data/bin/lib/Image/ExifTool/AFCP.pm +2 -2
- data/bin/lib/Image/ExifTool/BZZ.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
- data/bin/lib/Image/ExifTool/Canon.pm +6 -5
- data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
- data/bin/lib/Image/ExifTool/DICOM.pm +2 -2
- data/bin/lib/Image/ExifTool/DNG.pm +4 -4
- data/bin/lib/Image/ExifTool/Exif.pm +3 -2
- data/bin/lib/Image/ExifTool/FLIR.pm +2 -2
- data/bin/lib/Image/ExifTool/Fixup.pm +3 -3
- data/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
- data/bin/lib/Image/ExifTool/Geotag.pm +3 -3
- data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +2 -2
- data/bin/lib/Image/ExifTool/Import.pm +5 -5
- data/bin/lib/Image/ExifTool/JSON.pm +2 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +51 -12
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
- data/bin/lib/Image/ExifTool/Ogg.pm +2 -2
- data/bin/lib/Image/ExifTool/PDF.pm +54 -4
- data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
- data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/PostScript.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +41 -107
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +8 -6
- data/bin/lib/Image/ExifTool/RSRC.pm +2 -2
- data/bin/lib/Image/ExifTool/Samsung.pm +4 -4
- data/bin/lib/Image/ExifTool/Shift.pl +1 -2
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
- data/bin/lib/Image/ExifTool/Sony.pm +3 -3
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +8 -5
- data/bin/lib/Image/ExifTool/TagNames.pod +36 -5
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
- data/bin/lib/Image/ExifTool/Writer.pl +68 -44
- data/bin/lib/Image/ExifTool/XMP.pm +2 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +9 -0
- data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
- data/bin/lib/Image/ExifTool.pm +42 -26
- data/bin/lib/Image/ExifTool.pod +76 -71
- data/bin/perl-Image-ExifTool.spec +45 -44
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.39';
|
20
20
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
22
22
|
sub ProcessJUMD($$$);
|
@@ -141,10 +141,13 @@ my %j2cMarker = (
|
|
141
141
|
Authenticity Initiative) JUMBF (JPEG Universal Metadata Box Format) metdata
|
142
142
|
is currently extracted from JPEG, PNG, TIFF-based (eg. TIFF, DNG),
|
143
143
|
QuickTime-based (eg. MP4, MOV, HEIF, AVIF), RIFF-based (eg. WAV, AVI, WebP),
|
144
|
-
GIF files and ID3v2 metadata. The suggested ExifTool
|
145
|
-
for reading C2PA metadata are C<-jumbf:all -G3 -b -j
|
146
|
-
metadata may be deleted from writable JPEG, PNG, WebP,
|
147
|
-
QuickTime-based files by deleting the JUMBF group with
|
144
|
+
PDF, SVG and GIF files, and ID3v2 metadata. The suggested ExifTool
|
145
|
+
command-line arguments for reading C2PA metadata are C<-jumbf:all -G3 -b -j
|
146
|
+
-u -struct>. This metadata may be deleted from writable JPEG, PNG, WebP,
|
147
|
+
TIFF-based, and QuickTime-based files by deleting the JUMBF group with
|
148
|
+
C<-jumbf:all=>. The C2PA JUMBF metadata may be extracted as a block via the
|
149
|
+
JUMBF tag. See L<https://c2pa.org/specifications/> for the C2PA
|
150
|
+
specification.
|
148
151
|
},
|
149
152
|
#
|
150
153
|
# NOTE: ONLY TAGS WITH "Format" DEFINED ARE EXTRACTED!
|
@@ -419,7 +422,7 @@ my %j2cMarker = (
|
|
419
422
|
Flags => [ 'Binary', 'Protected' ],
|
420
423
|
SubDirectory => { TagTable => 'Image::ExifTool::CBOR::Main' },
|
421
424
|
},
|
422
|
-
bfdb => { # used in JUMBF
|
425
|
+
bfdb => { # used in JUMBF
|
423
426
|
Name => 'BinaryDataType',
|
424
427
|
Notes => 'JUMBF, MIME type and optional file name',
|
425
428
|
Format => 'undef',
|
@@ -748,6 +751,7 @@ my %j2cMarker = (
|
|
748
751
|
},
|
749
752
|
# seen:
|
750
753
|
# cacb/cast/caas/cacl/casg/json-00110010800000aa00389b71
|
754
|
+
# (also brob- but not yet tested)
|
751
755
|
# 6579d6fbdba2446bb2ac1b82feeb89d1 - JPEG image
|
752
756
|
},
|
753
757
|
'label' => { Name => 'JUMDLabel' },
|
@@ -821,6 +825,7 @@ sub ProcessJUMD($$$)
|
|
821
825
|
$name =~ tr/-_a-zA-Z0-9//dc; # remove other illegal characters
|
822
826
|
$name =~ s/__/_/; # collapse double underlines
|
823
827
|
$name = ucfirst $name; # capitalize first letter
|
828
|
+
$name =~ s/C2pa/C2PA/; # capitalize C2PA
|
824
829
|
$name = "Tag$name" if length($name) < 2; # must at least 2 characters long
|
825
830
|
$$et{JUMBFLabel} = $name;
|
826
831
|
}
|
@@ -1017,11 +1022,23 @@ sub ProcessJpeg2000Box($$$)
|
|
1017
1022
|
my $dirStart = $$dirInfo{DirStart} || 0;
|
1018
1023
|
my $base = $$dirInfo{Base} || 0;
|
1019
1024
|
my $outfile = $$dirInfo{OutFile};
|
1025
|
+
my $dirName = $$dirInfo{DirName} || '';
|
1020
1026
|
my $dirEnd = $dirStart + $dirLen;
|
1021
1027
|
my ($err, $outBuff, $verbose, $doColour, $hash, $raf);
|
1022
1028
|
|
1023
|
-
|
1024
|
-
|
1029
|
+
if ($dataPt) {
|
1030
|
+
# save C2PA JUMBF as a block if requested
|
1031
|
+
if ($dirName eq 'JUMBF' and $$et{REQ_TAG_LOOKUP}{jumbf} and not $$dirInfo{NoBlockSave}) {
|
1032
|
+
if ($dirStart or $dirLen ne length($$dataPt)) {
|
1033
|
+
my $dat = substr($$dataPt, $dirStart, $dirLen);
|
1034
|
+
$et->FoundTag(JUMBF => \$dat);
|
1035
|
+
} else {
|
1036
|
+
$et->FoundTag(JUMBF => $dataPt);
|
1037
|
+
}
|
1038
|
+
}
|
1039
|
+
} else {
|
1040
|
+
$raf = $$dirInfo{RAF}; # read from RAF
|
1041
|
+
}
|
1025
1042
|
|
1026
1043
|
if ($outfile) {
|
1027
1044
|
unless ($raf) {
|
@@ -1030,7 +1047,7 @@ sub ProcessJpeg2000Box($$$)
|
|
1030
1047
|
$outfile = \$outBuff;
|
1031
1048
|
}
|
1032
1049
|
# determine if we will be writing colr box
|
1033
|
-
if (
|
1050
|
+
if ($dirName eq 'JP2Header') {
|
1034
1051
|
$doColour = 2 if defined $et->GetNewValue('ColorSpecMethod') or $et->GetNewValue('ICC_Profile') or
|
1035
1052
|
defined $et->GetNewValue('ColorSpecPrecedence') or defined $et->GetNewValue('ColorSpace') or
|
1036
1053
|
defined $et->GetNewValue('ColorSpecApproximation') or defined $et->GetNewValue('ColorSpecData');
|
@@ -1038,7 +1055,7 @@ sub ProcessJpeg2000Box($$$)
|
|
1038
1055
|
} else {
|
1039
1056
|
# (must not set verbose flag when writing!)
|
1040
1057
|
$verbose = $$et{OPTIONS}{Verbose};
|
1041
|
-
$et->VerboseDir(
|
1058
|
+
$et->VerboseDir($dirName) if $verbose;
|
1042
1059
|
# do hash if requested, but only for top-level image data
|
1043
1060
|
$hash = $$et{ImageDataHash} if $raf;
|
1044
1061
|
}
|
@@ -1187,7 +1204,7 @@ sub ProcessJpeg2000Box($$$)
|
|
1187
1204
|
# create new tag for JUMBF data values with name corresponding to JUMBFLabel
|
1188
1205
|
if ($tagInfo and $$et{JUMBFLabel} and (not $$tagInfo{SubDirectory} or $$tagInfo{BlockExtract})) {
|
1189
1206
|
$tagInfo = { %$tagInfo, Name => $$et{JUMBFLabel} . ($$tagInfo{JUMBF_Suffix} || '') };
|
1190
|
-
|
1207
|
+
($$tagInfo{Description} = Image::ExifTool::MakeDescription($$tagInfo{Name})) =~ s/C2 PA/C2PA/;
|
1191
1208
|
AddTagToTable($tagTablePtr, '_JUMBF_' . $$et{JUMBFLabel}, $tagInfo);
|
1192
1209
|
delete $$tagInfo{Protected}; # (must do this so -j -b returns JUMBF binary data)
|
1193
1210
|
$$tagInfo{TagID} = $boxID;
|
@@ -1491,6 +1508,28 @@ sub ProcessJXLCodestream($$)
|
|
1491
1508
|
return 1;
|
1492
1509
|
}
|
1493
1510
|
|
1511
|
+
#------------------------------------------------------------------------------
|
1512
|
+
# Read/write meta information from a C2PA/JUMBF file
|
1513
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
1514
|
+
# Returns: 1 on success, 0 if this wasn't a valid JUMBF file
|
1515
|
+
sub ProcessJUMBF($$)
|
1516
|
+
{
|
1517
|
+
my ($et, $dirInfo) = @_;
|
1518
|
+
my $raf = $$dirInfo{RAF};
|
1519
|
+
my $hdr;
|
1520
|
+
|
1521
|
+
# check to be sure this is a valid JPG2000 file
|
1522
|
+
return 0 unless $raf->Read($hdr,20) == 20 and $raf->Seek(0,0);
|
1523
|
+
return 0 unless $hdr =~ /^.{4}jumb\0.{3}jumd(.{4})/;
|
1524
|
+
$et->SetFileType($1 eq 'c2pa' ? 'C2PA' : 'JUMBF');
|
1525
|
+
my %dirInfo = (
|
1526
|
+
RAF => $raf,
|
1527
|
+
DirName => 'JUMBF',
|
1528
|
+
);
|
1529
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main');
|
1530
|
+
return $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
1531
|
+
}
|
1532
|
+
|
1494
1533
|
#------------------------------------------------------------------------------
|
1495
1534
|
# Read/write meta information from a JPEG 2000 image
|
1496
1535
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
@@ -1583,7 +1622,7 @@ sub ProcessJXL($$)
|
|
1583
1622
|
$$et{IsJXL} = 2;
|
1584
1623
|
my $buff = "\0\0\0\x0cJXL \x0d\x0a\x87\x0a\0\0\0\x14ftypjxl \0\0\0\0jxl ";
|
1585
1624
|
# add metadata to empty ISO BMFF container
|
1586
|
-
$$dirInfo{RAF} =
|
1625
|
+
$$dirInfo{RAF} = File::RandomAccess->new(\$buff);
|
1587
1626
|
} else {
|
1588
1627
|
$et->SetFileType('JXL Codestream','image/jxl', 'jxl');
|
1589
1628
|
if ($$et{ImageDataHash} and $raf->Seek(0,0)) {
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::Exif;
|
15
15
|
use Image::ExifTool::GPS;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.54';
|
18
18
|
|
19
19
|
sub ProcessMIE($$);
|
20
20
|
sub ProcessMIEGroup($$$);
|
@@ -1077,7 +1077,7 @@ sub WriteMIEGroup($$$)
|
|
1077
1077
|
$newVal = '';
|
1078
1078
|
%subdirInfo = (
|
1079
1079
|
OutFile => \$newVal,
|
1080
|
-
RAF =>
|
1080
|
+
RAF => File::RandomAccess->new(\$oldVal),
|
1081
1081
|
);
|
1082
1082
|
} elsif ($optCompress and not $$dirInfo{IsCompressed}) {
|
1083
1083
|
# write to memory so we can compress the new MIE group
|
@@ -1585,7 +1585,7 @@ sub ProcessMIEGroup($$$)
|
|
1585
1585
|
WasCompressed => $wasCompressed,
|
1586
1586
|
);
|
1587
1587
|
# read from uncompressed data instead if necessary
|
1588
|
-
$subdirInfo{RAF} =
|
1588
|
+
$subdirInfo{RAF} = File::RandomAccess->new(\$value) if $valLen;
|
1589
1589
|
|
1590
1590
|
my $oldOrder = GetByteOrder();
|
1591
1591
|
SetByteOrder($format & 0x08 ? 'II' : 'MM');
|
@@ -17,7 +17,7 @@ use vars qw($VERSION);
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
use Image::ExifTool::Minolta;
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.20';
|
21
21
|
|
22
22
|
sub ProcessMRW($$;$);
|
23
23
|
sub WriteMRW($$;$);
|
@@ -400,7 +400,7 @@ sub ProcessMRW($$;$)
|
|
400
400
|
|
401
401
|
if ($$dirInfo{DataPt}) {
|
402
402
|
# make a RAF object for MRW information extracted from other file types
|
403
|
-
$raf =
|
403
|
+
$raf = File::RandomAccess->new($$dirInfo{DataPt});
|
404
404
|
# MRW information in DNG images may not start at beginning of data block
|
405
405
|
$raf->Seek($$dirInfo{DirStart}, 0) if $$dirInfo{DirStart};
|
406
406
|
}
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.30';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -677,6 +677,7 @@ sub GetAFPointGrid($$;$);
|
|
677
677
|
'71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
|
678
678
|
'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
|
679
679
|
'FD 00 44 44 18 18 DF 00' => 'Voigtlander APO-Lanthar 35mm F2', #30
|
680
|
+
'FD 00 59 59 18 18 DF 00' => 'Voigtlander Macro APO-Lanthar 65mm F2', #30
|
680
681
|
#
|
681
682
|
'00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
|
682
683
|
'00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
|
@@ -690,6 +691,7 @@ sub GetAFPointGrid($$;$);
|
|
690
691
|
'00 54 62 62 0C 0C 00 00' => 'Carl Zeiss Planar T* 1.4/85 ZF.2',
|
691
692
|
'00 54 68 68 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/100 ZF.2',
|
692
693
|
'00 54 72 72 18 18 00 00' => 'Carl Zeiss Apo Sonnar T* 2/135 ZF.2',
|
694
|
+
'02 54 3C 3C 0C 0C 00 00' => 'Zeiss Otus 1.4/28 ZF.2', #30
|
693
695
|
'00 54 53 53 0C 0C 00 00' => 'Zeiss Otus 1.4/55', #IB
|
694
696
|
'01 54 62 62 0C 0C 00 00' => 'Zeiss Otus 1.4/85',
|
695
697
|
'03 54 68 68 0C 0C 00 00' => 'Zeiss Otus 1.4/100', #IB
|
@@ -9852,7 +9852,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
9852
9852
|
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
|
9853
9853
|
87 => { # CSe2
|
9854
9854
|
Name => 'FlashShutterSpeed',
|
9855
|
-
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to
|
9855
|
+
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
|
9856
9856
|
PrintConv => {
|
9857
9857
|
0 => '1 s',
|
9858
9858
|
1 => '1/2 s',
|
@@ -10242,7 +10242,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
10242
10242
|
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
|
10243
10243
|
87 => { # CSe2
|
10244
10244
|
Name => 'FlashShutterSpeed',
|
10245
|
-
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to
|
10245
|
+
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
|
10246
10246
|
PrintConv => {
|
10247
10247
|
0 => '1 s',
|
10248
10248
|
1 => '1/2 s',
|
@@ -10652,7 +10652,7 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
10652
10652
|
85 => { Name => 'HighSpeedSync', PrintConv => \%offOn }, # CSe1-b
|
10653
10653
|
87 => { # CSe2
|
10654
10654
|
Name => 'FlashShutterSpeed',
|
10655
|
-
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to
|
10655
|
+
ValueConv => 'my $t = ($val - 16) % 24; $t ? $val / 24 : 2 + ($val - 16) / 24', #unusual decode perhaps due to need to accommodate 4 new values?
|
10656
10656
|
PrintConv => {
|
10657
10657
|
0 => '1 s',
|
10658
10658
|
1 => '1/2 s',
|
@@ -17,7 +17,7 @@ use strict;
|
|
17
17
|
use vars qw($VERSION);
|
18
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.03';
|
21
21
|
|
22
22
|
my $MAX_PACKETS = 2; # maximum packets to scan from each stream at start of file
|
23
23
|
|
@@ -189,7 +189,7 @@ sub ProcessOGG($$)
|
|
189
189
|
if (defined $numFlac and defined $val{$stream}) {
|
190
190
|
# process FLAC headers as if it was a complete FLAC file
|
191
191
|
require Image::ExifTool::FLAC;
|
192
|
-
my %dirInfo = ( RAF =>
|
192
|
+
my %dirInfo = ( RAF => File::RandomAccess->new(\$val{$stream}) );
|
193
193
|
Image::ExifTool::FLAC::ProcessFLAC($et, \%dirInfo);
|
194
194
|
}
|
195
195
|
return $success;
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
22
22
|
require Exporter;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.58';
|
25
25
|
|
26
26
|
sub FetchObject($$$$);
|
27
27
|
sub ExtractObject($$;$$);
|
@@ -178,6 +178,9 @@ my %supportedFilter = (
|
|
178
178
|
AcroForm => {
|
179
179
|
SubDirectory => { TagTable => 'Image::ExifTool::PDF::AcroForm' },
|
180
180
|
},
|
181
|
+
AF => {
|
182
|
+
SubDirectory => { TagTable => 'Image::ExifTool::PDF::AF' },
|
183
|
+
},
|
181
184
|
Lang => 'Language',
|
182
185
|
PageLayout => { },
|
183
186
|
PageMode => { },
|
@@ -251,6 +254,37 @@ my %supportedFilter = (
|
|
251
254
|
},
|
252
255
|
);
|
253
256
|
|
257
|
+
# tags extracted from AF dictionary
|
258
|
+
%Image::ExifTool::PDF::AF = (
|
259
|
+
PROCESS_PROC => \&ProcessAF,
|
260
|
+
NOTES => 'Processed only for C2PA information if AFRelationship is "/C2PA_Manifest".',
|
261
|
+
EF => {
|
262
|
+
SubDirectory => { TagTable => 'Image::ExifTool::PDF::EF' },
|
263
|
+
},
|
264
|
+
);
|
265
|
+
|
266
|
+
# tags extracted from EF dictionary
|
267
|
+
%Image::ExifTool::PDF::EF = (
|
268
|
+
F => {
|
269
|
+
Name => 'F_', # (don't want single-letter tag names)
|
270
|
+
SubDirectory => { TagTable => 'Image::ExifTool::PDF::F' },
|
271
|
+
},
|
272
|
+
);
|
273
|
+
|
274
|
+
# tags extracted from F dictionary
|
275
|
+
%Image::ExifTool::PDF::F = (
|
276
|
+
NOTES => 'C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.',
|
277
|
+
_stream => {
|
278
|
+
Name => 'JUMBF',
|
279
|
+
Condition => '$$self{AFRelationship} eq "/C2PA_Manifest"',
|
280
|
+
SubDirectory => {
|
281
|
+
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
282
|
+
DirName => 'JUMBF',
|
283
|
+
ByteOrder => 'BigEndian',
|
284
|
+
},
|
285
|
+
},
|
286
|
+
);
|
287
|
+
|
254
288
|
# tags in PDF Kids dictionary
|
255
289
|
%Image::ExifTool::PDF::Kids = (
|
256
290
|
Metadata => {
|
@@ -1739,6 +1773,19 @@ sub ProcessAcroForm($$$$;$$)
|
|
1739
1773
|
{
|
1740
1774
|
my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
|
1741
1775
|
$et->HandleTag($tagTablePtr, '_has_xfa', $$dict{XFA} ? 'true' : 'false');
|
1776
|
+
return 1 unless $et->Options('Verbose');
|
1777
|
+
return ProcessDict($et, $tagTablePtr, $dict, $xref, $nesting, $type);
|
1778
|
+
}
|
1779
|
+
|
1780
|
+
#------------------------------------------------------------------------------
|
1781
|
+
# Process AF dictionary to extract C2PA manifest
|
1782
|
+
# Inputs: Same as ProcessDict
|
1783
|
+
sub ProcessAF($$$$;$$)
|
1784
|
+
{
|
1785
|
+
my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
|
1786
|
+
$$et{AFRelationship} = $$dict{AFRelationship} || '';
|
1787
|
+
# go no further unless Verbose or this is the C2PA_Manifest item
|
1788
|
+
return 1 unless $et->Options('Verbose') or $$et{AFRelationship} eq '/C2PA_Manifest';
|
1742
1789
|
return ProcessDict($et, $tagTablePtr, $dict, $xref, $nesting, $type);
|
1743
1790
|
}
|
1744
1791
|
|
@@ -1987,7 +2034,8 @@ sub ProcessDict($$$$;$$)
|
|
1987
2034
|
$$et{INDENT} .= '| ';
|
1988
2035
|
$$et{DIR_NAME} = $tag;
|
1989
2036
|
$et->VerboseDir($tag, scalar(@{$$subDict{_tags}}));
|
1990
|
-
|
2037
|
+
my $proc = $$subTablePtr{PROCESS_PROC} || \&ProcessDict;
|
2038
|
+
&$proc($et, $subTablePtr, $subDict, $xref, $nesting);
|
1991
2039
|
$$et{INDENT} = $oldIndent;
|
1992
2040
|
$$et{DIR_NAME} = $oldDir;
|
1993
2041
|
}
|
@@ -2087,7 +2135,8 @@ sub ProcessDict($$$$;$$)
|
|
2087
2135
|
($tag = $$dict{Subtype} . $tag) =~ s/^\/// if $$dict{Subtype};
|
2088
2136
|
last unless $$tagTablePtr{$tag};
|
2089
2137
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or last;
|
2090
|
-
|
2138
|
+
my $subdir = $$tagInfo{SubDirectory};
|
2139
|
+
unless ($subdir) {
|
2091
2140
|
# don't build filter lists across different images
|
2092
2141
|
delete $$et{LIST_TAGS}{$$tagTablePtr{Filter}};
|
2093
2142
|
# we arrive here only when extracting embedded images
|
@@ -2120,8 +2169,9 @@ sub ProcessDict($$$$;$$)
|
|
2120
2169
|
DirStart => 0,
|
2121
2170
|
DirLen => length $$dict{_stream},
|
2122
2171
|
Parent => 'PDF',
|
2172
|
+
DirName => $$subdir{DirName},
|
2123
2173
|
);
|
2124
|
-
my $subTablePtr = GetTagTable(
|
2174
|
+
my $subTablePtr = GetTagTable($$subdir{TagTable});
|
2125
2175
|
unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) {
|
2126
2176
|
$et->Warn("Error processing $$tagInfo{Name} information");
|
2127
2177
|
}
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::XMP;
|
22
22
|
use Image::ExifTool::GPS;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.12';
|
25
25
|
|
26
26
|
sub ExtractObject($$;$);
|
27
27
|
sub Get24u($$);
|
@@ -351,9 +351,9 @@ sub ProcessBinaryPLIST($$;$)
|
|
351
351
|
my $start = $$dirInfo{DirStart};
|
352
352
|
if ($start or ($$dirInfo{DirLen} and $$dirInfo{DirLen} != length $$dataPt)) {
|
353
353
|
my $buf2 = substr($$dataPt, $start || 0, $$dirInfo{DirLen});
|
354
|
-
$$dirInfo{RAF} =
|
354
|
+
$$dirInfo{RAF} = File::RandomAccess->new(\$buf2);
|
355
355
|
} else {
|
356
|
-
$$dirInfo{RAF} =
|
356
|
+
$$dirInfo{RAF} = File::RandomAccess->new($dataPt);
|
357
357
|
}
|
358
358
|
my $strt = $$dirInfo{DirStart} || 0;
|
359
359
|
}
|
@@ -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.29';
|
25
25
|
|
26
26
|
sub ProcessJpgFromRaw($$$);
|
27
27
|
sub WriteJpgFromRaw($$$);
|
@@ -839,7 +839,7 @@ sub WriteJpgFromRaw($$$)
|
|
839
839
|
my $buff = substr($$dataPt, $dirStart, $dirLen);
|
840
840
|
$dataPt = \$buff;
|
841
841
|
}
|
842
|
-
my $raf =
|
842
|
+
my $raf = File::RandomAccess->new($dataPt);
|
843
843
|
my $outbuff;
|
844
844
|
my %dirInfo = (
|
845
845
|
RAF => $raf,
|
@@ -890,7 +890,7 @@ sub ProcessJpgFromRaw($$$)
|
|
890
890
|
# extract information from embedded JPEG
|
891
891
|
my %dirInfo = (
|
892
892
|
Parent => 'RAF',
|
893
|
-
RAF =>
|
893
|
+
RAF => File::RandomAccess->new($dataPt),
|
894
894
|
);
|
895
895
|
if ($verbose) {
|
896
896
|
my $indent = $$et{INDENT};
|
@@ -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.10';
|
19
19
|
|
20
20
|
sub WritePhaseOne($$$);
|
21
21
|
sub ProcessPhaseOne($$$);
|
@@ -473,7 +473,7 @@ sub WritePhaseOne($$$)
|
|
473
473
|
return undef if $numEntries < 2 or $numEntries > 300 or $ifdEnd > $dirLen;
|
474
474
|
my $hdrBuff = $hdr;
|
475
475
|
my $valBuff = ''; # buffer for value data
|
476
|
-
my $fixup =
|
476
|
+
my $fixup = Image::ExifTool::Fixup->new;
|
477
477
|
my $index;
|
478
478
|
for ($index=0; $index<$numEntries; ++$index) {
|
479
479
|
my $entry = $dirStart + $ifdStart + 8 + $entrySize * $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.70';
|
32
32
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
34
34
|
sub WritePhotoshop($$$);
|
@@ -70,7 +70,7 @@ my %thumbnailInfo = (
|
|
70
70
|
Protected => 1,
|
71
71
|
RawConv => 'my $img=substr($val,0x1c); $self->ValidateImage(\$img,$tag)',
|
72
72
|
ValueConvInv => q{
|
73
|
-
my $et =
|
73
|
+
my $et = Image::ExifTool->new;
|
74
74
|
my @tags = qw{ImageWidth ImageHeight FileType};
|
75
75
|
my $info = $et->ImageInfo(\$val, @tags);
|
76
76
|
my ($w, $h, $type) = @$info{@tags};
|
@@ -892,7 +892,7 @@ sub ProcessDocumentData($$$)
|
|
892
892
|
unless ($raf) {
|
893
893
|
my $dataPt = $$dirInfo{DataPt};
|
894
894
|
my $start = $$dirInfo{DirStart} || 0;
|
895
|
-
$raf =
|
895
|
+
$raf = File::RandomAccess->new($dataPt);
|
896
896
|
$raf->Seek($start, 0) if $start;
|
897
897
|
$dirLen = length $$dataPt - $start unless defined $dirLen;
|
898
898
|
$et->VerboseDump($dataPt, Start => $start, Len => $dirLen, Base => $$dirInfo{Base});
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION $AUTOLOAD);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.45';
|
20
20
|
|
21
21
|
sub WritePS($$);
|
22
22
|
sub ProcessPS($$;$);
|
@@ -430,7 +430,7 @@ sub ProcessPS($$;$)
|
|
430
430
|
|
431
431
|
# allow read from data
|
432
432
|
unless ($raf) {
|
433
|
-
$raf =
|
433
|
+
$raf = File::RandomAccess->new($$dirInfo{DataPt});
|
434
434
|
$et->VerboseDir('PostScript');
|
435
435
|
}
|
436
436
|
#
|