exiftool_vendored 12.73.0 → 12.75.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 +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
|
#
|