exiftool_vendored 12.74.0 → 12.76.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  }
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '2.92';
51
+ $VERSION = '2.93';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -663,6 +663,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
663
663
  Deletable => 1,
664
664
  SubDirectory => {
665
665
  TagTable => 'Image::ExifTool::Jpeg2000::Main',
666
+ DirName => 'JUMBF',
666
667
  # 16 bytes uuid
667
668
  # +4 bytes 0
668
669
  # +9 bytes "manifest\0"
@@ -361,7 +361,7 @@ sub ShiftTime($;$$$)
361
361
  };
362
362
  # not a problem if we failed here since we'll just try again next time,
363
363
  # so don't return error message
364
- unless (@$) {
364
+ unless ($@) {
365
365
  my $mode;
366
366
  if (defined $time[0]) {
367
367
  $mode = defined $time[3] ? 'DateTime' : 'Date';
@@ -403,7 +403,6 @@ sub ShiftTime($;$$$)
403
403
  };
404
404
  $@ and return CleanWarning($@);
405
405
  $tm += $$shiftOffset{$mode}; # apply the shift
406
- $tm < 0 and return 'Shift results in date before 1970';
407
406
  # save fractional seconds in shifted time
408
407
  $frac = $tm - int($tm);
409
408
  if ($frac) {
@@ -7595,6 +7595,7 @@ my %tagExists = (
7595
7595
  'aeliveviewhistograminfo' => 1,
7596
7596
  'aeliveviewlocalhistogram' => 1,
7597
7597
  'aelocalhistogram' => 1,
7598
+ 'af' => 1,
7598
7599
  'af-cprioritysel' => 1,
7599
7600
  'af-sprioritysel' => 1,
7600
7601
  'afarea' => 1,
@@ -9042,6 +9043,7 @@ my %tagExists = (
9042
9043
  'editedby' => 1,
9043
9044
  'editor' => 1,
9044
9045
  'edittagarray' => 1,
9046
+ 'ef' => 1,
9045
9047
  'effect' => 1,
9046
9048
  'effectivebw' => 1,
9047
9049
  'effectstrength' => 1,
@@ -9195,6 +9197,7 @@ my %tagExists = (
9195
9197
  'extrasamples' => 1,
9196
9198
  'extraticklocations' => 1,
9197
9199
  'f-stop' => 1,
9200
+ 'f_' => 1,
9198
9201
  'face1birthday' => 1,
9199
9202
  'face1category' => 1,
9200
9203
  'face1name' => 1,
@@ -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 27473 tags, with 17233 unique tag names.
15
+ They contain a total of 27474 tags, with 17233 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
@@ -25405,10 +25405,13 @@ C2PA (Coalition for Content Provenance and Authenticity) CAI (Content
25405
25405
  Authenticity Initiative) JUMBF (JPEG Universal Metadata Box Format) metdata
25406
25406
  is currently extracted from JPEG, PNG, TIFF-based (eg. TIFF, DNG),
25407
25407
  QuickTime-based (eg. MP4, MOV, HEIF, AVIF), RIFF-based (eg. WAV, AVI, WebP),
25408
- GIF files and ID3v2 metadata. The suggested ExifTool command-line arguments
25409
- for reading C2PA metadata are C<-jumbf:all -G3 -b -j -u -struct>. This
25410
- metadata may be deleted from writable JPEG, PNG, WebP, TIFF-based, and
25411
- QuickTime-based files by deleting the JUMBF group with C<-jumbf:all=>.
25408
+ PDF, SVG and GIF files, and ID3v2 metadata. The suggested ExifTool
25409
+ command-line arguments for reading C2PA metadata are C<-jumbf:all -G3 -b -j
25410
+ -u -struct>. This metadata may be deleted from writable JPEG, PNG, WebP,
25411
+ TIFF-based, and QuickTime-based files by deleting the JUMBF group with
25412
+ C<-jumbf:all=>. The C2PA JUMBF metadata may be extracted as a block via the
25413
+ JUMBF tag. See L<https://c2pa.org/specifications/> for the C2PA
25414
+ specification.
25412
25415
 
25413
25416
  Tag ID Tag Name Writable
25414
25417
  ------ -------- --------
@@ -28532,6 +28535,7 @@ This is the PDF document catalog.
28532
28535
 
28533
28536
  Tag ID Tag Name Writable
28534
28537
  ------ -------- --------
28538
+ 'AF' AF PDF AF
28535
28539
  'AcroForm' AcroForm PDF AcroForm
28536
28540
  'Lang' Language no
28537
28541
  'MarkInfo' MarkInfo PDF MarkInfo
@@ -28542,6 +28546,28 @@ This is the PDF document catalog.
28542
28546
  'Perms' Perms PDF Perms
28543
28547
  'Version' PDFVersion no
28544
28548
 
28549
+ =head3 PDF AF Tags
28550
+
28551
+ Processed only for C2PA information if AFRelationship is "/C2PA_Manifest".
28552
+
28553
+ Tag ID Tag Name Writable
28554
+ ------ -------- --------
28555
+ 'EF' EF PDF EF
28556
+
28557
+ =head3 PDF EF Tags
28558
+
28559
+ Tag ID Tag Name Writable
28560
+ ------ -------- --------
28561
+ 'F' F_ PDF F
28562
+
28563
+ =head3 PDF F Tags
28564
+
28565
+ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
28566
+
28567
+ Tag ID Tag Name Writable
28568
+ ------ -------- --------
28569
+ '_stream' JUMBF Jpeg2000
28570
+
28545
28571
  =head3 PDF AcroForm Tags
28546
28572
 
28547
28573
  Tag ID Tag Name Writable
@@ -39548,6 +39574,7 @@ FileName.
39548
39574
  JPEGDigest File no
39549
39575
  JPEGImageLength File no
39550
39576
  JPEGQualityEstimate File no
39577
+ JUMBF JUMBF no
39551
39578
  MIMEType File no
39552
39579
  MaxVal File no
39553
39580
  NewGUID ExifTool no
@@ -2277,14 +2277,17 @@ NoOverwrite: next if $isNew > 0;
2277
2277
  $$offsetInfo{0x117} and $$offsetInfo{0x145} and
2278
2278
  $$offsetInfo{0x111}[2]==1) # (must be a single strip or the tile offsets could get out of sync)
2279
2279
  {
2280
- # some Sony ARW images contain double-referenced raw data stored as both strips
2281
- # and tiles. Copy the data using only the strip tags, but store the TileOffets
2282
- # information for updating later (see PanasonicRaw:PatchRawDataOffset for a
2283
- # description of offsetInfo elements)
2284
- $$offsetInfo{0x111}[5] = $$offsetInfo{0x144}; # hack to save TileOffsets
2285
- # delete tile information from offsetInfo because we will copy as strips
2286
- delete $$offsetInfo{0x144};
2287
- delete $$offsetInfo{0x145};
2280
+ # check the start offsets to see if they are the same
2281
+ if ($$offsetInfo{0x111}[3][0] == $$offsetInfo{0x144}[3][0]) {
2282
+ # some Sony ARW images contain double-referenced raw data stored as both strips
2283
+ # and tiles. Copy the data using only the strip tags, but store the TileOffets
2284
+ # information for updating later (see PanasonicRaw:PatchRawDataOffset for a
2285
+ # description of offsetInfo elements)
2286
+ $$offsetInfo{0x111}[5] = $$offsetInfo{0x144}; # hack to save TileOffsets
2287
+ # delete tile information from offsetInfo because we will copy as strips
2288
+ delete $$offsetInfo{0x144};
2289
+ delete $$offsetInfo{0x145};
2290
+ }
2288
2291
  } else {
2289
2292
  $et->Error("TIFF $dirName contains both strip and tile data");
2290
2293
  }
@@ -3353,7 +3353,7 @@ sub InsertTagValues($$;$$$$)
3353
3353
  $advFmtSelf = $self;
3354
3354
  if ($asList) {
3355
3355
  foreach (@val) {
3356
- #### eval advanced formatting expression ($_, $self, @val, $advFmtSelf)
3356
+ #### eval advanced formatting expression ($_, $self, @val, $tag, $advFmtSelf)
3357
3357
  eval $expr;
3358
3358
  $@ and $evalWarning = $@;
3359
3359
  }
@@ -3362,7 +3362,7 @@ sub InsertTagValues($$;$$$$)
3362
3362
  $val = @val ? join $$self{OPTIONS}{ListSep}, @val : undef;
3363
3363
  } else {
3364
3364
  $_ = $val;
3365
- #### eval advanced formatting expression ($_, $self, @val, $advFmtSelf)
3365
+ #### eval advanced formatting expression ($_, $self, @val, $tag, $advFmtSelf)
3366
3366
  eval $expr;
3367
3367
  $@ and $evalWarning = $@;
3368
3368
  $val = ref $_ eq 'ARRAY' ? join($$self{OPTIONS}{ListSep}, @$_): $_;
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.62';
53
+ $VERSION = '3.63';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -3644,6 +3644,7 @@ NoLoop:
3644
3644
  IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties)
3645
3645
  IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3646
3646
  NoStruct => 1, # (don't try to build structures since this isn't true XMP)
3647
+ NoBlockSave => 1,# (don't save as a block because we already did this)
3647
3648
  );
3648
3649
  my $oldOrder = GetByteOrder();
3649
3650
  SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
@@ -2191,6 +2191,15 @@ my %sSubVersion = (
2191
2191
  GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
2192
2192
  LANG_INFO => \&GetLangInfo,
2193
2193
  NAMESPACE => undef, # variable namespace
2194
+ 'c2pa:manifest' => {
2195
+ Name => 'JUMBF',
2196
+ Groups => { 0 => 'JUMBF' },
2197
+ RawConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
2198
+ SubDirectory => {
2199
+ TagTable => 'Image::ExifTool::Jpeg2000::Main',
2200
+ ByteOrder => 'BigEndian',
2201
+ },
2202
+ },
2194
2203
  );
2195
2204
 
2196
2205
  #------------------------------------------------------------------------------
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.74';
32
+ $VERSION = '12.76';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -195,9 +195,9 @@ $defaultLang = 'en'; # default language
195
195
  OGG FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF
196
196
  LFP HTML VRD RTF FITS XISF XCF DSS QTIF FPX PICT ZIP GZIP PLIST
197
197
  RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
198
- RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI
199
- R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO
200
- TXT AAC);
198
+ JUMBF RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard
199
+ LRI R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD
200
+ ICO TXT AAC);
201
201
 
202
202
  # file types that we can write (edit)
203
203
  my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
@@ -260,6 +260,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
260
260
  BPG => ['BPG', 'Better Portable Graphics'],
261
261
  BTF => ['BTF', 'Big Tagged Image File Format'], #(unofficial)
262
262
  BZ2 => ['BZ2', 'BZIP2 archive'],
263
+ C2PA => ['JUMBF','Coalition for Content Provenance and Authenticity'],
263
264
  CHM => ['CHM', 'Microsoft Compiled HTML format'],
264
265
  CIFF => ['CRW', 'Camera Image File Format'],
265
266
  COS => ['COS', 'Capture One Settings'],
@@ -374,6 +375,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
374
375
  JPS => ['JPEG', 'JPEG Stereo image'],
375
376
  JPX => ['JP2', 'JPEG 2000 with extensions'],
376
377
  JSON => ['JSON', 'JavaScript Object Notation'],
378
+ JUMBF=> ['JUMBF','JPEG Universal Metadata Box Format'],
377
379
  JXL => ['JXL', 'JPEG XL'],
378
380
  JXR => ['TIFF', 'JPEG XR'],
379
381
  K25 => ['TIFF', 'Kodak DC25 RAW'],
@@ -612,6 +614,7 @@ my %fileDescription = (
612
614
  BPG => 'image/bpg',
613
615
  BTF => 'image/x-tiff-big', #(NC) (ref http://www.asmail.be/msg0055371937.html)
614
616
  BZ2 => 'application/bzip2',
617
+ C2PA => 'application/c2pa',
615
618
  'Canon 1D RAW' => 'image/x-raw', # (uses .TIF file extension)
616
619
  CHM => 'application/x-chm',
617
620
  COS => 'application/octet-stream', #PH (NC)
@@ -686,6 +689,7 @@ my %fileDescription = (
686
689
  JPS => 'image/x-jps',
687
690
  JPX => 'image/jpx',
688
691
  JSON => 'application/json',
692
+ JUMBF=> 'application/octet-stream', #PH (invented format)
689
693
  JXL => 'image/jxl', #PH (NC)
690
694
  JXR => 'image/jxr',
691
695
  K25 => 'image/x-kodak-k25',
@@ -856,6 +860,7 @@ my %moduleName = (
856
860
  HDR => 'Radiance',
857
861
  JP2 => 'Jpeg2000',
858
862
  JPEG => '',
863
+ JUMBF=> 'Jpeg2000',
859
864
  JXL => 'Jpeg2000',
860
865
  LFP => 'Lytro',
861
866
  LRI => 0,
@@ -947,6 +952,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
947
952
  JP2 => '(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)',
948
953
  JPEG => '\xff\xd8\xff',
949
954
  JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
955
+ JUMBF=> '.{4}jumb\0.{3}jumd',
950
956
  JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
951
957
  LFP => '\x89LFP\x0d\x0a\x1a\x0a',
952
958
  LIF => '\x70\0{3}.{4}\x2a.{4}<\0',
@@ -1640,6 +1646,11 @@ my %systemTagsNotes = (
1640
1646
  Groups => { 0 => 'XML', 1 => 'XML' },
1641
1647
  Binary => 1,
1642
1648
  },
1649
+ JUMBF => {
1650
+ Notes => 'the C2PA JUMBF data block, extracted only if specifically requested',
1651
+ Groups => { 0 => 'JUMBF', 1 => 'JUMBF' },
1652
+ Binary => 1,
1653
+ },
1643
1654
  ICC_Profile => {
1644
1655
  Notes => q{
1645
1656
  the full ICC_Profile data block. This tag is generated only if specifically
@@ -7568,6 +7579,7 @@ sub ProcessJPEG($$)
7568
7579
  $dirInfo{DataPt} = \$buff;
7569
7580
  $dirInfo{DataPos} = $segPos + 8; # (shows correct offsets for single-segment JUMBF)
7570
7581
  $dirInfo{DataLen} = $dirInfo{DirLen} = $size;
7582
+ $dirInfo{DirName} = 'JUMBF';
7571
7583
  my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main');
7572
7584
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7573
7585
  delete $jumbfChunk{$type};
@@ -65,49 +65,50 @@ supported by ExifTool (r = read, w = write, c = create):
65
65
 
66
66
  File Types
67
67
  ------------+-------------+-------------+-------------+------------
68
- 360 r/w | DPX r | ITC r | NUMBERS r | RAW r/w
69
- 3FR r | DR4 r/w/c | J2C r | O r | RIFF r
70
- 3G2 r/w | DSS r | JNG r/w | ODP r | RSRC r
71
- 3GP r/w | DV r | JP2 r/w | ODS r | RTF r
72
- 7Z r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
73
- A r | DVR-MS r | JSON r | OFR r | RWL r/w
74
- AA r | DYLIB r | JXL r | OGG r | RWZ r
75
- AAE r | EIP r | K25 r | OGV r | RM r
76
- AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
77
- ACR r | EPUB r | KEY r | OPUS r | SKETCH r
78
- AFM r | ERF r/w | LA r | ORF r/w | SO r
79
- AI r/w | EXE r | LFP r | ORI r/w | SR2 r/w
80
- AIFF r | EXIF r/w/c | LIF r | OTF r | SRF r
81
- APE r | EXR r | LNK r | PAC r | SRW r/w
82
- ARQ r/w | EXV r/w/c | LRV r/w | PAGES r | SVG r
83
- ARW r/w | F4A/V r/w | M2TS r | PBM r/w | SWF r
84
- ASF r | FFF r/w | M4A/V r/w | PCD r | THM r/w
85
- AVI r | FITS r | MACOS r | PCX r | TIFF r/w
86
- AVIF r/w | FLA r | MAX r | PDB r | TORRENT r
87
- AZW r | FLAC r | MEF r/w | PDF r/w | TTC r
88
- BMP r | FLIF r/w | MIE r/w/c | PEF r/w | TTF r
89
- BPG r | FLV r | MIFF r | PFA r | TXT r
90
- BTF r | FPF r | MKA r | PFB r | VCF r
91
- CHM r | FPX r | MKS r | PFM r | VNT r
92
- COS r | GIF r/w | MKV r | PGF r | VRD r/w/c
93
- CR2 r/w | GLV r/w | MNG r/w | PGM r/w | VSD r
94
- CR3 r/w | GPR r/w | MOBI r | PLIST r | WAV r
95
- CRM r/w | GZ r | MODD r | PICT r | WDP r/w
96
- CRW r/w | HDP r/w | MOI r | PMP r | WEBP r/w
97
- CS1 r/w | HDR r | MOS r/w | PNG r/w | WEBM r
98
- CSV r | HEIC r/w | MOV r/w | PPM r/w | WMA r
99
- CUR r | HEIF r/w | MP3 r | PPT r | WMV r
100
- CZI r | HTML r | MP4 r/w | PPTX r | WPG r
101
- DCM r | ICC r/w/c | MPC r | PS r/w | WTV r
102
- DCP r/w | ICO r | MPG r | PSB r/w | WV r
103
- DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
104
- DFONT r | IDML r | MQV r/w | PSP r | XCF r
105
- DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
106
- DJVU r | IND r/w | MRW r/w | R3D r | XLS r
107
- DLL r | INSP r/w | MXF r | RA r | XLSX r
108
- DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
109
- DOC r | INX r | NKSC r/w | RAM r | ZIP r
110
- DOCX r | ISO r | NRW r/w | RAR r |
68
+ 360 r/w | DOCX r | ITC r | O r | RSRC r
69
+ 3FR r | DPX r | J2C r | ODP r | RTF r
70
+ 3G2 r/w | DR4 r/w/c | JNG r/w | ODS r | RW2 r/w
71
+ 3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
72
+ 7Z r | DV r | JPEG r/w | OFR r | RWZ r
73
+ A r | DVB r/w | JSON r | OGG r | RM r
74
+ AA r | DVR-MS r | JXL r | OGV r | SEQ r
75
+ AAC r | DYLIB r | K25 r | ONP r | SKETCH r
76
+ AAE r | EIP r | KDC r | OPUS r | SO r
77
+ AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
78
+ ACR r | EPUB r | LA r | ORI r/w | SRF r
79
+ AFM r | ERF r/w | LFP r | OTF r | SRW r/w
80
+ AI r/w | EXE r | LIF r | PAC r | SVG r
81
+ AIFF r | EXIF r/w/c | LNK r | PAGES r | SWF r
82
+ APE r | EXR r | LRV r/w | PBM r/w | THM r/w
83
+ ARQ r/w | EXV r/w/c | M2TS r | PCD r | TIFF r/w
84
+ ARW r/w | F4A/V r/w | M4A/V r/w | PCX r | TORRENT r
85
+ ASF r | FFF r/w | MACOS r | PDB r | TTC r
86
+ AVI r | FITS r | MAX r | PDF r/w | TTF r
87
+ AVIF r/w | FLA r | MEF r/w | PEF r/w | TXT r
88
+ AZW r | FLAC r | MIE r/w/c | PFA r | VCF r
89
+ BMP r | FLIF r/w | MIFF r | PFB r | VNT r
90
+ BPG r | FLV r | MKA r | PFM r | VRD r/w/c
91
+ BTF r | FPF r | MKS r | PGF r | VSD r
92
+ C2PA r | FPX r | MKV r | PGM r/w | WAV r
93
+ CHM r | GIF r/w | MNG r/w | PLIST r | WDP r/w
94
+ COS r | GLV r/w | MOBI r | PICT r | WEBP r/w
95
+ CR2 r/w | GPR r/w | MODD r | PMP r | WEBM r
96
+ CR3 r/w | GZ r | MOI r | PNG r/w | WMA r
97
+ CRM r/w | HDP r/w | MOS r/w | PPM r/w | WMV r
98
+ CRW r/w | HDR r | MOV r/w | PPT r | WPG r
99
+ CS1 r/w | HEIC r/w | MP3 r | PPTX r | WTV r
100
+ CSV r | HEIF r/w | MP4 r/w | PS r/w | WV r
101
+ CUR r | HTML r | MPC r | PSB r/w | X3F r/w
102
+ CZI r | ICC r/w/c | MPG r | PSD r/w | XCF r
103
+ DCM r | ICO r | MPO r/w | PSP r | XISF r
104
+ DCP r/w | ICS r | MQV r/w | QTIF r/w | XLS r
105
+ DCR r | IDML r | MRC r | R3D r | XLSX r
106
+ DFONT r | IIQ r/w | MRW r/w | RA r | XMP r/w/c
107
+ DIVX r | IND r/w | MXF r | RAF r/w | ZIP r
108
+ DJVU r | INSP r/w | NEF r/w | RAM r |
109
+ DLL r | INSV r | NKSC r/w | RAR r |
110
+ DNG r/w | INX r | NRW r/w | RAW r/w |
111
+ DOC r | ISO r | NUMBERS r | RIFF r |
111
112
 
112
113
  Meta Information
113
114
  ----------------------+----------------------+---------------------
@@ -1801,8 +1802,9 @@ or a trailing '#' causes the ValueConv value to be copied (same as setting
1801
1802
  the Type option to 'ValueConv' for this tag only). A leading '+' sets the
1802
1803
  Replace option to 0 on a per-tag basis (see Options below). Wildcards ('*'
1803
1804
  and '?') may be used in the tag name. A tag name of '*' is commonly used
1804
- when a group is specified to copy all tags in the group (eg. 'XMP:*'). A
1805
- special feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
1805
+ when a group is specified to copy all tags in the group (eg. 'XMP:*').
1806
+
1807
+ A special feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
1806
1808
  'SRCTAGE<gt>DSTTAG') to be specified to copy information to a tag with a
1807
1809
  different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may contain
1808
1810
  wildcards and/or be prefixed by a group name (eg.
@@ -1812,18 +1814,20 @@ a list with arguments of the form 'DSTTAG+E<lt>SRCTAG' or
1812
1814
  'DSTTAG-E<lt>SRCTAG'. Tags are evaluated in order, so exclusions apply only
1813
1815
  to tags included earlier in the list. An extension of this feature allows
1814
1816
  the tag value to be set from a string containing tag names with leading '$'
1815
- symbols (eg. 'CommentE<lt>the file is $filename'). Braces '{}' may be used
1816
- around the tag name to separate it from subsequent text, and a '$$' is used
1817
- to to represent a '$' symbol. The behaviour for missing tags in expressions
1818
- is defined by the L</MissingTagValue> option. The tag value may be modified
1817
+ symbols (eg. 'CommentE<lt>the file is $filename'). Braces '{}' may be used
1818
+ around a tag name to separate it from subsequent text, and a '$$' is used to
1819
+ to represent a '$' symbol. The behaviour for missing tags in expressions is
1820
+ defined by the L</MissingTagValue> option. The tag value may be modified
1819
1821
  via changes to the default input variable ($_) in a Perl expression placed
1820
1822
  inside the braces and after a semicolon following the tag name (see the last
1821
1823
  example above). A '@' may be added after the tag name (before the
1822
1824
  semicolon) to make the expression act on individual list items instead of
1823
- the concatenated string for list-type tags. Braces within the expression
1824
- must be balanced. Multiple options hash references may be passed to set
1825
- different options for different tags. Options apply to subsequent tags in
1826
- the argument list.
1825
+ the concatenated string for list-type tags. The expression has access to
1826
+ the full ExifTool API through the current ExifTool object (C<$self>) and the
1827
+ tag key (C<$tag>). Braces within the expression must be balanced.
1828
+
1829
+ Multiple options hash references may be passed to set different options for
1830
+ different tags. Options apply to subsequent tags in the argument list.
1827
1831
 
1828
1832
  By default, this routine will commute information between same-named tags in
1829
1833
  different groups, allowing information to be translated between images with
@@ -2435,16 +2439,16 @@ Here is a complete list of groups for each of these families:
2435
2439
  =item Family 0 (Information Type):
2436
2440
 
2437
2441
  AAC, AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15, APP2,
2438
- APP3, APP4, APP5, APP6, APP8, ASF, Audible, CanonVRD, Composite, DICOM, DNG,
2439
- DV, DjVu, Ducky, EXE, EXIF, ExifTool, FITS, FLAC, FLIR, File, Flash,
2440
- FlashPix, Font, FotoStation, GIF, GIMP, GeoTiff, GoPro, H264, HTML,
2441
- ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, JSON, JUMBF, Jpeg2000, LNK,
2442
- Leaf, Lytro, M2TS, MIE, MIFF, MISB, MNG, MOI, MPC, MPEG, MPF, MXF,
2443
- MakerNotes, Matroska, Meta, Ogg, OpenEXR, Opus, PDF, PICT, PLIST, PNG, PSP,
2444
- Palm, Parrot, PanasonicRaw, PhotoCD, PhotoMechanic, Photoshop, PostScript,
2445
- PrintIM, QuickTime, RAF, RIFF, RSRC, RTF, Radiance, Rawzor, Real, Red, SVG,
2446
- SigmaRaw, Stim, Theora, Torrent, Trailer, UserParam, VCard, Vorbis, WTV,
2447
- XML, XMP, ZIP
2442
+ APP3, APP4, APP5, APP6, APP7, APP8, APP9, ASF, Audible, Canon, CanonVRD,
2443
+ Composite, DICOM, DNG, DV, DjVu, Ducky, EXE, EXIF, ExifTool, FITS, FLAC,
2444
+ FLIR, File, Flash, FlashPix, Font, FotoStation, GIF, GIMP, GeoTiff, GoPro,
2445
+ H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, JSON, JUMBF,
2446
+ Jpeg2000, LNK, Leaf, Lytro, M2TS, MIE, MIFF, MISB, MNG, MOI, MPC, MPEG, MPF,
2447
+ MXF, MakerNotes, Matroska, Meta, Ogg, OpenEXR, Opus, PDF, PICT, PLIST, PNG,
2448
+ PSP, Palm, PanasonicRaw, Parrot, PhotoCD, PhotoMechanic, Photoshop,
2449
+ PostScript, PrintIM, QuickTime, RAF, RIFF, RSRC, RTF, Radiance, Rawzor,
2450
+ Real, Red, SVG, SigmaRaw, Sony, Stim, Theora, Torrent, Trailer, VCard,
2451
+ Vorbis, WTV, XML, XMP, ZIP
2448
2452
 
2449
2453
  =item Family 1 (Specific Location):
2450
2454
 
@@ -2486,8 +2490,8 @@ XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
2486
2490
  XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf,
2487
2491
  XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism,
2488
2492
  XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, XMP-x,
2489
- XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS,
2490
- XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
2493
+ XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
2494
+ XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
2491
2495
 
2492
2496
  =item Family 2 (Category):
2493
2497