exiftool_vendored 13.02.0 → 13.04.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.
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 28165 tags, with 17491 unique tag names.
15
+ They contain a total of 28187 tags, with 17502 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -147,8 +147,10 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
147
147
  DJI-DBG DJI Info
148
148
  'APP8' SPIFF JPEG SPIFF
149
149
  InfiRayIsothermal InfiRay Isothermal
150
+ SEAL XMP SEAL
150
151
  'APP9' MediaJukebox JPEG MediaJukebox
151
152
  InfiRaySensor InfiRay Sensor
153
+ SEAL XMP SEAL
152
154
  'APP10' Comment no
153
155
  'APP11' JPEG-HDR JPEG HDR
154
156
  JUMBF Jpeg2000
@@ -1053,6 +1055,7 @@ for the official EXIF 2.32 specification.
1053
1055
  0xcd49 JXLDistance IFD0 float
1054
1056
  0xcd4a JXLEffort IFD0 int32u
1055
1057
  0xcd4b JXLDecodeSpeed IFD0 int32u
1058
+ 0xcea1 SEAL IFD0 XMP SEAL
1056
1059
  0xea1c Padding ExifIFD undef!
1057
1060
  0xea1d OffsetSchema ExifIFD int32s!
1058
1061
  0xfde8 OwnerName ExifIFD string/
@@ -1427,6 +1430,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1427
1430
  pur XMP pur
1428
1431
  rdf XMP rdf
1429
1432
  sdc Nikon sdc
1433
+ seal XMP seal
1430
1434
  swf XMP swf
1431
1435
  tiff XMP tiff
1432
1436
  x XMP x
@@ -6152,6 +6156,41 @@ These tags belong to the ExifTool XMP-rdf family 1 group.
6152
6156
  -------- --------
6153
6157
  About string!
6154
6158
 
6159
+ =head3 XMP seal Tags
6160
+
6161
+ SEAL embedded in XMP.
6162
+
6163
+ These tags belong to the ExifTool XMP-seal family 1 group.
6164
+
6165
+ Tag Name Writable
6166
+ -------- --------
6167
+ Seal XMP SEAL
6168
+
6169
+ =head3 XMP SEAL Tags
6170
+
6171
+ These tags are used in SEAL (Secure Evidence Attribution Label) content
6172
+ authentification, which is actually XML format, not XMP. ExifTool has
6173
+ read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
6174
+ PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
6175
+ C<-seal:all=> on the command line to delete SEAL information in supported
6176
+ formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
6177
+
6178
+ Tag ID Tag Name Writable
6179
+ ------ -------- --------
6180
+ 'b' ByteRange no
6181
+ 'copyright' Copyright no
6182
+ 'd' Domain no
6183
+ 'da' DigestAlgorithm no
6184
+ 'id' Identifier no
6185
+ 'info' SEALComment no
6186
+ 'ka' KeyAlgorithm no
6187
+ 'kv' KeyVersion no
6188
+ 's' Signature no
6189
+ 'seal' SEALVersion no
6190
+ 'sf' SignatureFormat no
6191
+ 'sl' SignatureLength no
6192
+ 'uid' UniqueIdentifier no
6193
+
6155
6194
  =head3 XMP swf Tags
6156
6195
 
6157
6196
  Adobe SWF namespace tags.
@@ -8838,7 +8877,7 @@ access to this information.
8838
8877
  0x0432 MeasurementScale? no
8839
8878
  0x0433 TimelineInfo? no
8840
8879
  0x0434 SheetDisclosure? no
8841
- 0x0435 DisplayInfo? no
8880
+ 0x0435 ChannelOptions? no
8842
8881
  0x0436 OnionSkins? no
8843
8882
  0x0438 CountInfo? no
8844
8883
  0x043a PrintInfo2? no
@@ -24680,6 +24719,7 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24680
24719
  'GLPI' GPSPos GoPro GLPI
24681
24720
  'GPRI' GPSRaw? GoPro GPRI
24682
24721
  'GPS5' GPSInfo GoPro GPS5
24722
+ 'GPS9' GPSInfo9 GoPro GPS9
24683
24723
  'GPSA' GPSAltitudeSystem no
24684
24724
  'GPSF' GPSMeasureMode no
24685
24725
  'GPSP' GPSHPositioningError no
@@ -24725,6 +24765,7 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24725
24765
  'TMPC' CameraTemperature no
24726
24766
  'TSMP' TotalSamples? no
24727
24767
  'TYPE' StructureType? no
24768
+ 'TZON' TimeZone no
24728
24769
  'UNIF' InputUniformity no
24729
24770
  'UNIT' Units? no
