exiftool_vendored 11.99.0 → 12.06.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +119 -2
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +32 -32
  7. data/bin/exiftool +55 -50
  8. data/bin/lib/Image/ExifTool.pm +155 -109
  9. data/bin/lib/Image/ExifTool.pod +103 -77
  10. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  11. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -6
  13. data/bin/lib/Image/ExifTool/Canon.pm +2 -1
  14. data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
  15. data/bin/lib/Image/ExifTool/DPX.pm +56 -2
  16. data/bin/lib/Image/ExifTool/DarwinCore.pm +16 -3
  17. data/bin/lib/Image/ExifTool/Exif.pm +15 -6
  18. data/bin/lib/Image/ExifTool/Font.pm +9 -2
  19. data/bin/lib/Image/ExifTool/GIF.pm +5 -0
  20. data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
  21. data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
  22. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  23. data/bin/lib/Image/ExifTool/ID3.pm +86 -12
  24. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  25. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  26. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  27. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  28. data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
  29. data/bin/lib/Image/ExifTool/Nikon.pm +134 -15
  30. data/bin/lib/Image/ExifTool/Olympus.pm +34 -17
  31. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  32. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  33. data/bin/lib/Image/ExifTool/Panasonic.pm +147 -13
  34. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
  35. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  36. data/bin/lib/Image/ExifTool/Pentax.pm +2 -1
  37. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  38. data/bin/lib/Image/ExifTool/QuickTime.pm +204 -27
  39. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +355 -19
  40. data/bin/lib/Image/ExifTool/README +20 -19
  41. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  42. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  43. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  44. data/bin/lib/Image/ExifTool/Sony.pm +376 -11
  45. data/bin/lib/Image/ExifTool/TagLookup.pm +1949 -1872
  46. data/bin/lib/Image/ExifTool/TagNames.pod +329 -53
  47. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  48. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
  49. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +23 -15
  50. data/bin/lib/Image/ExifTool/Writer.pl +44 -21
  51. data/bin/lib/Image/ExifTool/XMP.pm +41 -4
  52. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  53. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  54. data/bin/perl-Image-ExifTool.spec +31 -31
  55. data/lib/exiftool_vendored/version.rb +1 -1
  56. metadata +4 -3
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
28
28
  %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
30
30
 
31
- $VERSION = '11.99';
31
+ $VERSION = '12.06';
32
32
  $RELEASE = '';
33
33
  @ISA = qw(Exporter);
34
34
  %EXPORT_TAGS = (
@@ -91,7 +91,7 @@ sub GetExtended($$);
91
91
  sub Set64u(@);
92
92
  sub DecodeBits($$;$);
93
93
  sub EncodeBits($$;$$);
94
- sub Filter($$@);
94
+ sub Filter($$$);
95
95
  sub HexDump($;$%);
96
96
  sub DumpTrailer($$);
97
97
  sub DumpUnknownTrailer($$);
@@ -137,17 +137,18 @@ sub ReadValue($$$;$$$);
137
137
  @loadAllTables = qw(
138
138
  PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw
139
139
  SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions
140
- PICT PNG MNG FLIF DjVu DPX OpenEXR MIFF PCX PGF PSP PhotoCD Radiance PDF
141
- PostScript Photoshop::Header Photoshop::Layers Photoshop::ImageData
140
+ PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MIFF PCX PGF PSP PhotoCD Radiance
141
+ PDF PostScript Photoshop::Header Photoshop::Layers Photoshop::ImageData
142
142
  FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD
143
- Sony::PMP ITC ID3 FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible
144
- MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile
145
- QuickTime::Stream Matroska MOI MXF DV Flash Flash::FLV Real::Media
146
- Real::Audio Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS MIE JSON HTML
147
- XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString
148
- EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard Text
149
- VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO
150
- FLIR::AFF FLIR::FPF MacOS::MDItem MacOS::XAttr FlashPix::DocTable
143
+ Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE APE::NewHeader
144
+ APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime
145
+ QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly Matroska MOI
146
+ MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile Red RIFF AIFF
147
+ ASF WTV DICOM FITS MIE JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent
148
+ EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::AR
149
+ EXE::CHM LNK Font VCard Text VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP
150
+ ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS::MDItem MacOS::XAttr
151
+ FlashPix::DocTable
151
152
  );
152
153
 
153
154
  # alphabetical list of current Lang modules
@@ -186,9 +187,9 @@ $defaultLang = 'en'; # default language
186
187
  PSD XMP BMP BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG
187
188
  FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP
188
189
  HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
189
- TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS PHP
190
- PCX DCX DWF DWG WTV Torrent VCard LRI R3D AA PDB MOI ISO ALIAS
191
- JSON MP3 DICOM PCD TXT);
190
+ CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
191
+ PHP PCX DCX DWF DWG WTV Torrent VCard LRI R3D AA PDB MOI ISO
192
+ ALIAS JSON MP3 DICOM PCD TXT);
192
193
 
193
194
  # file types that we can write (edit)
194
195
  my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
@@ -253,6 +254,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
253
254
  CRW => ['CRW', 'Canon RAW format'],
254
255
  CS1 => ['PSD', 'Sinar CaptureShop 1-Shot RAW'],
255
256
  CSV => ['TXT', 'Comma-Separated Values'],
257
+ CZI => ['CZI', 'Zeiss Integrated Software RAW'],
256
258
  DC3 => 'DICM',
257
259
  DCM => 'DICM',
258
260
  DCP => ['TIFF', 'DNG Camera Profile'],
