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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +41 -2
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +46 -45
  6. data/bin/exiftool +97 -83
  7. data/bin/lib/File/RandomAccess.pm +31 -5
  8. data/bin/lib/File/RandomAccess.pod +4 -4
  9. data/bin/lib/Image/ExifTool/7Z.pm +3 -3
  10. data/bin/lib/Image/ExifTool/AFCP.pm +2 -2
  11. data/bin/lib/Image/ExifTool/BZZ.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
  13. data/bin/lib/Image/ExifTool/Canon.pm +6 -5
  14. data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
  15. data/bin/lib/Image/ExifTool/DICOM.pm +2 -2
  16. data/bin/lib/Image/ExifTool/DNG.pm +4 -4
  17. data/bin/lib/Image/ExifTool/Exif.pm +3 -2
  18. data/bin/lib/Image/ExifTool/FLIR.pm +2 -2
  19. data/bin/lib/Image/ExifTool/Fixup.pm +3 -3
  20. data/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
  21. data/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
  22. data/bin/lib/Image/ExifTool/Geotag.pm +3 -3
  23. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
  24. data/bin/lib/Image/ExifTool/ID3.pm +2 -2
  25. data/bin/lib/Image/ExifTool/Import.pm +5 -5
  26. data/bin/lib/Image/ExifTool/JSON.pm +2 -2
  27. data/bin/lib/Image/ExifTool/Jpeg2000.pm +51 -12
  28. data/bin/lib/Image/ExifTool/MIE.pm +3 -3
  29. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  30. data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
  31. data/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
  32. data/bin/lib/Image/ExifTool/Ogg.pm +2 -2
  33. data/bin/lib/Image/ExifTool/PDF.pm +54 -4
  34. data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
  35. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
  36. data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
  37. data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  38. data/bin/lib/Image/ExifTool/PostScript.pm +2 -2
  39. data/bin/lib/Image/ExifTool/QuickTime.pm +41 -107
  40. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +8 -6
  41. data/bin/lib/Image/ExifTool/RSRC.pm +2 -2
  42. data/bin/lib/Image/ExifTool/Samsung.pm +4 -4
  43. data/bin/lib/Image/ExifTool/Shift.pl +1 -2
  44. data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
  45. data/bin/lib/Image/ExifTool/Sony.pm +3 -3
  46. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  47. data/bin/lib/Image/ExifTool/TagLookup.pm +8 -5
  48. data/bin/lib/Image/ExifTool/TagNames.pod +36 -5
  49. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  50. data/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
  51. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  52. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
  53. data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
  54. data/bin/lib/Image/ExifTool/Writer.pl +68 -44
  55. data/bin/lib/Image/ExifTool/XMP.pm +2 -1
  56. data/bin/lib/Image/ExifTool/XMP2.pl +9 -0
  57. data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
  58. data/bin/lib/Image/ExifTool.pm +42 -26
  59. data/bin/lib/Image/ExifTool.pod +76 -71
  60. data/bin/perl-Image-ExifTool.spec +45 -44
  61. data/lib/exiftool_vendored/version.rb +1 -1
  62. 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.37';
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
@@ -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} = new File::RandomAccess(\$buff);
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.52';
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 => new 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} = new File::RandomAccess(\$value) 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');
@@ -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.19';
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 = new File::RandomAccess($$dirInfo{DataPt});
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.29';
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 accomodate 4 new values?
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 accomodate 4 new values?
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 accomodate 4 new values?
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.02';
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 => new File::RandomAccess(\$val{$stream}) );
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.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
  }
@@ -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.11';
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} = new File::RandomAccess(\$buf2);
354
+ $$dirInfo{RAF} = File::RandomAccess->new(\$buf2);
355
355
  } else {
356
- $$dirInfo{RAF} = new File::RandomAccess($dataPt);
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.28';
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 = new File::RandomAccess($dataPt);
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 => new File::RandomAccess($dataPt),
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.09';
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 = new Image::ExifTool::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.69';
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 = new Image::ExifTool;
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 = new File::RandomAccess($dataPt);
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.44';
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 = new File::RandomAccess($$dirInfo{DataPt});
433
+ $raf = File::RandomAccess->new($$dirInfo{DataPt});
434
434
  $et->VerboseDir('PostScript');
435
435
  }
436
436
  #