24730
24771
  'VERS' MetadataVersion no
@@ -24769,6 +24810,19 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24769
24810
  3 GPSSpeed no
24770
24811
  4 GPSSpeed3D no
24771
24812
 
24813
+ =head3 GoPro GPS9 Tags
24814
+
24815
+ Index Tag Name Writable
24816
+ ----- -------- --------
24817
+ 0 GPSLatitude no
24818
+ 1 GPSLongitude no
24819
+ 2 GPSAltitude no
24820
+ 3 GPSSpeed no
24821
+ 4 GPSSpeed3D no
24822
+ 6 GPSDateTime no
24823
+ 7 GPSDOP no
24824
+ 8 GPSMeasureMode no
24825
+
24772
24826
  =head3 GoPro KBAT Tags
24773
24827
 
24774
24828
  Battery status information found in GoPro Karma videos.
@@ -28129,6 +28183,7 @@ check if speed is more of a concern.
28129
28183
  'sPLT' SuggestedPalette no
28130
28184
  'sRGB' SRGBRendering yes!
28131
28185
  'sTER' StereoImage PNG StereoImage
28186
+ 'seAl' SEAL XMP SEAL
28132
28187
  'tEXt' TextualData PNG TextualData
28133
28188
  'tIME' ModifyDate yes
28134
28189
  'tRNS' Transparency no
@@ -29232,7 +29287,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29232
29287
 
29233
29288
  Tag ID Tag Name Writable
29234
29289
  ------ -------- --------
29235
- '_stream' _stream Photoshop
29290
+ '_stream' PhotoshopStream Photoshop
29236
29291
 
29237
29292
  =head3 PDF Illustrator Tags
29238
29293
 
@@ -29255,7 +29310,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29255
29310
 
29256
29311
  Tag ID Tag Name Writable
29257
29312
  ------ -------- --------
29258
- '_stream' _stream PostScript
29313
+ '_stream' AIStream PostScript
29259
29314
 
29260
29315
  =head3 PDF Resources Tags
29261
29316
 
@@ -29284,7 +29339,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29284
29339
 
29285
29340
  Tag ID Tag Name Writable
29286
29341
  ------ -------- --------
29287
- '_stream' _stream ICC_Profile
29342
+ '_stream' ICC_Profile ICC_Profile
29288
29343
 
29289
29344
  =head3 PDF Properties Tags
29290
29345
 
@@ -29852,6 +29907,7 @@ for the official QuickTime specification.
29852
29907
  'GPS ' GPSDataList2? no
29853
29908
  'IDIT' DateTimeOriginal string
29854
29909
  'PICT' PreviewPICT no
29910
+ 'SEAL' SEAL XMP SEAL
29855
29911
  '_htc' HTCInfo QuickTime HTCInfo
29856
29912
  'ardt' ARDroneFile no
29857
29913
  'cust' CustomInfo no
@@ -29906,7 +29962,7 @@ for the official QuickTime specification.
29906
29962
  The tags below are extracted from timed metadata in QuickTime and other
29907
29963
  formats of video files when the ExtractEmbedded option is used. Although
29908
29964
  most of these tags are combined into the single table below, ExifTool
29909
- currently reads 78 different formats of timed GPS metadata from video files.
29965
+ currently reads 82 different formats of timed GPS metadata from video files.
29910
29966
 
29911
29967
  Tag Name Writable
29912
29968
  -------- --------
@@ -31651,6 +31707,7 @@ metadata to WEBP images, but can't yet write to other RIFF-based formats.
31651
31707
  'LIST_hydt' PentaxData Pentax AVI
31652
31708
  'LIST_ncdt' NikonData Nikon AVI
31653
31709
  'LIST_pntx' PentaxData2 Pentax AVI
31710
+ 'SEAL' SEAL XMP SEAL
31654
31711
  'SGLT' BikeBroAccel QuickTime Stream
31655
31712
  'SLLT' BikeBroGPS QuickTime Stream
31656
31713
  'VP8 ' VP8Bitstream RIFF VP8
@@ -33258,6 +33315,7 @@ Matroska specification.
33258
33315
  0xb538667 SignatureSlot Matroska
33259
33316
  0xc53bb6b Cues Matroska
33260
33317
  0xf43b675 Cluster Matroska
33318
+ 0x5345414c SEAL XMP SEAL
33261
33319
 
33262
33320
  =head3 Matroska Projection Tags
33263
33321
 
@@ -34,6 +34,11 @@ my %webpMap = (
34
34
  MakerNotes => 'ExifIFD',
35
35
  );
36
36
 