@@ -527,6 +529,8 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
527
529
  XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'],
528
530
  XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'],
529
531
  XMP => ['XMP', 'Extensible Metadata Platform'],
532
+ WOFF => ['Font', 'Web Open Font Format'],
533
+ WOFF2=> ['Font', 'Web Open Font Format2'],
530
534
  WTV => ['WTV', 'Windows recorded TV show'],
531
535
  ZIP => ['ZIP', 'ZIP archive'],
532
536
  );
@@ -581,6 +585,7 @@ my %fileDescription = (
581
585
  CRM => 'video/x-canon-crm',
582
586
  CRW => 'image/x-canon-crw',
583
587
  CSV => 'text/csv',
588
+ CZI => 'image/x-zeiss-czi', #PH (NC)
584
589
  DCP => 'application/octet-stream', #PH (NC)
585
590
  DCR => 'image/x-kodak-dcr',
586
591
  DCX => 'image/dcx',
@@ -781,6 +786,7 @@ my %moduleName = (
781
786
  CRW => 'CanonRaw',
782
787
  CHM => 'EXE',
783
788
  COS => 'CaptureOne',
789
+ CZI => 'ZISRAW',
784
790
  DEX => 0,
785
791
  DOCX => 'OOXML',
786
792
  DCX => 0,
@@ -851,6 +857,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
851
857
  BZ2 => 'BZh[1-9]\x31\x41\x59\x26\x53\x59',
852
858
  CHM => 'ITSF.{20}\x10\xfd\x01\x7c\xaa\x7b\xd0\x11\x9e\x0c\0\xa0\xc9\x22\xe6\xec',
853
859
  CRW => '(II|MM).{4}HEAP(CCDR|JPGM)',
860
+ CZI => 'ZISRAWFILE\0{6}',
854
861
  DCX => '\xb1\x68\xde\x3a',
855
862
  DEX => "dex\n035\0",
856
863
  DICOM=> '(.{128}DICM|\0[\x02\x04\x06\x08]\0[\0-\x20]|[\x02\x04\x06\x08]\0[\0-\x20]\0)',
@@ -872,7 +879,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
872
879
  FLIR => '[AF]FF\0',
873
880
  FLV => 'FLV\x01',
874
881
  Font => '((\0\x01\0\0|OTTO|true|typ1)[\0\x01]|ttcf\0[\x01\x02]\0\0|\0[\x01\x02]|' .
875
- '(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)|Start(Comp|Master)?FontMetrics)',
882
+ '(.{6})?%!(PS-(AdobeFont-|Bitstream )|FontType1-)|Start(Comp|Master)?FontMetrics|wOF[F2])',
876
883
  FPF => 'FPF Public Image Format\0',
877
884
  FPX => '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1',
878
885
  GIF => 'GIF8[79]a',
@@ -1445,6 +1452,11 @@ my %systemTagsNotes = (
1445
1452
  return Image::ExifTool::XMP::CheckXMP($self, $tagInfo, \$val);
1446
1453
  },
1447
1454
  },
1455
+ XML => {
1456
+ Notes => 'the XML data block, extracted for some file types',
1457
+ Groups => { 0 => 'XML', 1 => 'XML' },
1458
+ Binary => 1,
1459
+ },
1448
1460
  ICC_Profile => {
1449
1461
  Notes => q{
1450
1462
  the full ICC_Profile data block. This tag is generated only if specifically
@@ -2236,6 +2248,7 @@ sub ClearOptions($)
2236
2248
  GeoSpeedRef => undef, # geotag GPSSpeedRef
2237
2249
  GlobalTimeShift => undef, # apply time shift to all extracted date/time values
2238
2250
  # Group# => undef, # return tags for specified groups in family #
2251
+ HexTagIDs => 0, # use hex tag ID's in family 7 group names
2239
2252
  HtmlDump => 0, # HTML dump (0-3, higher # = bigger limit)
2240
2253
  HtmlDumpBase => undef, # base address for HTML dump
2241
2254
  IgnoreMinorErrors => undef, # ignore minor errors when reading/writing
@@ -2249,6 +2262,7 @@ sub ClearOptions($)
2249
2262
  MakerNotes => undef, # extract maker notes as a block
2250
2263
  MDItemTags => undef, # extract MacOS metadata item tags
2251
2264
  MissingTagValue =>undef,# value for missing tags when expanded in expressions
2265
+ NoMultiExif => undef, # raise error when writing multi-segment EXIF
2252
2266
  NoPDFList => undef, # flag to avoid splitting PDF List-type tag values
2253
2267
  Password => undef, # password for password-protected PDF documents
2254
2268
  PrintConv => 1, # flag to enable print conversion
@@ -3095,30 +3109,9 @@ sub GetValue($$;$)
3095
3109
  }
3096
3110
  if (ref $conv eq 'HASH') {
3097
3111
  # look up converted value in hash
3098
- my $lc;
3099
- if (defined($value = $$conv{$val})) {
3100
- # override with our localized language PrintConv if available
3101
- if ($$self{CUR_LANG} and $convType eq 'PrintConv' and
3102
- # (no need to check for lang-alt tag names -- they won't have a PrintConv)
3103
- ref($lc = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
3104
- ($lc = $$lc{PrintConv}) and ($lc = $$lc{$value}))
3105
- {
3106
- $value = $self->Decode($lc, 'UTF8');
3107
- }
3108
- } else {
3112
+ if (not defined($value = $$conv{$val})) {
3109
3113
  if ($$conv{BITMASK}) {
3110
3114
  $value = DecodeBits($val, $$conv{BITMASK}, $$tagInfo{BitsPerWord});
3111
- # override with localized language strings
3112
- if (defined $value and $$self{CUR_LANG} and $convType eq 'PrintConv' and
3113
- ref($lc = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
3114
- ($lc = $$lc{PrintConv}))
3115
- {
3116
- my @vals = split ', ', $value;
3117
- foreach (@vals) {
3118
- $_ = $$lc{$_} if defined $$lc{$_};
3119
- }
3120
- $value = join ', ', @vals;
3121
- }
3122
3115
  } else {
3123
3116
  # use alternate conversion routine if available
3124
3117
  if ($$conv{OTHER}) {
@@ -3131,12 +3124,30 @@ sub GetValue($$;$)
3131
3124
  if ($$tagInfo{PrintHex} and $val and IsInt($val) and
3132
3125
  $convType eq 'PrintConv')
3133
3126
  {
3134
- $val = sprintf('0x%x',$val);
3127
+ $value = sprintf('Unknown (0x%x)',$val);
3128
+ } else {
3129
+ $value = "Unknown ($val)";
3135
3130
  }
3136
- $value = "Unknown ($val)";
3137
3131
  }
3138
3132
  }
3139
3133
  }
3134
+ # override with our localized language PrintConv if available
3135
+ my $tmp;
3136
+ if ($$self{CUR_LANG} and $convType eq 'PrintConv' and
3137
+ # (no need to check for lang-alt tag names -- they won't have a PrintConv)
3138
+ ref($tmp = $$self{CUR_LANG}{$$tagInfo{Name}}) eq 'HASH' and
3139
+ ($tmp = $$tmp{PrintConv}))
3140
+ {
3141
+ if ($$conv{BITMASK} and not defined $$conv{$val}) {
3142
+ my @vals = split ', ', $value;
3143
+ foreach (@vals) {
3144
+ $_ = $$tmp{$_} if defined $$tmp{$_};
3145
+ }
3146
+ $value = join ', ', @vals;
3147
+ } elsif (defined($tmp = $$tmp{$value})) {
3148
+ $value = $self->Decode($tmp, 'UTF8');
3149
+ }
3150
+ }
3140
3151
  } else {
3141
3152
  # call subroutine or do eval to convert value
3142
3153
  local $SIG{'__WARN__'} = \&SetWarning;
@@ -3294,7 +3305,7 @@ sub GetGroup($$;$)
3294
3305
  {
3295
3306
  local $_;
3296
3307
  my ($self, $tag, $family) = @_;
3297
- my ($tagInfo, @groups, @families, $simplify, $byTagInfo, $ex);
3308
+ my ($tagInfo, @groups, @families, $simplify, $byTagInfo, $ex, $noID);
3298
3309
  if (ref $tag eq 'HASH') {
3299
3310
  $tagInfo = $tag;
3300
3311
  $tag = $$tagInfo{Name};
@@ -3325,6 +3336,7 @@ sub GetGroup($$;$)
3325
3336
  $simplify = 1 unless $family =~ /^:/;
3326
3337
  undef $family;
3327
3338
  foreach (0..2) { $groups[$_] = $$groups{$_}; }
3339
+ $noID = 1 if @families == 1 and $families[0] != 7;
3328
3340
  } else {
3329
3341
  return(($ex && $$ex{"G$family"}) || $$groups{$family}) if $family == 0 or $family == 2;
3330
3342
  $groups[1] = $$groups{1};
@@ -3336,14 +3348,29 @@ sub GetGroup($$;$)
3336
3348
  $groups[3] = 'Main';
3337
3349
  $groups[4] = ($tag =~ /\((\d+)\)$/) ? "Copy$1" : '';
3338
3350
  # handle dynamic group names if necessary
3339
- if ($ex and not $byTagInfo) {
3340
- $groups[0] = $$ex{G0} if $$ex{G0};
3341
- $groups[1] = $$ex{G1} =~ /^\+(.*)/ ? "$groups[1]$1" : $$ex{G1} if $$ex{G1};
3342
- $groups[3] = 'Doc' . $$ex{G3} if $$ex{G3};
3343
- $groups[5] = $$ex{G5} || $groups[1] if defined $$ex{G5};
3344
- if (defined $$ex{G6}) {
3345
- $groups[5] = '' unless defined $groups[5]; # (can't leave a hole in the array)
3346
- $groups[6] = $$ex{G6};
3351
+ unless ($byTagInfo) {
3352
+ if ($ex) {
3353
+ $groups[0] = $$ex{G0} if $$ex{G0};
3354
+ $groups[1] = $$ex{G1} =~ /^\+(.*)/ ? "$groups[1]$1" : $$ex{G1} if $$ex{G1};
3355
+ $groups[3] = 'Doc' . $$ex{G3} if $$ex{G3};
3356
+ $groups[5] = $$ex{G5} || $groups[1] if defined $$ex{G5};
3357
+ if (defined $$ex{G6}) {
3358
+ $groups[5] = '' unless defined $groups[5]; # (can't leave a hole in the array)
3359
+ $groups[6] = $$ex{G6};
3360
+ }
3361
+ }
3362
+ # generate tag ID group names unless obviously not needed
3363
+ unless ($noID) {
3364
+ my $id = $$tagInfo{TagID};
3365
+ if (not defined $id) {
3366
+ $id = ''; # (just to be safe)
3367
+ } elsif ($id =~ /^\d+$/) {
3368
+ $id = sprintf('0x%x', $id) if $$self{OPTIONS}{HexTagIDs};
3369
+ } else {
3370
+ $id =~ s/([^-_A-Za-z0-9])/sprintf('%.2x',ord $1)/ge;
3371
+ }
3372
+ $groups[7] = 'ID-' . $id;
3373
+ defined $groups[$_] or $groups[$_] = '' foreach (5,6);
3347
3374
  }
3348
3375
  }
3349
3376
  if ($family) {
@@ -4191,6 +4218,22 @@ sub ParseArguments($;@)
4191
4218
  }
4192
4219
  }
4193
4220
 
4221
+ #------------------------------------------------------------------------------
4222
+ # Does group name match the tag ID?
4223
+ # Inputs: 0) tag ID, 1) group name (with "ID-" removed)
4224
+ # Returns: true on success
4225
+ sub IsSameID($$)
4226
+ {
4227
+ my ($id, $grp) = @_;
4228
+ return 1 if $grp eq $id; # decimal ID's or raw ID's
4229
+ if ($id =~ /^\d+$/) { # numerical numerical ID's may be in hex
4230
+ return 1 if $grp =~ s/^0x0*// and $grp eq sprintf('%x', $id);
4231
+ } else { # other ID's may conform to ExifTool group name conventions
4232
+ return 1 if $id =~ s/([^-_A-Za-z0-9])/sprintf('%.2x',ord $1)/ge and $grp eq $id;
4233
+ }
4234
+ return 0;
4235
+ }
4236
+
4194
4237
  #------------------------------------------------------------------------------
4195
4238
  # Get list of tags in specified group
4196
4239
  # Inputs: 0) ExifTool ref, 1) group spec, 2) tag key or reference to list of tag keys
@@ -4202,40 +4245,41 @@ sub GroupMatches($$$)
4202
4245
  my ($self, $group, $tagList) = @_;
4203
4246
  $tagList = [ $tagList ] unless ref $tagList;
4204
4247
  my ($tag, @matches);
4205
- if ($group =~ /:/) {
4206
- # check each group name individually (eg. "Author:1IPTC")
4207
- my @grps = split ':', lc $group;
4208
- my (@fmys, $g);
4248
+ # check each group name individually (eg. "Author:1IPTC")
4249
+ my @grps = split ':', $group;
4250
+ my (@fmys, $g);
4251
+ for ($g=0; $g<@grps; ++$g) {
4252
+ if ($grps[$g] =~ s/^(\d*)(id-)?//i) {
4253
+ $fmys[$g] = $1 if length $1;
4254
+ if ($2) {
4255
+ $fmys[$g] = 7;
4256
+ next; # (don't convert tag ID's to lower case)
4257
+ }
4258
+ }
4259
+ $grps[$g] = lc $grps[$g];
4260
+ $grps[$g] = '' if $grps[$g] eq 'copy0'; # accept 'Copy0' for primary tag
4261
+ }
4262
+ foreach $tag (@$tagList) {
4263
+ my @groups = $self->GetGroup($tag, -1);
4209
4264
  for ($g=0; $g<@grps; ++$g) {
4210
- $fmys[$g] = $1 if $grps[$g] =~ s/^(\d+)//;
4211
- $grps[$g] = '' if $grps[$g] eq 'copy0'; # accept 'Copy0' for primary tag
4212
- }
4213
- foreach $tag (@$tagList) {
4214
- my @groups = $self->GetGroup($tag, -1);
4215
- for ($g=0; $g<@grps; ++$g) {
4216
- my $grp = $grps[$g];
4217
- next if $grp eq '*' or $grp eq 'all';
4218
- if (defined $fmys[$g]) {
4219
- my $f = $fmys[$g];
4220
- last unless defined $groups[$f] and $grp eq lc $groups[$f];
4265
+ my $grp = $grps[$g];
4266
+ next if $grp eq '*' or $grp eq 'all';
4267
+ my $f;
4268
+ if (defined($f = $fmys[$g])) {
4269
+ last unless defined $groups[$f];
4270
+ if ($f == 7) {
4271
+ next if IsSameID($self->GetTagID($tag), $grp);
4221
4272
  } else {
4222
- last unless grep /^$grp$/i, @groups;
4273
+ next if $grp eq lc $groups[$f];
4223
4274
  }
4224
- }
4225
- if ($g == @grps) {
4226
- return $tag unless wantarray;
4227
- push @matches, $tag;
4275
+ last;
4276
+ } else {
4277
+ last unless grep /^$grp$/i, @groups;
4228
4278
  }
4229
4279
  }
4230
- } else {
4231
- my $family = ($group =~ s/^(\d+)//) ? $1 : -1;
4232
- $group = '' if lc $group eq 'copy0'; # accept 'Copy0' for primary tag
4233
- foreach $tag (@$tagList) {
4234
- my @groups = $self->GetGroup($tag, $family);
4235
- if (grep(/^$group$/i, @groups)) {
4236
- return $tag unless wantarray;
4237
- push @matches, $tag;
4238
- }
4280
+ if ($g == @grps) {
4281
+ return $tag unless wantarray;
4282
+ push @matches, $tag;
4239
4283
  }
4240
4284
  }
4241
4285
  return wantarray ? @matches : $matches[0];
@@ -4694,13 +4738,13 @@ sub AddCompositeTags($;$)
4694
4738
  my ($module, $prefix, $tagID);
4695
4739
  unless (ref $add) {
4696
4740
  ($prefix = $add) =~ s/.*:://;
4697
- $prefix .= '::';
4698
4741
  $module = $add;
4699
4742
  $add .= '::Composite';
4700
4743
  no strict 'refs';
4701
4744
  $add = \%$add;
4745
+ $prefix .= '-';
4702
4746
  } else {
4703
- $prefix = 'UserDefined::';
4747
+ $prefix = 'UserDefined-';
4704
4748
  }
4705
4749
  my $defaultGroups = $$add{GROUPS};
4706
4750
  my $compTable = GetTagTable('Image::ExifTool::Composite');
@@ -5415,36 +5459,38 @@ sub GetDescriptions($$)
5415
5459
 
5416
5460
  #------------------------------------------------------------------------------
5417
5461
  # Apply filter to value(s) if necessary
5418
- # Inputs: 0) ExifTool ref, 1) filter expression, 2-N) references to value(s) to filter
5419
- # Returns: nothing, but changes values if necessary
5420
- sub Filter($$@)
5462
+ # Inputs: 0) ExifTool ref, 1) filter expression, 2) reference to value to filter
5463
+ # Returns: true unless a filter returned undef; changes value if necessary
5464
+ sub Filter($$$)
5421
5465
  {
5422
5466
  local $_;
5423
- my $self = shift;
5424
- my $filter = shift;
5425
- return unless defined $filter;
5426
- while (@_) {
5427
- my $valPt = shift;
5428
- next unless defined $$valPt;
5429
- if (not ref $$valPt) {
5430
- $_ = $$valPt;
5431
- #### eval Filter ($_, $self)
5432
- eval $filter;
5433
- $$valPt = $_ if defined $_;
5434
- } elsif (ref $$valPt eq 'SCALAR') {
5435
- my $val = $$$valPt; # make a copy to avoid filtering twice
5436
- $self->Filter($filter, \$val);
5437
- $$valPt = \$val;
5438
- } elsif (ref $$valPt eq 'ARRAY') {
5439
- my @val = @{$$valPt}; # make a copy to avoid filtering twice
5440
- $self->Filter($filter, \$_) foreach @val;
5441
- $$valPt = \@val;
5442
- } elsif (ref $$valPt eq 'HASH') {
5443
- my %val = %{$$valPt}; # make a copy to avoid filtering twice
5444
- $self->Filter($filter, \$val{$_}) foreach keys %val;
5445
- $$valPt = \%val;
5446
- }
5467
+ my ($self, $filter, $valPt) = @_;
5468
+ return 1 unless defined $filter and defined $$valPt;
5469
+ my $rtnVal;
5470
+ if (not ref $$valPt) {
5471
+ $_ = $$valPt;
5472
+ #### eval Filter ($_, $self)
5473
+ eval $filter;
5474
+ if (defined $_) {
5475
+ $$valPt = $_;
5476
+ $rtnVal = 1;
5477
+ }
5478
+ } elsif (ref $$valPt eq 'SCALAR') {
5479
+ my $val = $$$valPt; # make a copy to avoid filtering twice
5480
+ $rtnVal = $self->Filter($filter, \$val);
5481
+ $$valPt = \$val;
5482
+ } elsif (ref $$valPt eq 'ARRAY') {
5483
+ my @val = @{$$valPt}; # make a copy to avoid filtering twice
5484
+ $self->Filter($filter, \$_) and $rtnVal = 1 foreach @val;
5485
+ $$valPt = \@val;
5486
+ } elsif (ref $$valPt eq 'HASH') {
5487
+ my %val = %{$$valPt}; # make a copy to avoid filtering twice
5488
+ $self->Filter($filter, \$val{$_}) and $rtnVal = 1 foreach keys %val;
5489
+ $$valPt = \%val;
5490
+ } else {
5491
+ $rtnVal = 1;
5447
5492
  }
5493
+ return $rtnVal;
5448
5494
  }
5449
5495
 
5450
5496
  #------------------------------------------------------------------------------
@@ -7555,7 +7601,7 @@ sub ProcessDirectory($$$;$)
7555
7601
 
7556
7602
  #------------------------------------------------------------------------------
7557
7603
  # Get Metadata path
7558
- # Inputs: 0) Exiftool object ref
7604
+ # Inputs: 0) ExifTool object ref
7559
7605
  # Return: Metadata path string
7560
7606
  sub MetadataPath($)
7561
7607
  {
@@ -8197,7 +8243,7 @@ sub VerboseDir($$;$$)
8197
8243
  }
8198
8244
  my $indent = substr($$self{INDENT}, 0, -2);
8199
8245
  my $out = $$self{OPTIONS}{TextOut};
8200
- my $str = $entries ? " with $entries entries" : '';
8246
+ my $str = ($entries or defined $entries and not $size) ? " with $entries entries" : '';
8201
8247
  $str .= ", $size bytes" if $size;
8202
8248
  print $out "$indent+ [$name directory$str]\n";
8203
8249
  }
@@ -65,35 +65,36 @@ supported by ExifTool (r = read, w = write, c = create):
65
65
 
66
66
  File Types
67
67
  ------------+-------------+-------------+-------------+------------
68
- 3FR r | DR4 r/w/c | ITC r | ODP r | RIFF r
69
- 3G2 r/w | DSS r | J2C r | ODS r | RSRC r
70
- 3GP r/w | DV r | JNG r/w | ODT r | RTF r
71
- A r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
72
- AA r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
73
- AAE r | DYLIB r | JSON r | OGV r | RWZ r
74
- AAX r/w | EIP r | K25 r | OPUS r | RM r
75
- ACR r | EPS r/w | KDC r | ORF r/w | SEQ r
76
- AFM r | EPUB r | KEY r | OTF r | SKETCH r
77
- AI r/w | ERF r/w | LA r | PAC r | SO r
78
- AIFF r | EXE r | LFP r | PAGES r | SR2 r/w
79
- APE r | EXIF r/w/c | LNK r | PBM r/w | SRF r
80
- ARQ r/w | EXR r | LRV r/w | PCD r | SRW r/w
81
- ARW r/w | EXV r/w/c | M2TS r | PCX r | SVG r
82
- ASF r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
83
- AVI r | FFF r/w | MAX r | PDF r/w | THM r/w
84
- AVIF r/w | FITS r | MEF r/w | PEF r/w | TIFF r/w
85
- AZW r | FLA r | MIE r/w/c | PFA r | TORRENT r
86
- BMP r | FLAC r | MIFF r | PFB r | TTC r
87
- BPG r | FLIF r/w | MKA r | PFM r | TTF r
88
- BTF r | FLV r | MKS r | PGF r | TXT r
89
- CHM r | FPF r | MKV r | PGM r/w | VCF r
90
- COS r | FPX r | MNG r/w | PLIST r | VRD r/w/c
91
- CR2 r/w | GIF r/w | MOBI r | PICT r | VSD r
92
- CR3 r/w | GPR r/w | MODD r | PMP r | WAV r
93
- CRM r/w | GZ r | MOI r | PNG r/w | WDP r/w
94
- CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
95
- CS1 r/w | HDR r | MOV r/w | PPT r | WEBM r
96
- CSV r | HEIC r/w | MP3 r | PPTX r | WMA r
68
+ 3FR r | DPX r | ISO r | O r | RAW r/w
69
+ 3G2 r/w | DR4 r/w/c | ITC r | ODP r | RIFF r
70
+ 3GP r/w | DSS r | J2C r | ODS r | RSRC r
71
+ A r | DV r | JNG r/w | ODT r | RTF r
72
+ AA r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
73
+ AAE r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
74
+ AAX r/w | DYLIB r | JSON r | OGV r | RWZ r
75
+ ACR r | EIP r | K25 r | OPUS r | RM r
76
+ AFM r | EPS r/w | KDC r | ORF r/w | SEQ r
77
+ AI r/w | EPUB r | KEY r | OTF r | SKETCH r
78
+ AIFF r | ERF r/w | LA r | PAC r | SO r
79
+ APE r | EXE r | LFP r | PAGES r | SR2 r/w
80
+ ARQ r/w | EXIF r/w/c | LNK r | PBM r/w | SRF r
81
+ ARW r/w | EXR r | LRV r/w | PCD r | SRW r/w
82
+ ASF r | EXV r/w/c | M2TS r | PCX r | SVG r
83
+ AVI r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
84
+ AVIF r/w | FFF r/w | MAX r | PDF r/w | THM r/w
85
+ AZW r | FITS r | MEF r/w | PEF r/w | TIFF r/w
86
+ BMP r | FLA r | MIE r/w/c | PFA r | TORRENT r
87
+ BPG r | FLAC r | MIFF r | PFB r | TTC r
88
+ BTF r | FLIF r/w | MKA r | PFM r | TTF r
89
+ CHM r | FLV r | MKS r | PGF r | TXT r
90
+ COS r | FPF r | MKV r | PGM r/w | VCF r
91
+ CR2 r/w | FPX r | MNG r/w | PLIST r | VRD r/w/c
92
+ CR3 r/w | GIF r/w | MOBI r | PICT r | VSD r
93
+ CRM r/w | GPR r/w | MODD r | PMP r | WAV r
94
+ CRW r/w | GZ r | MOI r | PNG r/w | WDP r/w
95
+ CS1 r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
96
+ CSV r | HDR r | MOV r/w | PPT r | WEBM r
97
+ CZI r | HEIC r/w | MP3 r | PPTX r | WMA r
97
98
  DCM r | HEIF r/w | MP4 r/w | PS r/w | WMV r
98
99
  DCP r/w | HTML r | MPC r | PSB r/w | WTV r
99
100
  DCR r | ICC r/w/c | MPG r | PSD r/w | WV r
@@ -104,7 +105,6 @@ supported by ExifTool (r = read, w = write, c = create):
104
105
  DNG r/w | INSP r/w | NEF r/w | RAF r/w | XMP r/w/c
105
106
  DOC r | INSV r | NRW r/w | RAM r | ZIP r
106
107
  DOCX r | INX r | NUMBERS r | RAR r |
107
- DPX r | ISO r | O r | RAW r/w |
108
108
 
109
109
  Meta Information
110
110
  ----------------------+----------------------+---------------------
@@ -662,7 +662,7 @@ option is disabled.
662
662
  Perl expression used to filter PrintConv values when writing. The
663
663
  expression acts on the value of the Perl default variable ($_), and changes
664
664
  the value of this variable as required. The current ExifTool object may be
665
- accessed through $self. The value is not changed if $_ is set to undef.
665
+ accessed through $self. The tag is not written if $_ is set to undef.
666
666
 
667
667
  =item FixBase
668
668
 
@@ -731,6 +731,11 @@ to be excluded by preceding group name with a '-'. See L</GetGroup> for a
731
731
  description of group families, and L</GetAllGroups [static]> for lists of
732
732
  group names.
733
733
 
734
+ =item HexTagIDs
735
+
736
+ Use hexadecimal instead of decimal for the family 7 group names of tags with
737
+ numerical ID's.
738
+
734
739
  =item HtmlDump
735
740
 
736
741
  Dump information in hex to dynamic HTML web page. The value may be 0-3 for
@@ -809,6 +814,11 @@ formatting expression returns undef). If not set, a minor error is issued
809
814
  for missing values, or the value is set to '' if L</IgnoreMinorErrors> is
810
815
  set. Default is undef.
811
816
 
817
+ =item NoMultiExif
818
+
819
+ Raise error when attempting to write multi-segment EXIF in a JPEG image.
820
+ Default is undef.
821
+
812
822
  =item NoPDFList
813
823
 
814
824
  Flag to avoid splitting PDF list-type tag values into separate items.
@@ -1601,7 +1611,8 @@ values in list context.
1601
1611
 
1602
1612
  0) ExifTool object reference
1603
1613
 
1604
- 1) Tag name (case sensitive, may be prefixed by family 0 or 1 group name)
1614
+ 1) Tag name (case sensitive, may be prefixed by family 0, 1 or 7 group
1615
+ names, separated by colons)
1605
1616
 
1606
1617
  =item Return Values:
1607
1618
 
@@ -1663,34 +1674,35 @@ in a specified file.
1663
1674
 
1664
1675
  2-N) [optional] List of tag names to set or options hash references. All
1665
1676
  writable tags are set if none are specified. The tag names are not case
1666
- sensitive, and may be prefixed by one or more family 0, 1 or 2 group names
1667
- with optional leading family numbers, separated by colons (eg. 'exif:iso').
1668
- A leading '-' indicates tags to be excluded (eg. '-comment'), or a trailing
1669
- '#' causes the ValueConv value to be copied (same as setting the Type option
1670
- to 'ValueConv' for this tag only). Wildcards ('*' and '?') may be used in
1671
- the tag name. A tag name of '*' is commonly used when a group is specified
1672
- to copy all tags in the group (eg. 'XMP:*'). A special feature allows tag
1673
- names of the form 'DSTTAGE<lt>SRCTAG' (or 'SRCTAGE<gt>DSTTAG') to be
1674
- specified to copy information to a tag with a different name or a specified
1675
- group. Both 'SRCTAG' and 'DSTTAG' may contain wildcards and/or be prefixed
1676
- by a group name (eg. 'fileModifyDateE<lt>modifyDate' or 'xmp:*E<lt>*'),
1677
- and/or suffixed by a '#' to disable print conversion. Copied tags may also
1678
- be added or deleted from a list with arguments of the form
1679
- 'DSTTAG+E<lt>SRCTAG' or 'DSTTAG-E<lt>SRCTAG'. Tags are evaluated in order,
1680
- so exclusions apply only to tags included earlier in the list. An extension
1681
- of this feature allows the tag value to be set from a string containing tag
1682
- names with leading '$' symbols (eg. 'CommentE<lt>the file is $filename').
1683
- Braces '{}' may be used around the tag name to separate it from subsequent
1684
- text, and a '$$' is used to to represent a '$' symbol. The behaviour for
1685
- missing tags in expressions is defined by the L</MissingTagValue> option.
1686
- The tag value may be modified via changes to the default input variable ($_)
1687
- in a Perl expression placed inside the braces and after a semicolon
1688
- following the tag name (see the last example above). A '@' may be added
1689
- after the tag name (before the semicolon) to make the expression act on
1690
- individual list items instead of the concatenated string for list-type tags.
1691
- Braces within the expression must be balanced. Multiple options hash
1692
- references may be passed to set different options for different tags.
1693
- Options apply to subsequent tags in the argument list.
1677
+ sensitive, and may be prefixed by one or more family 0, 1, 2 or 7 group
1678
+ names with optional leading family numbers, separated by colons (eg.
1679
+ 'exif:iso'). A leading '-' indicates tags to be excluded (eg. '-comment'),
1680
+ or a trailing '#' causes the ValueConv value to be copied (same as setting
1681
+ the Type option to 'ValueConv' for this tag only). Wildcards ('*' and '?')
1682
+ may be used in the tag name. A tag name of '*' is commonly used when a
1683
+ group is specified to copy all tags in the group (eg. 'XMP:*'). A special
1684
+ feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
1685
+ 'SRCTAGE<gt>DSTTAG') to be specified to copy information to a tag with a
1686
+ different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may contain
1687
+ wildcards and/or be prefixed by a group name (eg.
1688
+ 'fileModifyDateE<lt>modifyDate' or 'xmp:*E<lt>*'), and/or suffixed by a '#'
1689
+ to disable print conversion. Copied tags may also be added or deleted from
1690
+ a list with arguments of the form 'DSTTAG+E<lt>SRCTAG' or
1691
+ 'DSTTAG-E<lt>SRCTAG'. Tags are evaluated in order, so exclusions apply only
1692
+ to tags included earlier in the list. An extension of this feature allows
1693
+ the tag value to be set from a string containing tag names with leading '$'
1694
+ symbols (eg. 'CommentE<lt>the file is $filename'). Braces '{}' may be used
1695
+ around the tag name to separate it from subsequent text, and a '$$' is used
1696
+ to to represent a '$' symbol. The behaviour for missing tags in expressions
1697
+ is defined by the L</MissingTagValue> option. The tag value may be modified
1698
+ via changes to the default input variable ($_) in a Perl expression placed
1699
+ inside the braces and after a semicolon following the tag name (see the last
1700
+ example above). A '@' may be added after the tag name (before the
1701
+ semicolon) to make the expression act on individual list items instead of
1702
+ the concatenated string for list-type tags. Braces within the expression
1703
+ must be balanced. Multiple options hash references may be passed to set
1704
+ different options for different tags. Options apply to subsequent tags in
1705
+ the argument list.
1694
1706
 
1695
1707
  By default, this routine will commute information between same-named tags in
1696
1708
  different groups, allowing information to be translated between images with
@@ -2067,6 +2079,14 @@ Family 6 is currently used only for EXIF/TIFF metadata, and gives the format
2067
2079
  type of the extracted value. Generated only if the L</SaveFormat> option is
2068
2080
  used when extracting.
2069
2081
 
2082
+ Family 7 is used for tag ID's. The group names are "ID-" followed by the
2083
+ tag ID with characters other than [-_A-Za-z0-9] converted to hex. Numerical
2084
+ tag ID's are given in hex if the L</HexTagIDs> option is set. When
2085
+ specifying a family 7 group name, numerical ID's may be in hex or decimal,
2086
+ and non-numercal ID's may or may not have characters other than
2087
+ [-_A-Za-z0-9] converted to hex. Note that unlike other group names, family
2088
+ 7 group names are case sensitive (except for the leading "ID-").
2089
+
2070
2090
  See L</GetAllGroups [static]> for complete lists of group names.
2071
2091
 
2072
2092
  =back
@@ -2260,22 +2280,22 @@ ICC-meta, ICC-view, ICC_Profile, ICC_Profile#, ID3, ID3v1, ID3v1_Enh,
2260
2280
  ID3v2_2, ID3v2_3, ID3v2_4, IFD0, IFD1, IPTC, IPTC#, ISO, ITC, Insta360,
2261
2281
  InteropIFD, ItemList, JFIF, JFXX, JPEG, JPEG-HDR, JSON, JVC, Jpeg2000,
2262
2282
  KDC_IFD, Keys, Kodak, KodakBordersIFD, KodakEffectsIFD, KodakIFD,
2263
- KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, Lytro, M2TS, MAC, MIE-Audio,
2264
- MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS, MIE-Geo,
2265
- MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient,
2266
- MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MNG,
2267
- MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes,
2268
- MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta,
2269
- MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom, NikonScan,
2270
- Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF, PICT, PNG, PNG-pHYs, PSP,
2271
- Palm, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD, PhotoMechanic,
2272
- Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM, ProfileIFD,
2273
- Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF, Radiance, Rawzor,
2274
- Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5,
2275
- Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#,
2276
- SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD,
2277
- System, Theora, Torrent, Track#, UserData, UserParam, VCalendar, VCard,
2278
- Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, XMP-Device, XMP-GAudio,
2283
+ KyoceraRaw, LNK, Leaf, LeafSubIFD, Leica, Lyrics3, Lytro, M2TS, MAC,
2284
+ MIE-Audio, MIE-Camera, MIE-Canon, MIE-Doc, MIE-Extender, MIE-Flash, MIE-GPS,
2285
+ MIE-Geo, MIE-Image, MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta,
2286
+ MIE-Orient, MIE-Preview, MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video,
2287
+ MIFF, MNG, MOBI, MOI, MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS,
2288
+ MakerNotes, MakerUnknown, Matroska, MediaJukebox, Meta, MetaIFD, Microsoft,
2289
+ Minolta, MinoltaRaw, Motorola, NITF, Nikon, NikonCapture, NikonCustom,
2290
+ NikonScan, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF, PICT, PNG,
2291
+ PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Pentax, PhaseOne, PhotoCD,
2292
+ PhotoMechanic, Photoshop, PictureInfo, PostScript, PreviewIFD, PrintIM,
2293
+ ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF, RMETA, RSRC, RTF,
2294
+ Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4,
2295
+ Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD,
2296
+ SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim,
2297
+ SubIFD, System, Theora, Torrent, Track#, UserData, UserParam, VCalendar,
2298
+ VCard, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM, XMP-Device, XMP-GAudio,
2279
2299
  XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage,
2280
2300
  XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album,
2281
2301
  XMP-apple-fi, XMP-aux, XMP-cc, XMP-cell, XMP-creatorAtom, XMP-crs, XMP-dc,
@@ -2309,6 +2329,12 @@ eg. JPEG-APP1-IFD0-ExifIFD
2309
2329
  int8u, string, int16u, int32u, rational64u, int8s, undef, int16s, int32s,
2310
2330
  rational64s, float, double, ifd, unicode, complex, int64u, int64s, ifd64
2311
2331
 
2332
+ =item Family 7 (Tag ID):
2333
+
2334
+ ID-xxx (where xxx is the tag ID. Numerical ID's are given in hex with a
2335
+ leading "0x" if the HexTagIDs option is set, as are characters in
2336
+ non-numerical ID's which are not valid in a group name)
2337
+
2312
2338
  =back
2313
2339
 
2314
2340
  =head2 GetDeleteGroups [static]
@@ -2588,7 +2614,7 @@ IPTC Core and Extension specifications actually use the XMP format.)
2588
2614
 
2589
2615
  =head2 XMP
2590
2616
 
2591
- Exiftool reads XMP encoded as UTF-8, UTF-16 or UTF-32, and converts them all
2617
+ ExifTool reads XMP encoded as UTF-8, UTF-16 or UTF-32, and converts them all
2592
2618
  to UTF-8 internally. Also, all XML character entity references and numeric
2593
2619
  character references are converted. When writing, ExifTool always encodes
2594
2620
  XMP as UTF-8, converting the following 5 characters to XML character