exiftool_vendored 12.99.0 → 13.03.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +76 -3
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/arg_files/exif2xmp.args +4 -0
  7. data/bin/arg_files/xmp2exif.args +4 -0
  8. data/bin/exiftool +121 -50
  9. data/bin/lib/Image/ExifTool/Apple.pm +2 -2
  10. data/bin/lib/Image/ExifTool/CBOR.pm +4 -1
  11. data/bin/lib/Image/ExifTool/Canon.pm +35 -26
  12. data/bin/lib/Image/ExifTool/Exif.pm +15 -9
  13. data/bin/lib/Image/ExifTool/FlashPix.pm +5 -9
  14. data/bin/lib/Image/ExifTool/GIF.pm +143 -92
  15. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  16. data/bin/lib/Image/ExifTool/Geotag.pm +6 -5
  17. data/bin/lib/Image/ExifTool/GoPro.pm +2 -2
  18. data/bin/lib/Image/ExifTool/JPEG.pm +9 -1
  19. data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
  20. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  21. data/bin/lib/Image/ExifTool/M2TS.pm +2 -2
  22. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  23. data/bin/lib/Image/ExifTool/MacOS.pm +2 -1
  24. data/bin/lib/Image/ExifTool/Matroska.pm +10 -2
  25. data/bin/lib/Image/ExifTool/Nikon.pm +5 -2
  26. data/bin/lib/Image/ExifTool/PDF.pm +35 -4
  27. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  28. data/bin/lib/Image/ExifTool/PPM.pm +11 -2
  29. data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -1
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +6 -1
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +69 -7
  32. data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
  33. data/bin/lib/Image/ExifTool/TagLookup.pm +5596 -5582
  34. data/bin/lib/Image/ExifTool/TagNames.pod +75 -21
  35. data/bin/lib/Image/ExifTool/Text.pm +3 -2
  36. data/bin/lib/Image/ExifTool/Validate.pm +2 -2
  37. data/bin/lib/Image/ExifTool/WriteRIFF.pl +13 -4
  38. data/bin/lib/Image/ExifTool/Writer.pl +42 -66
  39. data/bin/lib/Image/ExifTool/XMP.pm +19 -4
  40. data/bin/lib/Image/ExifTool/XMP2.pl +60 -0
  41. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -2
  42. data/bin/lib/Image/ExifTool.pm +204 -86
  43. data/bin/lib/Image/ExifTool.pod +58 -31
  44. data/bin/perl-Image-ExifTool.spec +1 -1
  45. data/lib/exiftool_vendored/version.rb +1 -1
  46. 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 28150 tags, with 17488 unique tag names.
15
+ They contain a total of 28175 tags, with 17499 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
@@ -871,7 +873,7 @@ for the official EXIF 2.32 specification.
871
873
  0xa433 LensMake ExifIFD string
872
874
  0xa434 LensModel ExifIFD string
873
875
  0xa435 LensSerialNumber ExifIFD string
874
- 0xa436 Title ExifIFD string/
876
+ 0xa436 ImageTitle ExifIFD string
875
877
  0xa437 Photographer ExifIFD string
876
878
  0xa438 ImageEditor ExifIFD string
877
879
  0xa439 CameraFirmware ExifIFD string
@@ -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
@@ -4605,7 +4609,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
4605
4609
  GPSTrack rational
4606
4610
  GPSTrackRef string
4607
4611
  GPSVersionID string
4608
- ImageUniqueID string
4612
+ ImageUniqueID string/
4609
4613
  ISO integer+
4610
4614
  LightSource string
4611
4615
  MakerNote string
@@ -4686,6 +4690,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4686
4690
  Acceleration rational
4687
4691
  SerialNumber string
4688
4692
  CameraElevationAngle rational
4693
+ CameraFirmware string
4689
4694
  OwnerName string
4690
4695
  CompositeImage integer
4691
4696
  CompositeImageCount integer+
@@ -4702,6 +4707,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4702
4707
  CompImageValues rational_+
4703
4708
  Gamma rational
4704
4709
  Humidity rational
4710
+ ImageEditingSoftware string
4711
+ ImageEditor string
4712
+ ImageTitle string
4713
+ ImageUniqueID string
4705
4714
  InteropIndex string
4706
4715
  ISOSpeed integer
4707
4716
  ISOSpeedLatitudeyyy integer
@@ -4710,8 +4719,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4710
4719
  LensModel string