37
+ my %deletableGroup = (
38
+ "XMP\0" => 'XMP', # delete incorrectly written "XMP\0" tag with XMP group
39
+ SEAL => 'SEAL', # delete SEAL tag with SEAL group
40
+ );
41
+
37
42
  #------------------------------------------------------------------------------
38
43
  # Write RIFF file (currently WebP-type only)
39
44
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref
@@ -46,6 +51,7 @@ sub WriteRIFF($$)
46
51
  my $outfile = $$dirInfo{OutFile};
47
52
  my $outsize = 0;
48
53
  my $raf = $$dirInfo{RAF};
54
+ my $verbose = $et->Options('Verbose');
49
55
  my ($buff, $err, $pass, %has, %dirDat, $imageWidth, $imageHeight);
50
56
 
51
57
  # do this in 2 passes so we can set the size of the containing RIFF chunk
@@ -65,6 +71,7 @@ sub WriteRIFF($$)
65
71
  SetByteOrder('II');
66
72
 
67
73
  # determine which directories we must write for this file type
74
+ $et->Options(Verbose => 0) if $pass; # (avoid duplicate Verbose options here)
68
75
  $et->InitWriteDirs(\%webpMap);
69
76
  my $addDirs = $$et{ADD_DIRS};
70
77
  my $editDirs = $$et{EDIT_DIRS};
@@ -73,6 +80,7 @@ sub WriteRIFF($$)
73
80
 
74
81
  # write header
