exiftool_vendored 12.74.0 → 12.75.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cfaf371fa934366773b7dde5e837c91f975499c1a503f2d5dc5b3e2aa45a83f1
4
- data.tar.gz: 5dc4da573a2ccca50147787b16549efed648f0d8d77c40e59659c5d3fa0469cb
3
+ metadata.gz: 9dda9b74fae35f2dc1e3675ee735a6ef747654f5ab0e92b4ceb64c6dca7d95c1
4
+ data.tar.gz: c6154176d70ab63db1d4c65a2e872a8c727d1545fccc2bf4197998faa295dc7f
5
5
  SHA512:
6
- metadata.gz: 9d1543e5bb5dc636305b208149f84b76262725c9c78062d80aca27bdc0e008c748c8a497fc64d5c34ddd365796c40fcae2d06af64db711ee071da96f2337399f
7
- data.tar.gz: 4ce5b564f2b77b083b55b27444fd8ca2daa2e05339baeeda494a04dd96f4538c117521ee6106263fdc506815b0bd89a4faf34ce964bed58657183013cd9769c1
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.70. (Other versions are
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 expressions) to allow values of
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
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.74"
53
+ "version" : "12.75"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: 0
32
32
  requires:
33
33
  perl: 5.004
34
- version: 12.74
34
+ version: 12.75
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 | ISO r | NRW r/w | RAR r
18
- 3FR r | DPX r | ITC r | NUMBERS r | RAW r/w
19
- 3G2 r/w | DR4 r/w/c | J2C r | O r | RIFF r
20
- 3GP r/w | DSS r | JNG r/w | ODP r | RSRC r
21
- 7Z r | DV r | JP2 r/w | ODS r | RTF r
22
- A r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
23
- AA r | DVR-MS r | JSON r | OFR r | RWL r/w
24
- AAC r | DYLIB r | JXL r | OGG r | RWZ r
25
- AAE r | EIP r | K25 r | OGV r | RM r
26
- AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
27
- ACR r | EPUB r | KEY r | OPUS r | SKETCH r
28
- AFM r | ERF r/w | LA r | ORF r/w | SO r
29
- AI r/w | EXE r | LFP r | ORI r/w | SR2 r/w
30
- AIFF r | EXIF r/w/c | LIF r | OTF r | SRF r
31
- APE r | EXR r | LNK r | PAC r | SRW r/w
32
- ARQ r/w | EXV r/w/c | LRV r/w | PAGES r | SVG r
33
- ARW r/w | F4A/V r/w | M2TS r | PBM r/w | SWF r
34
- ASF r | FFF r/w | M4A/V r/w | PCD r | THM r/w
35
- AVI r | FITS r | MACOS r | PCX r | TIFF r/w
36
- AVIF r/w | FLA r | MAX r | PDB r | TORRENT r
37
- AZW r | FLAC r | MEF r/w | PDF r/w | TTC r
38
- BMP r | FLIF r/w | MIE r/w/c | PEF r/w | TTF r
39
- BPG r | FLV r | MIFF r | PFA r | TXT r
40
- BTF r | FPF r | MKA r | PFB r | VCF r
41
- CHM r | FPX r | MKS r | PFM r | VNT r
42
- COS r | GIF r/w | MKV r | PGF r | VRD r/w/c
43
- CR2 r/w | GLV r/w | MNG r/w | PGM r/w | VSD r
44
- CR3 r/w | GPR r/w | MOBI r | PLIST r | WAV r
45
- CRM r/w | GZ r | MODD r | PICT r | WDP r/w
46
- CRW r/w | HDP r/w | MOI r | PMP r | WEBP r/w
47
- CS1 r/w | HDR r | MOS r/w | PNG r/w | WEBM r
48
- CSV r | HEIC r/w | MOV r/w | PPM r/w | WMA r
49
- CUR r | HEIF r/w | MP3 r | PPT r | WMV r
50
- CZI r | HTML r | MP4 r/w | PPTX r | WPG r
51
- DCM r | ICC r/w/c | MPC r | PS r/w | WTV r
52
- DCP r/w | ICO r | MPG r | PSB r/w | WV r
53
- DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
54
- DFONT r | IDML r | MQV r/w | PSP r | XCF r
55
- DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
56
- DJVU r | IND r/w | MRW r/w | R3D r | XLS r
57
- DLL r | INSP r/w | MXF r | RA r | XLSX r
58
- DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
59
- DOC r | INX r | NKSC r/w | RAM r | ZIP r
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.74.tar.gz | tar -xf -
112
- cd Image-ExifTool-12.74
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.74';
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 | ISO r | NRW r/w | RAR r
4649
- 3FR r | DPX r | ITC r | NUMBERS r | RAW r/w
4650
- 3G2 r/w | DR4 r/w/c | J2C r | O r | RIFF r
4651
- 3GP r/w | DSS r | JNG r/w | ODP r | RSRC r
4652
- 7Z r | DV r | JP2 r/w | ODS r | RTF r
4653
- A r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
4654
- AA r | DVR-MS r | JSON r | OFR r | RWL r/w
4655
- AAC r | DYLIB r | JXL r | OGG r | RWZ r
4656
- AAE r | EIP r | K25 r | OGV r | RM r
4657
- AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
4658
- ACR r | EPUB r | KEY r | OPUS r | SKETCH r
4659
- AFM r | ERF r/w | LA r | ORF r/w | SO r
4660
- AI r/w | EXE r | LFP r | ORI r/w | SR2 r/w
4661
- AIFF r | EXIF r/w/c | LIF r | OTF r | SRF r
4662
- APE r | EXR r | LNK r | PAC r | SRW r/w
4663
- ARQ r/w | EXV r/w/c | LRV r/w | PAGES r | SVG r
4664
- ARW r/w | F4A/V r/w | M2TS r | PBM r/w | SWF r
4665
- ASF r | FFF r/w | M4A/V r/w | PCD r | THM r/w
4666
- AVI r | FITS r | MACOS r | PCX r | TIFF r/w
4667
- AVIF r/w | FLA r | MAX r | PDB r | TORRENT r
4668
- AZW r | FLAC r | MEF r/w | PDF r/w | TTC r
4669
- BMP r | FLIF r/w | MIE r/w/c | PEF r/w | TTF r
4670
- BPG r | FLV r | MIFF r | PFA r | TXT r
4671
- BTF r | FPF r | MKA r | PFB r | VCF r
4672
- CHM r | FPX r | MKS r | PFM r | VNT r
4673
- COS r | GIF r/w | MKV r | PGF r | VRD r/w/c
4674
- CR2 r/w | GLV r/w | MNG r/w | PGM r/w | VSD r
4675
- CR3 r/w | GPR r/w | MOBI r | PLIST r | WAV r
4676
- CRM r/w | GZ r | MODD r | PICT r | WDP r/w
4677
- CRW r/w | HDP r/w | MOI r | PMP r | WEBP r/w
4678
- CS1 r/w | HDR r | MOS r/w | PNG r/w | WEBM r
4679
- CSV r | HEIC r/w | MOV r/w | PPM r/w | WMA r
4680
- CUR r | HEIF r/w | MP3 r | PPT r | WMV r
4681
- CZI r | HTML r | MP4 r/w | PPTX r | WPG r
4682
- DCM r | ICC r/w/c | MPC r | PS r/w | WTV r
4683
- DCP r/w | ICO r | MPG r | PSB r/w | WV r
4684
- DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
4685
- DFONT r | IDML r | MQV r/w | PSP r | XCF r
4686
- DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
4687
- DJVU r | IND r/w | MRW r/w | R3D r | XLS r
4688
- DLL r | INSP r/w | MXF r | RA r | XLSX r
4689
- DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
4690
- DOC r | INX r | NKSC r/w | RAM r | ZIP r
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.74 --
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.53';
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($&))/ge;
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($&))/ge;
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 + MF', #PH (NC, EOS M)
2210
- 257 => 'Live View', #forum12082
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.49';
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.38';
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 command-line arguments
145
- for reading C2PA metadata are C<-jumbf:all -G3 -b -j -u -struct>. This
146
- metadata may be deleted from writable JPEG, PNG, WebP, TIFF-based, and
147
- QuickTime-based files by deleting the JUMBF group with C<-jumbf:all=>.
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 (see # (used when tag is renamed according to JUMDLabel)
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
- # read from RAF unless reading from buffer
1024
- $raf = $$dirInfo{RAF} unless $dataPt;
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 ($$dirInfo{DirName} and $$dirInfo{DirName} eq 'JP2Header') {
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($$dirInfo{DirName}) if $verbose;
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
- delete $$tagInfo{Description};
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.53';
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)->new,
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)->new if $valLen;
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.57';
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
- ProcessDict($et, $subTablePtr, $subDict, $xref, $nesting);
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
- unless ($$tagInfo{SubDirectory}) {
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($tagInfo->{SubDirectory}->{TagTable});
2174
+ my $subTablePtr = GetTagTable($$subdir{TagTable});
2125
2175
  unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) {
2126
2176
  $et->Warn("Error processing $$tagInfo{Name} information");
2127
2177
  }