4711
4720
  LensSerialNumber string
4712
4721
  LensInfo rational+
4722
+ MetadataEditingSoftware string
4723
+ Photographer string
4713
4724
  PhotographicSensitivity integer
4714
4725
  Pressure rational
4726
+ RAWDevelopingSoftware string
4715
4727
  RecommendedExposureIndex integer
4716
4728
  SensitivityType integer
4717
4729
  StandardOutputSensitivity integer
@@ -6144,6 +6156,37 @@ These tags belong to the ExifTool XMP-rdf family 1 group.
6144
6156
  -------- --------
6145
6157
  About string!
6146
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 content authentification, which is actually XML
6172
+ format, not XMP. ExifTool has read/delete support for SEAL information in
6173
+ JPG, TIFF, XMP, PNG, WEBP, HEIC, PPM, MOV and MP4 files, and read-only
6174
+ support in PDF, MKV and WAV. Use C<-seal:all=> on the command line to
6175
+ delete SEAL information in supported formats.
6176
+
6177
+ Tag ID Tag Name Writable
6178
+ ------ -------- --------
6179
+ 'b' ByteRange no
6180
+ 'copyright' Copyright no
6181
+ 'd' Domain no
6182
+ 'da' DigestAlgorithm no
6183
+ 'info' SEALComment no
6184
+ 'ka' KeyAlgorithm no
6185
+ 'kv' KeyVersion no
6186
+ 's' Signature no
6187
+ 'seal' SEALVersion no
6188
+ 'sf' SignatureFormat no
6189
+
6147
6190
  =head3 XMP swf Tags
6148
6191
 
6149
6192
  Adobe SWF namespace tags.
@@ -28121,6 +28164,7 @@ check if speed is more of a concern.
28121
28164
  'sPLT' SuggestedPalette no
28122
28165
  'sRGB' SRGBRendering yes!
28123
28166
  'sTER' StereoImage PNG StereoImage
28167
+ 'seAl' SEAL XMP SEAL
28124
28168
  'tEXt' TextualData PNG TextualData
28125
28169
  'tIME' ModifyDate yes
28126
28170
  'tRNS' Transparency no
@@ -29224,7 +29268,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29224
29268
 
29225
29269
  Tag ID Tag Name Writable
29226
29270
  ------ -------- --------
29227
- '_stream' _stream Photoshop
29271
+ '_stream' PhotoshopStream Photoshop
29228
29272
 
29229
29273
  =head3 PDF Illustrator Tags
29230
29274
 
@@ -29247,7 +29291,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29247
29291
 
29248
29292
  Tag ID Tag Name Writable
29249
29293
  ------ -------- --------
29250
- '_stream' _stream PostScript
29294
+ '_stream' AIStream PostScript
29251
29295
 
29252
29296
  =head3 PDF Resources Tags
29253
29297
 
@@ -29276,7 +29320,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
29276
29320
 
29277
29321
  Tag ID Tag Name Writable
29278
29322
  ------ -------- --------
29279
- '_stream' _stream ICC_Profile
29323
+ '_stream' ICC_Profile ICC_Profile
29280
29324
 
29281
29325
  =head3 PDF Properties Tags
29282
29326
 
@@ -29844,6 +29888,7 @@ for the official QuickTime specification.
29844
29888
  'GPS ' GPSDataList2? no
29845
29889
  'IDIT' DateTimeOriginal string
29846
29890
  'PICT' PreviewPICT no
29891
+ 'SEAL' SEAL XMP SEAL
29847
29892
  '_htc' HTCInfo QuickTime HTCInfo
29848
29893
  'ardt' ARDroneFile no
29849
29894
  'cust' CustomInfo no
@@ -30187,22 +30232,29 @@ changed via the config file.
30187
30232
 
30188
30233
  =head3 QuickTime tx3g Tags
30189
30234
 
30190
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
30191
- subtitle text in some other videos.
30235
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
30236
+ and subtitle text in some other videos.
30192
30237
 