75
82
  if ($pass) {
83
+ $et->Options(Verbose => $verbose);
76
84
  my $needsVP8X = ($has{ANIM} or $has{'XMP '} or $has{EXIF} or
77
85
  $has{ALPH} or $has{ICCP});
78
86
  if ($has{VP8X} and not $needsVP8X and $$et{CHANGED}) {
@@ -146,13 +154,14 @@ sub WriteRIFF($$)
146
154
  # RIFF chunks are padded to an even number of bytes
147
155
  my $len2 = $len + ($len & 0x01);
148
156
  # handle incorrect "XMP\0" chunk ID written by Google software
149
- if ($tag eq "XMP\0") {
150
- if ($$et{DEL_GROUP}{XMP}) {
151
- # just ignore this chunk if deleting XMP
157
+ if ($deletableGroup{$tag}) {
158
+ if ($$et{DEL_GROUP}{$deletableGroup{$tag}}) {
159
+ # just ignore this chunk if deleting the associated group
152
160
  $raf->Seek($len2, 1) or $et->Error('Seek error'), last;
161
+ $et->VPrint(0, " Deleting $deletableGroup{$tag}\n") if $pass;
153
162
  ++$$et{CHANGED};
154
163
  next;
155
- } else {
164
+ } elsif ($tag eq "XMP\0") {
156
165
  $et->Warn('Incorrect XMP tag ID',1) if $pass;
157
166
  }
158
167
  }
@@ -43,6 +43,7 @@ my %tiffMap = (
43
43
  PrintIM => 'IFD0',
44
44
  IPTC => 'IFD0',
45
45
  Photoshop => 'IFD0',
46
+ SEAL => 'IFD0',
46
47
  InteropIFD => 'ExifIFD',
47
48
  MakerNotes => 'ExifIFD',
48
49
  CanonVRD => 'MakerNotes', # (so VRDOffset will get updated)
@@ -74,6 +75,7 @@ my %jpegMap = (
74
75
  Meta => 'APP3',
75
76
  MetaIFD => 'Meta',
76
77
  RMETA => 'APP5',
78
+ SEAL => ['APP8','APP9'], # (note: add 'IFD0' if this is a possibility)
77
79
  Ducky => 'APP12',
78
80
  Photoshop => 'APP13',
79
81
  Adobe => 'APP14',
@@ -140,7 +142,7 @@ my @delGroups = qw(
140
142
  GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC ItemList JFIF
141
143
  Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF Nextbase NikonApp
142
144
  NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs PrintIM
143
- QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
145
+ QuickTime RMETA RSRC SEAL SubIFD Trailer UserData XML XML-* XMP XMP-*
144
146
  );
145
147
  # family 2 group names that we can delete
146
148
  my @delGroup2 = qw(
@@ -152,6 +154,7 @@ my %delMore = (
152
154
  QuickTime => [ qw(ItemList UserData Keys) ],
153
155
  XMP => [ 'XMP-*' ],
154
156
  XML => [ 'XML-*' ],
157
+ SEAL => [ 'XMP-SEAL' ],
155
158
  );
156
159
 
157
160
  # family 0 groups where directories should never be deleted
@@ -1311,7 +1314,7 @@ sub SetNewValuesFromFile($$;@)
1311
1314
  LimitLongValues => 10000000, # (10 MB)
1312
1315
  List => 1,
1313
1316
  MakerNotes => $$options{FastScan} && $$options{FastScan} > 1 ? undef : 1,
1314
- RequestAll => $$options{RequestAll} || 1, # (is this still necessary now that RequestTags are being set?)
1317
+ RequestAll => $$options{RequestAll} || 1, # (must request all because reqTags doesn't cover wildcards)
1315
1318
  StrictDate => defined $$options{StrictDate} ? $$options{StrictDate} : 1,
1316
1319
  Struct => $structOpt,
1317
1320
  );
@@ -1324,11 +1327,8 @@ sub SetNewValuesFromFile($$;@)
1324
1327
  $$srcExifTool{ALT_EXIFTOOL} = $$self{ALT_EXIFTOOL};
1325
1328
  foreach $tag (@setTags) {
1326
1329
  next if ref $tag;
1327
- if ($tag =~ /^-(.*)/) {
1328
- # avoid extracting tags that are excluded
1329
- push @exclude, $1;
1330
- next;
1331
- }
1330
+ # avoid extracting tags that are excluded
1331
+ $tag =~ /^-(.*)/ and push(@exclude, $1), next;
1332
1332
  # add specified tags to list of requested tags
1333
1333
  $_ = $tag;
1334
1334
  if (/(.+?)\s*(>|<)\s*(.+)/) {
@@ -2983,7 +2983,7 @@ Conv: for (;;) {
2983
2983
  $err2 = eval $$tagInfo{WriteCheck};
2984
2984
  $@ and warn($@), $err2 = 'Error evaluating WriteCheck';
2985
2985
  }
2986
- unless ($err2) {
2986
+ unless (defined $err2) {
2987
2987
  my $table = $$tagInfo{Table};
2988
2988
  if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
2989
2989
  my $checkProc = $$table{CHECK_PROC};
@@ -6621,6 +6621,11 @@ sub WriteJPEG($$)
6621
6621
  $segType = 'Ricoh RMETA';
6622
6622
  $$delGroup{RMETA} and $del = 1;
6623
6623
  }
6624
+ } elsif ($marker == 0xe8 or $marker == 0xe9) { # APP8/9 (SEAL)
6625
+ if ($$segDataPt =~ /^SEAL\0/) {
6626
+ $segType = 'SEAL';
6627
+ $$delGroup{SEAL} and $del = 1;
6628
+ }
6624
6629
  } elsif ($marker == 0xeb) { # APP10 (JUMBF)
6625
6630
  if ($$segDataPt =~ /^JP/) {
6626
6631
  $segType = 'JUMBF';
@@ -6987,7 +6992,7 @@ sub SetFileTime($$;$$$$)
6987
6992
  # get Win32 handle, needed for SetFileTime
6988
6993
  my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
6989
6994
  unless ($win32Handle) {
6990
- $self->Warn('Win32API::File::GetOsFHandle returned invalid handle');
6995
+ $self->Warn('Win32API::File GetOsFHandle returned invalid handle');
6991
6996
  return 0;
6992
6997
  }
6993
6998
  # convert Unix seconds to FILETIME structs
@@ -7005,13 +7010,13 @@ sub SetFileTime($$;$$$$)
7005
7010
  return 0 if defined $k32SetFileTime;
7006
7011
  $k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
7007
7012
  unless ($k32SetFileTime) {
7008
- $self->Warn('Error calling Win32::API::SetFileTime');
7013
+ $self->Warn('Error loading Win32::API SetFileTime');
7009
7014
  $k32SetFileTime = 0;
7010
7015
  return 0;
7011
7016
  }
7012
7017
  }
7013
7018
  unless ($k32SetFileTime->Call($win32Handle, $ctime, $atime, $mtime)) {
7014
- $self->Warn('Win32::API::SetFileTime returned ' . Win32::GetLastError());
7019
+ $self->Warn('Win32::API SetFileTime returned ' . Win32::GetLastError());
7015
7020
  return 0;
7016
7021
  }
7017
7022
  return 1;
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.68';
53
+ $VERSION = '3.69';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -203,6 +203,7 @@ my %xmpNS = (
203
203
  hdr_metadata => 'http://ns.adobe.com/hdr-metadata/1.0/',
204
204
  hdrgm => 'http://ns.adobe.com/hdr-gain-map/1.0/',
205
205
  xmpDSA => 'http://leica-camera.com/digital-shift-assistant/1.0/',
206
+ seal => 'http://ns.seal/2024/1.0/',
206
207
  # Note: Google uses a prefix of 'Container', but this conflicts with the
207
208
  # Device Container namespace, also by Google. So call this one GContainer
208
209
  GContainer=> 'http://ns.google.com/photos/1.0/container/',
@@ -933,6 +934,10 @@ my %sRangeMask = (
933
934
  Name => 'xmpDSA',
934
935
  SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
935
936
  },
937
+ seal => {
938
+ Name => 'seal',
939
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::seal' },
940
+ },
936
941
  GContainer => {
937
942
  Name => 'GContainer',
938
943
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::GContainer' },
@@ -4142,7 +4147,7 @@ sub ParseXMPElement($$$;$$$$)
4142
4147
 
4143
4148
  #------------------------------------------------------------------------------
4144
4149
  # Process XMP data
4145
- # Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) Pointer to tag table
4150
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
4146
4151
  # Returns: 1 on success
4147
4152
  # Notes: The following flavours of XMP files are currently recognized:
4148
4153
  # - standard XMP with xpacket, x:xmpmeta and rdf:RDF elements
@@ -25,6 +25,7 @@ use strict;
25
25
  use Image::ExifTool qw(:Utils);
26
26
  use Image::ExifTool::XMP;
27
27
 
28
+ sub ProcessSEAL($$;$);
28
29
  sub Init_crd($);
29
30
 
30
31
  #------------------------------------------------------------------------------
@@ -2290,6 +2291,69 @@ my %sACDSeeRegionStruct = (
2290
2291
  },
2291
2292
  );
2292
2293
 
2294
+ %Image::ExifTool::XMP::seal = (
2295
+ GROUPS => { 0 => 'XMP', 1 => 'XMP-seal', 2 => 'Image' },
2296
+ NAMESPACE => 'seal',
2297
+ WRITABLE => 'string',
2298
+ NOTES => 'SEAL embedded in XMP.',
2299
+ seal => {
2300
+ Name => 'Seal',
2301
+ Binary => 1,
2302
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
2303
+ },
2304
+ );
2305
+
2306
+ %Image::ExifTool::XMP::SEAL = (
2307
+ GROUPS => { 0 => 'XML', 1 => 'SEAL', 2 => 'Document' },
2308
+ PROCESS_PROC => \&ProcessSEAL,
2309
+ NOTES => q{
2310
+ These tags are used in SEAL (Secure Evidence Attribution Label) content
2311
+ authentification, which is actually XML format, not XMP. ExifTool has
2312
+ read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
2313
+ PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
2314
+ C<-seal:all=> on the command line to delete SEAL information in supported
2315
+ formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
2316
+ },
2317
+ seal=> 'SEALVersion',
2318
+ ka => 'KeyAlgorithm',
2319
+ kv => 'KeyVersion',
2320
+ da => 'DigestAlgorithm',
2321
+ b => 'ByteRange',
2322
+ d => 'Domain',
2323
+ uid => 'UniqueIdentifier',
2324
+ id => 'Identifier',
2325
+ sf => 'SignatureFormat',
2326
+ sl => 'SignatureLength',
2327
+ 's' => 'Signature',
2328
+ info=> 'SEALComment',
2329
+ copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
2330
+ );
2331
+
2332
+ #------------------------------------------------------------------------------
2333
+ # We found a SEAL property name/value
2334
+ # Inputs: 0) ExifTool ref, 1) tag table ref, 2) xmp property list ref
2335
+ # 3) property value, 4) attribute hash ref
2336
+ # Returns: 1 if valid tag was found
2337
+ sub FoundSEAL($$$$;$)
2338
+ {
2339
+ my ($et, $tagTablePtr, $props, $val, $attrs) = @_;
2340
+ # remove 'seal' container property from name
2341
+ my @sealProps = @$props;
2342
+ shift @sealProps if @sealProps and $sealProps[0] eq 'seal';
2343
+ return FoundXMP($et, $tagTablePtr, \@sealProps, $val, $attrs);
2344
+ }
2345
+
2346
+ #------------------------------------------------------------------------------
2347
+ # Process SEAL XML
2348
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2349
+ # Returns: 1 on success
2350
+ sub ProcessSEAL($$;$)
2351
+ {
2352
+ my ($et, $dirInfo, $tagTablePtr) = @_;
2353
+ $$dirInfo{XMPParseOpts}{FoundProc} = \&FoundSEAL;
2354
+ return ProcessXMP($et, $dirInfo, $tagTablePtr);
2355
+ }
2356
+
2293
2357
  #------------------------------------------------------------------------------
2294
2358
  # Generate crd tags
2295
2359
  # Inputs: 0) tag table ref