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.
- checksums.yaml +4 -4
- data/bin/Changes +40 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +76 -43
- data/bin/lib/Image/ExifTool/Apple.pm +2 -2
- data/bin/lib/Image/ExifTool/Canon.pm +7 -1
- data/bin/lib/Image/ExifTool/Exif.pm +15 -4
- data/bin/lib/Image/ExifTool/GIF.pm +143 -92
- data/bin/lib/Image/ExifTool/GPS.pm +33 -29
- data/bin/lib/Image/ExifTool/Geotag.pm +43 -9
- data/bin/lib/Image/ExifTool/GoPro.pm +118 -6
- data/bin/lib/Image/ExifTool/JPEG.pm +9 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +10 -2
- data/bin/lib/Image/ExifTool/OOXML.pm +7 -7
- data/bin/lib/Image/ExifTool/PDF.pm +29 -2
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +11 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +6 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5598 -5583
- data/bin/lib/Image/ExifTool/TagNames.pod +64 -6
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +13 -4
- data/bin/lib/Image/ExifTool/Writer.pl +16 -11
- data/bin/lib/Image/ExifTool/XMP.pm +7 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +64 -0
- data/bin/lib/Image/ExifTool.pm +101 -72
- data/bin/lib/Image/ExifTool.pod +16 -3
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -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
|
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
|
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'
|
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'
|
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'
|
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
|
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
|
150
|
-
if ($$et{DEL_GROUP}{
|
151
|
-
# just ignore this chunk if deleting
|
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
|
-
}
|
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, # (
|
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
|
-
|
1328
|
-
|
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
|
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
|
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
|
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.
|
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
|
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
|