30193
- Tag ID Tag Name Writable
30194
- ------ -------- --------
30195
- 'Alt' GPSAltitude no
30196
- 'DateTime' DateTime no
30197
- 'GimPitch' GimbalPitch no
30198
- 'GimRoll' GimbalRoll no
30199
- 'GimYaw' GimbalYaw no
30200
- 'Lat' GPSLatitude no
30201
- 'Lon' GPSLongitude no
30202
- 'Pitch' Pitch no
30203
- 'Roll' Roll no
30204
- 'Text' Text no
30205
- 'Yaw' Yaw no
30238
+ Tag ID Tag Name Writable
30239
+ ------ -------- --------
30240
+ 'Alt' GPSAltitude no
30241
+ 'DateTime' DateTime no
30242
+ 'EV' ExposureCompensation no
30243
+ 'F-NUM' FNumber no
30244
+ 'GPSDateTime' GPSDateTime no
30245
+ 'GimPitch' GimbalPitch no
30246
+ 'GimRoll' GimbalRoll no
30247
+ 'GimYaw' GimbalYaw no
30248
+ 'HomeLat' GPSHomeLatitude no
30249
+ 'HomeLon' GPSHomeLongitude no
30250
+ 'ISO' ISO no
30251
+ 'Lat' GPSLatitude no
30252
+ 'Lon' GPSLongitude no
30253
+ 'Pitch' Pitch no
30254
+ 'Roll' Roll no
30255
+ 'SHUTTER' ExposureTime no
30256
+ 'Text' Text no
30257
+ 'Yaw' Yaw no
30206
30258
 
30207
30259
  =head3 QuickTime HTCInfo Tags
30208
30260
 
@@ -31636,6 +31688,7 @@ metadata to WEBP images, but can't yet write to other RIFF-based formats.
31636
31688
  'LIST_hydt' PentaxData Pentax AVI
31637
31689
  'LIST_ncdt' NikonData Nikon AVI
31638
31690
  'LIST_pntx' PentaxData2 Pentax AVI
31691
+ 'SEAL' SEAL XMP SEAL
31639
31692
  'SGLT' BikeBroAccel QuickTime Stream
31640
31693
  'SLLT' BikeBroGPS QuickTime Stream
31641
31694
  'VP8 ' VP8Bitstream RIFF VP8
@@ -33243,6 +33296,7 @@ Matroska specification.
33243
33296
  0xb538667 SignatureSlot Matroska
33244
33297
  0xc53bb6b Cues Matroska
33245
33298
  0xf43b675 Cluster Matroska
33299
+ 0x5345414c SEAL XMP SEAL
33246
33300
 
33247
33301
  =head3 Matroska Projection Tags
33248
33302
 
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.04';
18
+ $VERSION = '1.05';
19
19
 
20
20
  # Text tags
21
21
  %Image::ExifTool::Text::Main = (
@@ -191,7 +191,8 @@ sub ProcessTXT($$)
191
191
  $enc = 'unknown-8bit';
192
192
  }
193
193
  }
