exiftool_vendored 12.74.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 +17 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +46 -45
- data/bin/exiftool +50 -45
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -3
- data/bin/lib/Image/ExifTool/Canon.pm +3 -2
- data/bin/lib/Image/ExifTool/Exif.pm +2 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +50 -11
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/PDF.pm +54 -4
- data/bin/lib/Image/ExifTool/QuickTime.pm +2 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +3 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +32 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +11 -8
- data/bin/lib/Image/ExifTool/Writer.pl +2 -2
- data/bin/lib/Image/ExifTool/XMP.pm +2 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +9 -0
- data/bin/lib/Image/ExifTool.pm +16 -4
- data/bin/lib/Image/ExifTool.pod +69 -65
- data/bin/perl-Image-ExifTool.spec +45 -44
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dda9b74fae35f2dc1e3675ee735a6ef747654f5ab0e92b4ceb64c6dca7d95c1
|
4
|
+
data.tar.gz: c6154176d70ab63db1d4c65a2e872a8c727d1545fccc2bf4197998faa295dc7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0f3e4fcc88c78448d07f09d73e2e36b025accb4a85d2b425a9eb537c9fabd7792cc2525f41928b82f9688a33ceef08da4996a515bc87258347484e93e93fdec
|
7
|
+
data.tar.gz: 48b0871192b51764f64cdcbb3b69b0f10f752223a68d60a8f364e984542328a339618f49dce5716af91ba13afbfad06cd93e99a1e7fc1f1220b2752f71ab887f
|
data/bin/Changes
CHANGED
@@ -4,17 +4,31 @@ ExifTool Version History
|
|
4
4
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
6
6
|
|
7
|
-
Note: The most recent production release is Version 12.
|
7
|
+
Note: The most recent production release is Version 12.75. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Jan. 30, 2024 - Version 12.75 (production release)
|
11
|
+
|
12
|
+
- CORRUPTION WARNING: Fixed bug introduced in 12.45 which could result in
|
13
|
+
corrupted Sony ARW images from some newer models when writing if lossless
|
14
|
+
compression was used
|
15
|
+
- Added ability to read C2PA JUMBF metadata from PDF and SVG files
|
16
|
+
- Added ability to extract JUMBF metadata as a block
|
17
|
+
- Added read support for C2PA (JUMBF-format) files
|
18
|
+
- Removed "date before 1970" warning entirely since 64-bit systems should be
|
19
|
+
able to handle dates in this range
|
20
|
+
- Improved Canon FocusMode decoding
|
21
|
+
- Fixed bug introducd in 12.74 which could cause "Undefined subroutine"
|
22
|
+
runtime error when reading MIE files
|
23
|
+
|
10
24
|
Jan. 23, 2024 - Version 12.74
|
11
25
|
|
12
26
|
- Added a couple of new Nikon lenses (thanks Chris)
|
13
27
|
- Added write support for a few new QuickTime Keys tags
|
14
28
|
- Decode ShutterCount for Canon EOS R5 (thanks John Moyer)
|
15
29
|
- Improved error messages in the case of file read errors
|
16
|
-
- Enhanced tag name strings (eg. -if option
|
17
|
-
multiple matching tags to be concatenated when a group name of "All" is
|
30
|
+
- Enhanced tag name strings (eg. -if and -p option arguments) to allow values
|
31
|
+
of multiple matching tags to be concatenated when a group name of "All" is
|
18
32
|
specified
|
19
33
|
- Enhanced -p option to add -p- feature which avoids adding trailing newline
|
20
34
|
- Changed warning from "Shift results in negative time" to "Shift results in
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -14,49 +14,50 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
14
14
|
|
15
15
|
File Types
|
16
16
|
------------+-------------+-------------+-------------+------------
|
17
|
-
360 r/w | DOCX r |
|
18
|
-
3FR r | DPX r |
|
19
|
-
3G2 r/w | DR4 r/w/c |
|
20
|
-
3GP r/w | DSS r |
|
21
|
-
7Z r | DV r |
|
22
|
-
A r | DVB r/w |
|
23
|
-
AA r | DVR-MS r |
|
24
|
-
AAC r | DYLIB r |
|
25
|
-
AAE r | EIP r |
|
26
|
-
AAX r/w | EPS r/w |
|
27
|
-
ACR r | EPUB r |
|
28
|
-
AFM r | ERF r/w |
|
29
|
-
AI r/w | EXE r |
|
30
|
-
AIFF r | EXIF r/w/c |
|
31
|
-
APE r | EXR r |
|
32
|
-
ARQ r/w | EXV r/w/c |
|
33
|
-
ARW r/w | F4A/V r/w |
|
34
|
-
ASF r | FFF r/w |
|
35
|
-
AVI r | FITS r |
|
36
|
-
AVIF r/w | FLA r |
|
37
|
-
AZW r | FLAC r |
|
38
|
-
BMP r | FLIF r/w |
|
39
|
-
BPG r | FLV r |
|
40
|
-
BTF r | FPF r |
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
17
|
+
360 r/w | DOCX r | ITC r | O r | RSRC r
|
18
|
+
3FR r | DPX r | J2C r | ODP r | RTF r
|
19
|
+
3G2 r/w | DR4 r/w/c | JNG r/w | ODS r | RW2 r/w
|
20
|
+
3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
|
21
|
+
7Z r | DV r | JPEG r/w | OFR r | RWZ r
|
22
|
+
A r | DVB r/w | JSON r | OGG r | RM r
|
23
|
+
AA r | DVR-MS r | JXL r | OGV r | SEQ r
|
24
|
+
AAC r | DYLIB r | K25 r | ONP r | SKETCH r
|
25
|
+
AAE r | EIP r | KDC r | OPUS r | SO r
|
26
|
+
AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
|
27
|
+
ACR r | EPUB r | LA r | ORI r/w | SRF r
|
28
|
+
AFM r | ERF r/w | LFP r | OTF r | SRW r/w
|
29
|
+
AI r/w | EXE r | LIF r | PAC r | SVG r
|
30
|
+
AIFF r | EXIF r/w/c | LNK r | PAGES r | SWF r
|
31
|
+
APE r | EXR r | LRV r/w | PBM r/w | THM r/w
|
32
|
+
ARQ r/w | EXV r/w/c | M2TS r | PCD r | TIFF r/w
|
33
|
+
ARW r/w | F4A/V r/w | M4A/V r/w | PCX r | TORRENT r
|
34
|
+
ASF r | FFF r/w | MACOS r | PDB r | TTC r
|
35
|
+
AVI r | FITS r | MAX r | PDF r/w | TTF r
|
36
|
+
AVIF r/w | FLA r | MEF r/w | PEF r/w | TXT r
|
37
|
+
AZW r | FLAC r | MIE r/w/c | PFA r | VCF r
|
38
|
+
BMP r | FLIF r/w | MIFF r | PFB r | VNT r
|
39
|
+
BPG r | FLV r | MKA r | PFM r | VRD r/w/c
|
40
|
+
BTF r | FPF r | MKS r | PGF r | VSD r
|
41
|
+
C2PA r | FPX r | MKV r | PGM r/w | WAV r
|
42
|
+
CHM r | GIF r/w | MNG r/w | PLIST r | WDP r/w
|
43
|
+
COS r | GLV r/w | MOBI r | PICT r | WEBP r/w
|
44
|
+
CR2 r/w | GPR r/w | MODD r | PMP r | WEBM r
|
45
|
+
CR3 r/w | GZ r | MOI r | PNG r/w | WMA r
|
46
|
+
CRM r/w | HDP r/w | MOS r/w | PPM r/w | WMV r
|
47
|
+
CRW r/w | HDR r | MOV r/w | PPT r | WPG r
|
48
|
+
CS1 r/w | HEIC r/w | MP3 r | PPTX r | WTV r
|
49
|
+
CSV r | HEIF r/w | MP4 r/w | PS r/w | WV r
|
50
|
+
CUR r | HTML r | MPC r | PSB r/w | X3F r/w
|
51
|
+
CZI r | ICC r/w/c | MPG r | PSD r/w | XCF r
|
52
|
+
DCM r | ICO r | MPO r/w | PSP r | XISF r
|
53
|
+
DCP r/w | ICS r | MQV r/w | QTIF r/w | XLS r
|
54
|
+
DCR r | IDML r | MRC r | R3D r | XLSX r
|
55
|
+
DFONT r | IIQ r/w | MRW r/w | RA r | XMP r/w/c
|
56
|
+
DIVX r | IND r/w | MXF r | RAF r/w | ZIP r
|
57
|
+
DJVU r | INSP r/w | NEF r/w | RAM r |
|
58
|
+
DLL r | INSV r | NKSC r/w | RAR r |
|
59
|
+
DNG r/w | INX r | NRW r/w | RAW r/w |
|
60
|
+
DOC r | ISO r | NUMBERS r | RIFF r |
|
60
61
|
|
61
62
|
Meta Information
|
62
63
|
----------------------+----------------------+---------------------
|
@@ -108,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
108
109
|
terminal window to extract and run ExifTool:
|
109
110
|
|
110
111
|
cd ~/Desktop
|
111
|
-
gzip -dc Image-ExifTool-12.
|
112
|
-
cd Image-ExifTool-12.
|
112
|
+
gzip -dc Image-ExifTool-12.75.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.75
|
113
114
|
./exiftool t/images/ExifTool.jpg
|
114
115
|
|
115
116
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '12.
|
14
|
+
my $version = '12.75';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -4109,6 +4109,10 @@ sub SuggestedExtension($$$)
|
|
4109
4109
|
$ext = 'pict';
|
4110
4110
|
} elsif ($$valPt =~ /^\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl/s) {
|
4111
4111
|
$ext = 'jxl';
|
4112
|
+
} elsif ($$valPt =~ /^.{4}jumb\0.{3}jumdc2pa/s) {
|
4113
|
+
$ext = 'c2pa';
|
4114
|
+
} elsif ($tag eq 'JUMBF') {
|
4115
|
+
$ext = 'jumbf';
|
4112
4116
|
} else {
|
4113
4117
|
$ext = 'dat';
|
4114
4118
|
}
|
@@ -4645,49 +4649,50 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
4645
4649
|
|
4646
4650
|
File Types
|
4647
4651
|
------------+-------------+-------------+-------------+------------
|
4648
|
-
360 r/w | DOCX r |
|
4649
|
-
3FR r | DPX r |
|
4650
|
-
3G2 r/w | DR4 r/w/c |
|
4651
|
-
3GP r/w | DSS r |
|
4652
|
-
7Z r | DV r |
|
4653
|
-
A r | DVB r/w |
|
4654
|
-
AA r | DVR-MS r |
|
4655
|
-
AAC r | DYLIB r |
|
4656
|
-
AAE r | EIP r |
|
4657
|
-
AAX r/w | EPS r/w |
|
4658
|
-
ACR r | EPUB r |
|
4659
|
-
AFM r | ERF r/w |
|
4660
|
-
AI r/w | EXE r |
|
4661
|
-
AIFF r | EXIF r/w/c |
|
4662
|
-
APE r | EXR r |
|
4663
|
-
ARQ r/w | EXV r/w/c |
|
4664
|
-
ARW r/w | F4A/V r/w |
|
4665
|
-
ASF r | FFF r/w |
|
4666
|
-
AVI r | FITS r |
|
4667
|
-
AVIF r/w | FLA r |
|
4668
|
-
AZW r | FLAC r |
|
4669
|
-
BMP r | FLIF r/w |
|
4670
|
-
BPG r | FLV r |
|
4671
|
-
BTF r | FPF r |
|
4672
|
-
|
4673
|
-
|
4674
|
-
|
4675
|
-
|
4676
|
-
|
4677
|
-
|
4678
|
-
|
4679
|
-
|
4680
|
-
|
4681
|
-
|
4682
|
-
|
4683
|
-
|
4684
|
-
|
4685
|
-
|
4686
|
-
|
4687
|
-
|
4688
|
-
|
4689
|
-
|
4690
|
-
|
4652
|
+
360 r/w | DOCX r | ITC r | O r | RSRC r
|
4653
|
+
3FR r | DPX r | J2C r | ODP r | RTF r
|
4654
|
+
3G2 r/w | DR4 r/w/c | JNG r/w | ODS r | RW2 r/w
|
4655
|
+
3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
|
4656
|
+
7Z r | DV r | JPEG r/w | OFR r | RWZ r
|
4657
|
+
A r | DVB r/w | JSON r | OGG r | RM r
|
4658
|
+
AA r | DVR-MS r | JXL r | OGV r | SEQ r
|
4659
|
+
AAC r | DYLIB r | K25 r | ONP r | SKETCH r
|
4660
|
+
AAE r | EIP r | KDC r | OPUS r | SO r
|
4661
|
+
AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
|
4662
|
+
ACR r | EPUB r | LA r | ORI r/w | SRF r
|
4663
|
+
AFM r | ERF r/w | LFP r | OTF r | SRW r/w
|
4664
|
+
AI r/w | EXE r | LIF r | PAC r | SVG r
|
4665
|
+
AIFF r | EXIF r/w/c | LNK r | PAGES r | SWF r
|
4666
|
+
APE r | EXR r | LRV r/w | PBM r/w | THM r/w
|
4667
|
+
ARQ r/w | EXV r/w/c | M2TS r | PCD r | TIFF r/w
|
4668
|
+
ARW r/w | F4A/V r/w | M4A/V r/w | PCX r | TORRENT r
|
4669
|
+
ASF r | FFF r/w | MACOS r | PDB r | TTC r
|
4670
|
+
AVI r | FITS r | MAX r | PDF r/w | TTF r
|
4671
|
+
AVIF r/w | FLA r | MEF r/w | PEF r/w | TXT r
|
4672
|
+
AZW r | FLAC r | MIE r/w/c | PFA r | VCF r
|
4673
|
+
BMP r | FLIF r/w | MIFF r | PFB r | VNT r
|
4674
|
+
BPG r | FLV r | MKA r | PFM r | VRD r/w/c
|
4675
|
+
BTF r | FPF r | MKS r | PGF r | VSD r
|
4676
|
+
C2PA r | FPX r | MKV r | PGM r/w | WAV r
|
4677
|
+
CHM r | GIF r/w | MNG r/w | PLIST r | WDP r/w
|
4678
|
+
COS r | GLV r/w | MOBI r | PICT r | WEBP r/w
|
4679
|
+
CR2 r/w | GPR r/w | MODD r | PMP r | WEBM r
|
4680
|
+
CR3 r/w | GZ r | MOI r | PNG r/w | WMA r
|
4681
|
+
CRM r/w | HDP r/w | MOS r/w | PPM r/w | WMV r
|
4682
|
+
CRW r/w | HDR r | MOV r/w | PPT r | WPG r
|
4683
|
+
CS1 r/w | HEIC r/w | MP3 r | PPTX r | WTV r
|
4684
|
+
CSV r | HEIF r/w | MP4 r/w | PS r/w | WV r
|
4685
|
+
CUR r | HTML r | MPC r | PSB r/w | X3F r/w
|
4686
|
+
CZI r | ICC r/w/c | MPG r | PSD r/w | XCF r
|
4687
|
+
DCM r | ICO r | MPO r/w | PSP r | XISF r
|
4688
|
+
DCP r/w | ICS r | MQV r/w | QTIF r/w | XLS r
|
4689
|
+
DCR r | IDML r | MRC r | R3D r | XLSX r
|
4690
|
+
DFONT r | IIQ r/w | MRW r/w | RA r | XMP r/w/c
|
4691
|
+
DIVX r | IND r/w | MXF r | RAF r/w | ZIP r
|
4692
|
+
DJVU r | INSP r/w | NEF r/w | RAM r |
|
4693
|
+
DLL r | INSV r | NKSC r/w | RAR r |
|
4694
|
+
DNG r/w | INX r | NRW r/w | RAW r/w |
|
4695
|
+
DOC r | ISO r | NUMBERS r | RIFF r |
|
4691
4696
|
|
4692
4697
|
Meta Information
|
4693
4698
|
----------------------+----------------------+---------------------
|
@@ -5600,7 +5605,7 @@ with this command:
|
|
5600
5605
|
|
5601
5606
|
produces output like this:
|
5602
5607
|
|
5603
|
-
-- Generated by ExifTool 12.
|
5608
|
+
-- Generated by ExifTool 12.75 --
|
5604
5609
|
File: a.jpg - 2003:10:31 15:44:19
|
5605
5610
|
(f/5.6, 1/60s, ISO 100)
|
5606
5611
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
35
35
|
use Image::ExifTool::Validate;
|
36
36
|
use Image::ExifTool::MacOS;
|
37
37
|
|
38
|
-
$VERSION = '3.
|
38
|
+
$VERSION = '3.54';
|
39
39
|
@ISA = qw(Exporter);
|
40
40
|
|
41
41
|
sub NumbersFirst($$);
|
@@ -1642,7 +1642,7 @@ sub WriteTagLookup($$)
|
|
1642
1642
|
} else {
|
1643
1643
|
my $quot = "'";
|
1644
1644
|
# escape non-printable characters in tag ID if necessary
|
1645
|
-
$quot = '"' if s/[\x00-\x1f,\x7f-\xff]/sprintf('\\x%.2x',ord(
|
1645
|
+
$quot = '"' if s/([\x00-\x1f,\x7f-\xff])/sprintf('\\x%.2x',ord($1))/ge;
|
1646
1646
|
$_ = $quot . $_ . $quot;
|
1647
1647
|
}
|
1648
1648
|
}
|
@@ -1655,7 +1655,7 @@ sub WriteTagLookup($$)
|
|
1655
1655
|
} else {
|
1656
1656
|
my $quot = "'";
|
1657
1657
|
# escape non-printable characters in tag ID if necessary
|
1658
|
-
$quot = '"' if $tagID =~ s/[\x00-\x1f,\x7f-\xff]/sprintf('\\x%.2x',ord(
|
1658
|
+
$quot = '"' if $tagID =~ s/([\x00-\x1f,\x7f-\xff])/sprintf('\\x%.2x',ord($1))/ge;
|
1659
1659
|
$entry = "$quot${tagID}$quot";
|
1660
1660
|
}
|
1661
1661
|
my $wrNum = $wrNum{$tableNum};
|
@@ -2206,8 +2206,9 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
2206
2206
|
6 => 'Manual Focus (6)',
|
2207
2207
|
16 => 'Pan Focus', #PH
|
2208
2208
|
# 137 - Single?
|
2209
|
-
256 => 'AF
|
2210
|
-
257 => 'Live View', #
|
2209
|
+
256 => 'One-shot AF (Live View)', #PH/forum15637
|
2210
|
+
257 => 'AI Servo AF (Live View)', #PH/forum15637
|
2211
|
+
258 => 'AI Focus AF (Live View)', #PH/forum15637
|
2211
2212
|
512 => 'Movie Snap Focus', #48
|
2212
2213
|
519 => 'Movie Servo AF', #PH (NC, EOS M)
|
2213
2214
|
},
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
58
58
|
use Image::ExifTool::MakerNotes;
|
59
59
|
|
60
|
-
$VERSION = '4.
|
60
|
+
$VERSION = '4.50';
|
61
61
|
|
62
62
|
sub ProcessExif($$$);
|
63
63
|
sub WriteExif($$$);
|
@@ -4348,6 +4348,7 @@ my %opcodeInfo = (
|
|
4348
4348
|
Deletable => 1,
|
4349
4349
|
SubDirectory => {
|
4350
4350
|
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
4351
|
+
DirName => 'JUMBF',
|
4351
4352
|
ByteOrder => 'BigEndian',
|
4352
4353
|
},
|
4353
4354
|
},
|
@@ -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
|
@@ -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 => File::RandomAccess(\$oldVal)
|
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} = File::RandomAccess(\$value)
|
1588
|
+
$subdirInfo{RAF} = File::RandomAccess->new(\$value) if $valLen;
|
1589
1589
|
|
1590
1590
|
my $oldOrder = GetByteOrder();
|
1591
1591
|
SetByteOrder($format & 0x08 ? 'II' : 'MM');
|
@@ -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
|
}
|