194
- if ($$et{VALUE}{MIMEEncoding} ne $enc) {
194
+ # ($$et{VALUE}{MIMEEncoding} may be undef if it was ignored)
195
+ if (defined $$et{VALUE}{MIMEEncoding} and $$et{VALUE}{MIMEEncoding} ne $enc) {
195
196
  $$et{VALUE}{MIMEEncoding} = $enc;
196
197
  $et->VPrint(0," MIMEEncoding [override] = $enc\n");
197
198
  }
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
17
17
  use strict;
18
18
  use vars qw($VERSION %exifSpec);
19
19
 
20
- $VERSION = '1.23';
20
+ $VERSION = '1.24';
21
21
 
22
22
  use Image::ExifTool qw(:Utils);
23
23
  use Image::ExifTool::Exif;
@@ -575,7 +575,7 @@ sub FinishValidate($$)
575
575
  # get all tags in this group
576
576
  foreach $key (sort keys %{$$et{VALUE}}) {
577
577
  next unless $et->GetGroup($key, 1) eq $grp;
578
- next if $$et{TAG_EXTRA}{$key} and $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
578
+ next if $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
579
579
  # fill in %val lookup with values based on tag ID
580
580
  my $tag = $$et{TAG_INFO}{$key}{TagID};
581
581
  $val{$tag} = $$et{VALUE}{$key};
@@ -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
@@ -1291,67 +1294,29 @@ sub SetNewValuesFromFile($$;@)
1291
1294
  # ! DON'T FORGET!! Must consider each new !
1292
1295
  # ! option to decide how it is handled here. !
1293
1296
  # +------------------------------------------+
1297
+ foreach (qw(ByteUnit Charset CharsetEXIF CharsetFileName CharsetID3 CharsetIPTC
1298
+ CharsetPhotoshop Composite DateFormat Debug EncodeHangs Escape ExtendedXMP
1299
+ ExtractEmbedded FastScan Filter FixBase Geolocation GeolocAltNames
1300
+ GeolocFeature GeolocMinPop GeolocMaxDist GlobalTimeShift HexTagIDs
1301
+ IgnoreGroups IgnoreMinorErrors IgnoreTags ImageHashType Lang
1302
+ LargeFileSupport ListItem ListSep MDItemTags MissingTagValue NoPDFList
1303
+ NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat SavePath
1304
+ ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam Validate
1305
+ WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
1306
+ {
1307
+ $srcExifTool->Options($_ => $$options{$_});
1308
+ }
1294
1309
  $srcExifTool->Options(
1295
1310
  Binary => 1,
1296
- ByteUnit => $$options{ByteUnit},
1297
- Charset => $$options{Charset},
1298
- CharsetEXIF => $$options{CharsetEXIF},
1299
- CharsetFileName => $$options{CharsetFileName},
1300
- CharsetID3 => $$options{CharsetID3},
1301
- CharsetIPTC => $$options{CharsetIPTC},
1302
- CharsetPhotoshop=> $$options{CharsetPhotoshop},
1303
- Composite => $$options{Composite},
1304
1311
  CoordFormat => $$options{CoordFormat} || '%d %d %.8f', # copy coordinates at high resolution unless otherwise specified
1305
- DateFormat => $$options{DateFormat},
1306
1312
  Duplicates => 1,
1307
- Escape => $$options{Escape},
1308
1313
  # Exclude (set below)
1309
- ExtendedXMP => $$options{ExtendedXMP},
1310
- ExtractEmbedded => $$options{ExtractEmbedded},
1311
- FastScan => $$options{FastScan},
1312
- Filter => $$options{Filter},
1313
- FixBase => $$options{FixBase},
1314
- Geolocation => $$options{Geolocation},
1315
- GeolocAltNames => $$options{GeolocAltNames},
1316
- GeolocFeature => $$options{GeolocFeature},
1317
- GeolocMinPop => $$options{GeolocMinPop},
1318
- GeolocMaxDist => $$options{GeolocMaxDist},
1319
- GlobalTimeShift => $$options{GlobalTimeShift},
1320
- HexTagIDs => $$options{HexTagIDs},
1321
- IgnoreGroups => $$options{IgnoreGroups},
1322
- IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
1323
- IgnoreTags => $$options{IgnoreTags},
1324
- ImageHashType => $$options{ImageHashType},
1325
- Lang => $$options{Lang},
1326
- LargeFileSupport=> $$options{LargeFileSupport},
1327
1314
  LimitLongValues => 10000000, # (10 MB)
1328
1315
  List => 1,
1329
- ListItem => $$options{ListItem},
1330
- ListSep => $$options{ListSep},
1331
1316
  MakerNotes => $$options{FastScan} && $$options{FastScan} > 1 ? undef : 1,
1332
- MDItemTags => $$options{MDItemTags},
1333
- MissingTagValue => $$options{MissingTagValue},
1334
- NoPDFList => $$options{NoPDFList},
1335
- NoWarning => $$options{NoWarning},
1336
- Password => $$options{Password},
1337
- PrintConv => $$options{PrintConv},
1338
- QuickTimeUTC => $$options{QuickTimeUTC},
1339
- RequestAll => $$options{RequestAll} || 1, # (is this still necessary now that RequestTags are being set?)
1340
- RequestTags => $$options{RequestTags},
1341
- SaveFormat => $$options{SaveFormat},
1342
- SavePath => $$options{SavePath},
1343
- ScanForXMP => $$options{ScanForXMP},
1317
+ RequestAll => $$options{RequestAll} || 1, # (must request all because reqTags doesn't cover wildcards)
1344
1318
  StrictDate => defined $$options{StrictDate} ? $$options{StrictDate} : 1,
1345
1319
  Struct => $structOpt,
1346
- StructFormat => $$options{StructFormat},
1347
- SystemTags => $$options{SystemTags},
1348
- TimeZone => $$options{TimeZone},
1349
- Unknown => $$options{Unknown},
1350
- UserParam => $$options{UserParam},
1351
- Validate => $$options{Validate},
1352
- WindowsWideFile => $$options{WindowsWideFile},
1353
- XAttrTags => $$options{XAttrTags},
1354
- XMPAutoConv => $$options{XMPAutoConv},
1355
1320
  );
1356
1321
  # reset Geolocation option if we aren't copying any geolocation tags
1357
1322
  if ($$options{Geolocation} and not grep /\bGeolocation/i, @setTags) {
@@ -1362,11 +1327,8 @@ sub SetNewValuesFromFile($$;@)
1362
1327
  $$srcExifTool{ALT_EXIFTOOL} = $$self{ALT_EXIFTOOL};
1363
1328
  foreach $tag (@setTags) {
1364
1329
  next if ref $tag;
1365
- if ($tag =~ /^-(.*)/) {
1366
- # avoid extracting tags that are excluded
1367
- push @exclude, $1;
1368
- next;
1369
- }
1330
+ # avoid extracting tags that are excluded
1331
+ $tag =~ /^-(.*)/ and push(@exclude, $1), next;
1370
1332
  # add specified tags to list of requested tags
1371
1333
  $_ = $tag;
1372
1334
  if (/(.+?)\s*(>|<)\s*(.+)/) {
@@ -2376,9 +2338,13 @@ sub WriteInfo($$;$$)
2376
2338
  } elsif (UNIVERSAL::isa($inRef,'File::RandomAccess')) {
2377
2339
  $inRef->Seek(0);
2378
2340
  $raf = $inRef;
2379
- } elsif ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$inRef) } or $@)) {
2341
+ } elsif ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
2342
+ eval { require Encode; Encode::is_utf8($$inRef) } or $@))
2343
+ {
2344
+ local $SIG{'__WARN__'} = \&SetWarning;
2380
2345
  # convert image data from UTF-8 to character stream if necessary
2381
- my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$inRef)) : Encode::encode('utf8',$$inRef);
2346
+ my $buff = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
2347
+ 'U0C*' : 'C0C*', $$inRef)) : Encode::encode('utf8', $$inRef);
2382
2348
  if (defined $outfile) {
2383
2349
  $inRef = \$buff;
2384
2350
  } else {
@@ -2951,10 +2917,15 @@ sub Sanitize($$)
2951
2917
  $$valPt = $$$valPt if ref $$valPt eq 'SCALAR';
2952
2918
  # make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater
2953
2919
  # (otherwise our byte manipulations get corrupted!!)
2954
- if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($$valPt) } or $@)) {
2920
+ # NOTE: Don't use Encode on Windows becase "require Encode" on Windows hangs if cwd is a long path name!!
2921
+ if ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
2922
+ eval { require Encode; Encode::is_utf8($$valPt) } or $@))
2923
+ {
2924
+ # (SIG handling was added in 10.39. Not sure why, but I've added this to other similar code for 13.02)
2955
2925
  local $SIG{'__WARN__'} = \&SetWarning;
2956
2926
  # repack by hand if Encode isn't available
2957
- $$valPt = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$valPt)) : Encode::encode('utf8',$$valPt);
2927
+ $$valPt = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
2928
+ 'U0C*' : 'C0C*', $$valPt)) : Encode::encode('utf8', $$valPt);
2958
2929
  }
2959
2930
  # un-escape value if necessary
2960
2931
  if ($$self{OPTIONS}{Escape}) {
@@ -3012,7 +2983,7 @@ Conv: for (;;) {
3012
2983
  $err2 = eval $$tagInfo{WriteCheck};
3013
2984
  $@ and warn($@), $err2 = 'Error evaluating WriteCheck';
3014
2985
  }
3015
- unless ($err2) {
2986
+ unless (defined $err2) {
3016
2987
  my $table = $$tagInfo{Table};
3017
2988
  if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
3018
2989
  my $checkProc = $$table{CHECK_PROC};
@@ -3295,7 +3266,7 @@ sub InsertTagValues($$;$$$$)
3295
3266
  my @matches = grep /^$tag(\s|$)/i, @$foundTags;
3296
3267
  @matches = $self->GroupMatches($group, \@matches) if defined $group;
3297
3268
  foreach (@matches) {
3298
- my $doc = $$ex{$_} ? $$ex{$_}{G3} || 0 : 0;
3269
+ my $doc = $$ex{$_}{G3} || 0;
3299
3270
  if (defined $$cacheTag[$doc]) {
3300
3271
  next unless $$cacheTag[$doc] =~ / \((\d+)\)$/;
3301
3272
  my $cur = $1;
@@ -6650,6 +6621,11 @@ sub WriteJPEG($$)
6650
6621
  $segType = 'Ricoh RMETA';
6651
6622
  $$delGroup{RMETA} and $del = 1;
6652
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
+ }
6653
6629
  } elsif ($marker == 0xeb) { # APP10 (JUMBF)
6654
6630
  if ($$segDataPt =~ /^JP/) {
6655
6631
  $segType = 'JUMBF';
@@ -7016,7 +6992,7 @@ sub SetFileTime($$;$$$$)
7016
6992
  # get Win32 handle, needed for SetFileTime
7017
6993
  my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
7018
6994
  unless ($win32Handle) {
7019
- $self->Warn('Win32API::File::GetOsFHandle returned invalid handle');
6995
+ $self->Warn('Win32API::File GetOsFHandle returned invalid handle');
7020
6996
  return 0;
7021
6997
  }
7022
6998
  # convert Unix seconds to FILETIME structs
@@ -7034,13 +7010,13 @@ sub SetFileTime($$;$$$$)
7034
7010
  return 0 if defined $k32SetFileTime;
7035
7011
  $k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
7036
7012
  unless ($k32SetFileTime) {
7037
- $self->Warn('Error calling Win32::API::SetFileTime');
7013
+ $self->Warn('Error loading Win32::API SetFileTime');
7038
7014
  $k32SetFileTime = 0;
7039
7015
  return 0;
7040
7016
  }
7041
7017
  }
7042
7018
  unless ($k32SetFileTime->Call($win32Handle, $ctime, $atime, $mtime)) {
7043
- $self->Warn('Win32::API::SetFileTime returned ' . Win32::GetLastError());
7019
+ $self->Warn('Win32::API SetFileTime returned ' . Win32::GetLastError());
7044
7020
  return 0;
7045
7021
  }
7046
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.67';
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' },
@@ -2016,6 +2021,7 @@ my %sPantryItem = (
2016
2021
  Writable => 'integer',
2017
2022
  List => 'Seq',
2018
2023
  AutoSplit => 1,
2024
+ Notes => 'deprecated',
2019
2025
  },
2020
2026
  OECF => {
2021
2027
  Name => 'Opto-ElectricConvFactor',
@@ -2267,7 +2273,7 @@ my %sPantryItem = (
2267
2273
  3 => 'Distant',
2268
2274
  },
2269
2275
  },
2270
- ImageUniqueID => { },
2276
+ ImageUniqueID => { Avoid => 1, Notes => 'moved to exifEX namespace in 2024 spec' },
2271
2277
  GPSVersionID => { Groups => { 2 => 'Location' } },
2272
2278
  GPSLatitude => { Groups => { 2 => 'Location' }, %latConv },
2273
2279
  GPSLongitude => { Groups => { 2 => 'Location' }, %longConv },
@@ -2509,6 +2515,15 @@ my %sPantryItem = (
2509
2515
  Values => { List => 'Seq', Writable => 'rational' },
2510
2516
  },
2511
2517
  },
2518
+ # new in Exif 3.0
2519
+ ImageUniqueID => { },
2520
+ ImageTitle => { },
2521
+ ImageEditor => { },
2522
+ Photographer => { Groups => { 2 => 'Author' } },
2523
+ CameraFirmware => { Groups => { 2 => 'Camera' } },
2524
+ RAWDevelopingSoftware => { },
2525
+ ImageEditingSoftware => { },
2526
+ MetadataEditingSoftware => { },
2512
2527
  );
2513
2528
 
2514
2529
  # Auxiliary namespace properties (aux) - not fully documented (ref PH)
@@ -3616,7 +3631,7 @@ NoLoop:
3616
3631
  # store the value for this tag
3617
3632
  my $key = $et->FoundTag($tagInfo, $val) or return 0;
3618
3633
  # save original components of rational numbers (used when copying)
3619
- $$et{RATIONAL}{$key} = $rational if defined $rational;
3634
+ $$et{TAG_EXTRA}{$key}{Rational} = $rational if defined $rational;
3620
3635
  # save structure/list information if necessary
3621
3636
  if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
3622
3637
  not $$et{NO_STRUCT})
@@ -4132,7 +4147,7 @@ sub ParseXMPElement($$$;$$$$)
4132
4147
 
4133
4148
  #------------------------------------------------------------------------------
4134
4149
  # Process XMP data
4135
- # 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
4136
4151
  # Returns: 1 on success
4137
4152
  # Notes: The following flavours of XMP files are currently recognized:
4138
4153
  # - standard XMP with xpacket, x:xmpmeta and rdf:RDF elements