exiftool_vendored 13.04.0 → 13.08.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +48 -0
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +2 -2
  7. data/bin/exiftool +30 -23
  8. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  9. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  10. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  11. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -3
  12. data/bin/lib/Image/ExifTool/Canon.pm +19 -1
  13. data/bin/lib/Image/ExifTool/DJI.pm +91 -29
  14. data/bin/lib/Image/ExifTool/Exif.pm +2 -2
  15. data/bin/lib/Image/ExifTool/FITS.pm +2 -2
  16. data/bin/lib/Image/ExifTool/FLIF.pm +2 -2
  17. data/bin/lib/Image/ExifTool/FlashPix.pm +11 -11
  18. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  19. data/bin/lib/Image/ExifTool/Geolocation.pm +2 -1
  20. data/bin/lib/Image/ExifTool/GoPro.pm +3 -3
  21. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  22. data/bin/lib/Image/ExifTool/ID3.pm +3 -3
  23. data/bin/lib/Image/ExifTool/IPTC.pm +2 -2
  24. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  25. data/bin/lib/Image/ExifTool/JPEG.pm +19 -4
  26. data/bin/lib/Image/ExifTool/Jpeg2000.pm +6 -6
  27. data/bin/lib/Image/ExifTool/M2TS.pm +39 -9
  28. data/bin/lib/Image/ExifTool/MXF.pm +2 -2
  29. data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  31. data/bin/lib/Image/ExifTool/PDF.pm +15 -15
  32. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  33. data/bin/lib/Image/ExifTool/PNG.pm +4 -4
  34. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  35. data/bin/lib/Image/ExifTool/PhaseOne.pm +3 -3
  36. data/bin/lib/Image/ExifTool/Photoshop.pm +63 -3
  37. data/bin/lib/Image/ExifTool/Protobuf.pm +242 -0
  38. data/bin/lib/Image/ExifTool/QuickTime.pm +23 -14
  39. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +395 -109
  40. data/bin/lib/Image/ExifTool/README +4 -1
  41. data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
  42. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/Ricoh.pm +3 -3
  44. data/bin/lib/Image/ExifTool/Sony.pm +4 -3
  45. data/bin/lib/Image/ExifTool/TagInfoXML.pm +4 -3
  46. data/bin/lib/Image/ExifTool/TagLookup.pm +6988 -6967
  47. data/bin/lib/Image/ExifTool/TagNames.pod +85 -5
  48. data/bin/lib/Image/ExifTool/VCard.pm +2 -2
  49. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  50. data/bin/lib/Image/ExifTool/WriteExif.pl +2 -2
  51. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +4 -4
  52. data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
  53. data/bin/lib/Image/ExifTool/Writer.pl +17 -17
  54. data/bin/lib/Image/ExifTool/XMP.pm +20 -10
  55. data/bin/lib/Image/ExifTool/XMP2.pl +38 -0
  56. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  57. data/bin/lib/Image/ExifTool.pm +109 -82
  58. data/bin/lib/Image/ExifTool.pod +8 -7
  59. data/bin/perl-Image-ExifTool.spec +1 -1
  60. data/lib/exiftool_vendored/version.rb +1 -1
  61. metadata +3 -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 28187 tags, with 17502 unique tag names.
15
+ They contain a total of 28218 tags, with 17514 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
@@ -115,6 +115,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
115
115
  FPXR FlashPix
116
116
  MPF MPF
117
117
  InfiRayVersion InfiRay Version
118
+ UniformResourceName no
118
119
  PreviewImage no
119
120
  'APP3' Meta Kodak Meta
120
121
  Stim Stim
@@ -152,6 +153,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
152
153
  InfiRaySensor InfiRay Sensor
153
154
  SEAL XMP SEAL
154
155
  'APP10' Comment no
156
+ HDRGainCurve no
155
157
  'APP11' JPEG-HDR JPEG HDR
156
158
  JUMBF Jpeg2000
157
159
  'APP12' PictureInfo APP12 PictureInfo
@@ -1370,6 +1372,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1370
1372
  acdsee XMP acdsee
1371
1373
  acdsee-rs XMP ACDSeeRegions
1372
1374
  album XMP Album
1375
+ apdi XMP apdi
1373
1376
  apple-fi XMP apple_fi
1374
1377
  ast Nikon ast
1375
1378
  aux XMP aux
@@ -1402,6 +1405,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
1402
1405
  GPano XMP GPano
1403
1406
  GSpherical XMP GSpherical
1404
1407
  hdr XMP hdr
1408
+ HDRGainMap XMP HDRGainMap
1405
1409
  hdrgm XMP hdrgm
1406
1410
  ics XMP ics
1407
1411
  iptcCore XMP iptcCore
@@ -1584,6 +1588,18 @@ These tags belong to the ExifTool XMP-album family 1 group.
1584
1588
  -------- --------
1585
1589
  Notes string
1586
1590
 
1591
+ =head3 XMP apdi Tags
1592
+
1593
+ Used in Apple HDR GainMap images.
1594
+
1595
+ These tags belong to the ExifTool XMP-apdi family 1 group.
1596
+
1597
+ Tag Name Writable
1598
+ -------- --------
1599
+ AuxiliaryImageType string
1600
+ NativeFormat string
1601
+ StoredFormat string
1602
+
1587
1603
  =head3 XMP apple_fi Tags
1588
1604
 
1589
1605
  Face information tags written by the Apple iPhone 5 inside the mwg-rs
@@ -5030,6 +5046,16 @@ These tags belong to the ExifTool XMP-hdr family 1 group.
5030
5046
  CCVWhiteXY string
5031
5047
  SceneReferred boolean
5032
5048
 
5049
+ =head3 XMP HDRGainMap Tags
5050
+
5051
+ Used in Apple HDR GainMap images.
5052
+
5053
+ These tags belong to the ExifTool XMP-HDRGainMap family 1 group.
5054
+
5055
+ Tag Name Writable
5056
+ -------- --------
5057
+ HDRGainMapVersion string
5058
+
5033
5059
  =head3 XMP hdrgm Tags
5034
5060
 
5035
5061
  Tags used in Adobe gain map images.
@@ -8877,7 +8903,7 @@ access to this information.
8877
8903
  0x0432 MeasurementScale? no
8878
8904
  0x0433 TimelineInfo? no
8879
8905
  0x0434 SheetDisclosure? no
8880
- 0x0435 ChannelOptions? no
8906
+ 0x0435 ChannelOptions Photoshop ChannelOptions
8881
8907
  0x0436 OnionSkins? no
8882
8908
  0x0438 CountInfo? no
8883
8909
  0x043a PrintInfo2? no
@@ -8940,6 +8966,15 @@ access to this information.
8940
8966
  ------ -------- --------
8941
8967
  4 PixelAspectRatio no
8942
8968
 
8969
+ =head3 Photoshop ChannelOptions Tags
8970
+
8971
+ Index1 Tag Name Writable
8972
+ ------ -------- --------
8973
+ 0 ChannelColorSpace no
8974
+ 2 ChannelColorData no
8975
+ 11 ChannelOpacity no
8976
+ 12 ChannelColorIndicates no
8977
+
8943
8978
  =head3 Photoshop DocumentData Tags
8944
8979
 
8945
8980
  Tag ID Tag Name Writable
@@ -9299,6 +9334,7 @@ Unknown only to reduce the volume of the normal output.
9299
9334
  CanonCameraInfo1100D Canon CameraInfo600D
9300
9335
  CanonCameraInfo1200D Canon CameraInfo60D
9301
9336
  CanonCameraInfoR6 Canon CameraInfoR6
9337
+ CanonCameraInfoR6m2 Canon CameraInfoR6m2
9302
9338
  CanonCameraInfoG5XII Canon CameraInfoG5XII
9303
9339
  CanonCameraInfoPowerShot Canon CameraInfoPowerShot
9304
9340
  CanonCameraInfoPowerShot2 Canon CameraInfoPowerShot2
@@ -10295,6 +10331,14 @@ CameraInfo tags for the EOS R5 and R6.
10295
10331
  ------ -------- --------
10296
10332
  2801 ShutterCount int32u
10297
10333
 
10334
+ =head3 Canon CameraInfoR6m2 Tags
10335
+
10336
+ CameraInfo tags for the EOS R6 Mark II.
10337
+
10338
+ Index1 Tag Name Writable
10339
+ ------ -------- --------
10340
+ 3369 ShutterCount int32u
10341
+
10298
10342
  =head3 Canon CameraInfoG5XII Tags
10299
10343
 
10300
10344
  CameraInfo tags for the PowerShot G5 X Mark II.
@@ -12912,6 +12956,35 @@ Thermal parameters extracted from APP4 of some DJI RJPEG files.
12912
12956
  8 Emissivity no
12913
12957
  10 ReflectedTemperature no
12914
12958
 
12959
+ =head3 DJI Protobuf Tags
12960
+
12961
+ Tags found in protobuf-format DJI meta djmd and dbgi timed metadata. Only a
12962
+ few tags are currently known, but unknown djmd tags may be extracted by
12963
+ setting the Unknown option to 1 (or 2 to also extract unknown dbgi debug
12964
+ tags). Tag ID's are composed of the corresponding .proto file name combined
12965
+ with the hierarchical protobuf field numbers. The "dvtm_AVATA2.proto" file
12966
+ is used by the DJI Avanta 2, and "dvtm_ac203.proto" by the OsmoAction4.
12967
+
12968
+ Tag ID Tag Name Writable
12969
+ ------ -------- --------
12970
+ 'Protocol' Protocol no
12971
+ 'dvtm_AVATA2_1-1-10' Model no
12972
+ 'dvtm_AVATA2_2-2-3-1' SerialNumber no
12973
+ 'dvtm_AVATA2_2-3-1' FrameWidth no
12974
+ 'dvtm_AVATA2_2-3-2' FrameHeight no
12975
+ 'dvtm_AVATA2_2-3-3' FrameRate no
12976
+ 'dvtm_AVATA2_3-1-2' TimeStamp no
12977
+ 'dvtm_AVATA2_3-4-4-1-2' GPSLatitude no
12978
+ 'dvtm_AVATA2_3-4-4-1-3' GPSLongitude no
12979
+ 'dvtm_ac203_1-1-10' Model no
12980
+ 'dvtm_ac203_2-3-1' FrameWidth no
12981
+ 'dvtm_ac203_2-3-2' FrameHeight no
12982
+ 'dvtm_ac203_2-3-3' FrameRate no
12983
+ 'dvtm_ac203_3-4-2-1-2' GPSLatitude no
12984
+ 'dvtm_ac203_3-4-2-1-3' GPSLongitude no
12985
+ 'dvtm_ac203_3-4-2-2' GPSAltitude no
12986
+ 'dvtm_ac203_3-4-2-6-1' GPSDateTime no
12987
+
12915
12988
  =head2 FLIR Tags
12916
12989
 
12917
12990
  Information extracted from the maker notes of JPEG images from thermal
@@ -24770,7 +24843,9 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
24770
24843
  'UNIT' Units? no
24771
24844
  'VERS' MetadataVersion no
24772
24845
  'VFOV' FieldOfView no
24846
+ 'VFPS' VideoFrameRate no
24773
24847
  'VFRH' VisualFlightRulesHUD no
24848
+ 'VRES' VideoFrameSize no
24774
24849
  'WBAL' ColorTemperatures no
24775
24850
  'WNDM' WindProcessing no
24776
24851
  'WRGB' WhiteBalanceRGB no
@@ -29936,13 +30011,14 @@ for the official QuickTime specification.
29936
30011
  'sefd' SamsungTrailer Samsung Trailer
29937
30012
  'skip' CanonSkip Canon Skip
29938
30013
  PreviewImage no
29939
- SkipInfo -
30014
+ SkipInfo QuickTime Stream
30015
+ LigoGPSInfo -
29940
30016
  Skip? no
29941
30017
  'thm ' ThumbnailImage no
29942
30018
  'thum' ThumbnailImage no
29943
30019
  'udat' GPSLog no
29944
30020
  'udta' KenwoodData QuickTime Stream
29945
- LIGO_JSON QuickTime Stream
30021
+ LigoJSON QuickTime Stream
29946
30022
  FLIRData FLIR UserData
29947
30023
  'uuid' XMP XMP
29948
30024
  UUID-PROF QuickTime Profile
@@ -29962,7 +30038,7 @@ for the official QuickTime specification.
29962
30038
  The tags below are extracted from timed metadata in QuickTime and other
29963
30039
  formats of video files when the ExtractEmbedded option is used. Although
29964
30040
  most of these tags are combined into the single table below, ExifTool
29965
- currently reads 82 different formats of timed GPS metadata from video files.
30041
+ currently reads 96 different types of timed GPS metadata from video files.
29966
30042
 
29967
30043
  Tag Name Writable
29968
30044
  -------- --------
@@ -29973,6 +30049,8 @@ currently reads 82 different formats of timed GPS metadata from video files.
29973
30049
  CameraDateTime no
29974
30050
  CameraModel no
29975
30051
  Car no
30052
+ DJIDebug? DJI Protobuf
30053
+ DJIMetadata DJI Protobuf
29976
30054
  DateTimeOriginal no
29977
30055
  DateTimeStamp no
29978
30056
  Distance no
@@ -30012,6 +30090,8 @@ currently reads 82 different formats of timed GPS metadata from video files.
30012
30090
  Unknown01? no
30013
30091
  Unknown02? no
30014
30092
  Unknown03? no
30093
+ Unknown_H? no
30094
+ Unknown_M? no
30015
30095
  UserLabel no
30016
30096
  VerticalSpeed no
30017
30097
  VideoTimeStamp no
@@ -325,7 +325,7 @@ sub ProcessVCard($$)
325
325
  $$et{DOC_NUM} = ++$$et{DOC_COUNT}; # read next card as a new document
326
326
  }
327
327
  unless ($val =~ s/^([-A-Za-z0-9.]+)//) {
328
- $et->WarnOnce("Unrecognized line in $lbl file");
328
+ $et->Warn("Unrecognized line in $lbl file");
329
329
  next;
330
330
  }
331
331
  my $tag = $1;
@@ -379,7 +379,7 @@ sub ProcessVCard($$)
379
379
  $param{$p} = '';
380
380
  }
381
381
  }
382
- $val =~ s/^:// or $et->WarnOnce("Invalid line in $lbl file"), next;
382
+ $val =~ s/^:// or $et->Warn("Invalid line in $lbl file"), next;
383
383
  # add 'Type' parameter to id and name if it exists
384
384
  $param{Type} and $tag .= $param{Type}, $name .= $param{Type};
385
385
  # convert base64-encoded data
@@ -421,7 +421,7 @@ sub ValidateExif($$$$$$$$)
421
421
  {
422
422
  my ($et, $tagTablePtr, $tag, $tagInfo, $lastTag, $ifd, $count, $formatStr) = @_;
423
423
 
424
- $et->WarnOnce("Entries in $ifd are out of order") if $tag <= $lastTag;
424
+ $et->Warn("Entries in $ifd are out of order") if $tag <= $lastTag;
425
425
 
426
426
  # (get tagInfo for unknown tags if Unknown option not used)
427
427
  if (not defined $tagInfo and $$tagTablePtr{$tag} and ref $$tagTablePtr{$tag} eq 'HASH') {
@@ -532,8 +532,8 @@ sub ValidateOffsetInfo($$$;$)
532
532
  while (@offsets) {
533
533
  my $start = pop @offsets;
534
534
  my $end = $start + pop @sizes;
535
- $et->WarnOnce("$dirName:$$offsets[0]{Name} is zero", $minor) if $start == 0;
536
- $et->WarnOnce("$dirName:$$sizes[0]{Name} is zero", $minor) if $start == $end;
535
+ $et->Warn("$dirName:$$offsets[0]{Name} is zero", $minor) if $start == 0;
536
+ $et->Warn("$dirName:$$sizes[0]{Name} is zero", $minor) if $start == $end;
537
537
  next unless $end > $fileSize;
538
538
  if ($start >= $fileSize) {
539
539
  if ($start == 0xffffffff) {
@@ -387,8 +387,8 @@ sub ValidateImageData($$$;$)
387
387
  }
388
388
  push @bitsPerSample, $bitsPerSample[0] while @bitsPerSample < $samplesPerPix;
389
389
  foreach (@bitsPerSample) {
390
- $et->WarnOnce("$dirName BitsPerSample values are different", $minor) if $_ ne $bitsPerSample[0];
391
- $et->WarnOnce("Invalid $dirName BitsPerSample value", $minor) if $_ < 1 or $_ > 32;
390
+ $et->Warn("$dirName BitsPerSample values are different", $minor) if $_ ne $bitsPerSample[0];
391
+ $et->Warn("Invalid $dirName BitsPerSample value", $minor) if $_ < 1 or $_ > 32;
392
392
  }
393
393
  }
394
394
  my $bitsPerPixel = 0;
@@ -339,7 +339,7 @@ sub FormatQTValue($$;$$)
339
339
  $flags = 0x01; # UTF8
340
340
  $$valPt = $et->Encode($$valPt, 'UTF8');
341
341
  }
342
- defined $$valPt or $et->WarnOnce("Error converting value for $$tagInfo{Name}");
342
+ defined $$valPt or $et->Warn("Error converting value for $$tagInfo{Name}");
343
343
  return $flags;
344
344
  }
345
345
 
@@ -548,7 +548,7 @@ sub WriteItemInfo($$$)
548
548
  $buff = $v2;
549
549
  $wasDeflated = 1;
550
550
  } else {
551
- $et->WarnOnce("Error inflating $name metadata");
551
+ $et->Warn("Error inflating $name metadata");
552
552
  next;
553
553
  }
554
554
  }
@@ -683,7 +683,7 @@ sub WriteItemInfo($$$)
683
683
  # write compressed XMP if Compress option is set
684
684
  if ($et->Options('Compress') and length $newVal) {
685
685
  if (not eval { require Compress::Zlib }) {
686
- $et->WarnOnce('Install Compress::Zlib to write compressed metadata');
686
+ $et->Warn('Install Compress::Zlib to write compressed metadata');
687
687
  } else {
688
688
  my $deflate = Compress::Zlib::deflateInit();
689
689
  if ($deflate) {
@@ -973,7 +973,7 @@ sub WriteQuickTime($$$)
973
973
  $et->Error('End of processing at large atom (LargeFileSupport not enabled)');
974
974
  last;
975
975
  } elsif ($et->Options('LargeFileSupport') eq '2') {
976
- $et->WarnOnce('Processing large atom (LargeFileSupport is 2)');
976
+ $et->Warn('Processing large atom (LargeFileSupport is 2)');
977
977
  }
978
978
  }
979
979
  $size = $hi * 4294967296 + $lo - 16;
@@ -112,7 +112,7 @@ sub ValidateProperty($$;$)
112
112
  my $valLang = $$et{XmpValidateLangAlt} || ($$et{XmpValidateLangAlt} = { });
113
113
  $$valLang{$langPath} or $$valLang{$langPath} = { };
114
114
  if ($$valLang{$langPath}{$lang}) {
115
- $et->WarnOnce("Duplicate language ($lang) in lang-alt list: $langPath");
115
+ $et->Warn("Duplicate language ($lang) in lang-alt list: $langPath");
116
116
  } else {
117
117
  $$valLang{$langPath}{$lang} = 1;
118
118
  }
@@ -984,7 +984,7 @@ sub WriteXMP($$;$)
984
984
  (not @fixInfo or $fixInfo[0] ne $info);
985
985
  pop @props;
986
986
  }
987
- $et->WarnOnce("Error finding parent structure for $$tagInfo{Name}") unless @fixInfo;
987
+ $et->Warn("Error finding parent structure for $$tagInfo{Name}") unless @fixInfo;
988
988
  }
989
989
  # fix property path for this tag (last in the @fixInfo list)
990
990
  push @fixInfo, $tagInfo unless @fixInfo and $isStruct;
@@ -1299,10 +1299,10 @@ sub SetNewValuesFromFile($$;@)
1299
1299
  ExtractEmbedded FastScan Filter FixBase Geolocation GeolocAltNames
1300
1300
  GeolocFeature GeolocMinPop GeolocMaxDist GlobalTimeShift HexTagIDs
1301
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))
1302
+ LargeFileSupport LigoGPSScale ListItem ListSep MDItemTags MissingTagValue
1303
+ NoPDFList NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat
1304
+ SavePath ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam
1305
+ Validate WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
1306
1306
  {
1307
1307
  $srcExifTool->Options($_ => $$options{$_});
1308
1308
  }
@@ -1749,7 +1749,7 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
1749
1749
  my $err = &$checkProc($self, $tagInfo, \$val);
1750
1750
  if ($err or not defined $val) {
1751
1751
  $err or $err = 'Error generating raw value';
1752
- $self->WarnOnce("$err for $$tagInfo{Name}");
1752
+ $self->Warn("$err for $$tagInfo{Name}");
1753
1753
  @$vals = ();
1754
1754
  last;
1755
1755
  }
@@ -1769,7 +1769,7 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
1769
1769
  # an empty warning ("\n") ignores tag with no error
1770
1770
  if ($evalWarning ne "\n") {
1771
1771
  my $err = CleanWarning() . " in $$tagInfo{Name} (RawConvInv)";
1772
- $self->WarnOnce($err);
1772
+ $self->Warn($err);
1773
1773
  }
1774
1774
  @$vals = ();
1775
1775
  last;
@@ -1953,8 +1953,8 @@ sub SetFileModifyDate($$;$$$)
1953
1953
  }
1954
1954
  my ($aTime, $mTime, $cTime);
1955
1955
  if ($tag eq 'FileCreateDate') {
1956
- eval { require Win32::API } or $self->WarnOnce("Install Win32::API to set $tag"), return -1;
1957
- eval { require Win32API::File } or $self->WarnOnce("Install Win32API::File to set $tag"), return -1;
1956
+ eval { require Win32::API } or $self->Warn("Install Win32::API to set $tag"), return -1;
1957
+ eval { require Win32API::File } or $self->Warn("Install Win32API::File to set $tag"), return -1;
1958
1958
  $cTime = $val;
1959
1959
  } else {
1960
1960
  $aTime = $mTime = $val;
@@ -2151,7 +2151,7 @@ sub SetSystemTags($$)
2151
2151
  $self->VerboseValue('+ FilePermissions', $perm);
2152
2152
  $result = 1;
2153
2153
  } else {
2154
- $self->WarnOnce('Error setting FilePermissions');
2154
+ $self->Warn('Error setting FilePermissions');
2155
2155
  $result = -1;
2156
2156
  }
2157
2157
  }
@@ -2165,7 +2165,7 @@ sub SetSystemTags($$)
2165
2165
  $self->VerboseValue('+ FileGroupID', $gid) if $gid >= 0;
2166
2166
  $result = 1;
2167
2167
  } else {
2168
- $self->WarnOnce('Error setting FileGroup/UserID');
2168
+ $self->Warn('Error setting FileGroup/UserID');
2169
2169
  $result = -1 unless $result;
2170
2170
  }
2171
2171
  }
@@ -2181,7 +2181,7 @@ sub SetSystemTags($$)
2181
2181
  $result = $res if $res == 1 or not $result;
2182
2182
  last;
2183
2183
  } elsif ($tag ne 'FileCreateDate') {
2184
- $self->WarnOnce('Can only set MDItem tags on MacOS');
2184
+ $self->Warn('Can only set MDItem tags on MacOS');
2185
2185
  last;
2186
2186
  }
2187
2187
  }
@@ -2194,7 +2194,7 @@ sub SetSystemTags($$)
2194
2194
  } elsif (ref $file) {
2195
2195
  $self->Warn('Writing ZoneIdentifer requires a file name');
2196
2196
  } elsif (defined $self->GetNewValue('ZoneIdentifier', \$zhash)) {
2197
- $self->Warn('ZoneIndentifier may only be delted');
2197
+ $self->Warn('ZoneIndentifier may only be deleted');
2198
2198
  } elsif (not eval { require Win32API::File }) {
2199
2199
  $self->Warn('Install Win32API::File to write ZoneIdentifier');
2200
2200
  } else {
@@ -4266,7 +4266,7 @@ sub WriteDirectory($$$;$)
4266
4266
  # allow MakerNotes to be deleted from ExifIFD of CR3 file
4267
4267
  not ($self->IsRawType() == 2 and $parent eq 'ExifIFD'))
4268
4268
  {
4269
- $self->WarnOnce("Can't delete $1 from $$self{FileType}",1);
4269
+ $self->Warn("Can't delete $1 from $$self{FileType}",1);
4270
4270
  undef $grp1;
4271
4271
  } elsif (not $blockExifTypes{$$self{FILE_TYPE}}) {
4272
4272
  # restrict delete logic to prevent entire tiff image from being killed
@@ -6430,7 +6430,7 @@ sub WriteJPEG($$)
6430
6430
  # warn of subsequent XMP blocks specifying a different
6431
6431
  # HasExtendedXMP (have never seen this)
6432
6432
  if ($goodGuid and $goodGuid ne $2) {
6433
- $self->WarnOnce('Multiple XMP segments specifying different extended XMP GUID');
6433
+ $self->Warn('Multiple XMP segments specifying different extended XMP GUID');
6434
6434
  }
6435
6435
  $goodGuid = $2; # GUID for the standard extended XMP
6436
6436
  }
@@ -6578,7 +6578,7 @@ sub WriteJPEG($$)
6578
6578
  undef $$segDataPt;
6579
6579
  next Marker;
6580
6580
  } elsif (defined $chunkNum) {
6581
- $self->WarnOnce('Invalid or extraneous ICC_Profile chunk(s)');
6581
+ $self->Warn('Invalid or extraneous ICC_Profile chunk(s)');
6582
6582
  # fall through to preserve this extra profile...
6583
6583
  }
6584
6584
  } elsif ($$segDataPt =~ /^FPXR\0/) {
@@ -6985,9 +6985,9 @@ sub SetFileTime($$;$$$$)
6985
6985
  # on Windows, try to work around incorrect file times when daylight saving time is in effect
6986
6986
  if ($^O eq 'MSWin32') {
6987
6987
  if (not eval { require Win32::API }) {
6988
- $self->WarnOnce('Install Win32::API for proper handling of Windows file times');
6988
+ $self->Warn('Install Win32::API for proper handling of Windows file times');
6989
6989
  } elsif (not eval { require Win32API::File }) {
6990
- $self->WarnOnce('Install Win32API::File for proper handling of Windows file times');
6990
+ $self->Warn('Install Win32API::File for proper handling of Windows file times');
6991
6991
  } else {
6992
6992
  # get Win32 handle, needed for SetFileTime
6993
6993
  my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.69';
53
+ $VERSION = '3.70';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -207,6 +207,8 @@ my %xmpNS = (
207
207
  # Note: Google uses a prefix of 'Container', but this conflicts with the
208
208
  # Device Container namespace, also by Google. So call this one GContainer
209
209
  GContainer=> 'http://ns.google.com/photos/1.0/container/',
210
+ HDRGainMap=> 'http://ns.apple.com/HDRGainMap/1.0/',
211
+ apdi => 'http://ns.apple.com/pixeldatainfo/1.0/',
210
212
  );
211
213
 
212
214
  # build reverse namespace lookup
@@ -934,6 +936,14 @@ my %sRangeMask = (
934
936
  Name => 'xmpDSA',
935
937
  SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
936
938
  },
939
+ HDRGainMap => {
940
+ Name => 'HDRGainMap',
941
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::HDRGainMap' },
942
+ },
943
+ apdi => {
944
+ Name => 'apdi',
945
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::apdi' },
946
+ },
937
947
  seal => {
938
948
  Name => 'seal',
939
949
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::seal' },
@@ -2839,7 +2849,7 @@ sub FullEscapeXML($)
2839
2849
  $str =~ s/\\/&#92;/sg; # escape backslashes too
2840
2850
  # then use C-escape sequences for invalid characters
2841
2851
  if ($str =~ /[\0-\x1f]/ or Image::ExifTool::IsUTF8(\$str) < 0) {
2842
- $str =~ s/([\0-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/sge;
2852
+ $str =~ s/([\0-\x1f\x7f-\xff])/sprintf("\\x%.2x",ord $1)/sge;
2843
2853
  }
2844
2854
  return $str;
2845
2855
  }
@@ -3620,9 +3630,9 @@ NoLoop:
3620
3630
  }
3621
3631
  if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
3622
3632
  if ($val =~ /^true|false$/) {
3623
- $et->WarnOnce("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
3633
+ $et->Warn("Boolean value for XMP-$ns:$$tagInfo{Name} should be capitalized",1);
3624
3634
  } else {
3625
- $et->WarnOnce(qq(Boolean value for XMP-$ns:$$tagInfo{Name} should be "True" or "False"),1);
3635
+ $et->Warn(qq(Boolean value for XMP-$ns:$$tagInfo{Name} should be "True" or "False"),1);
3626
3636
  }
3627
3637
  }
3628
3638
  # protect against large binary data in unknown tags
@@ -3813,7 +3823,7 @@ sub ParseXMPElement($$$;$$$$)
3813
3823
  $stdNS = $uri2ns{$try};
3814
3824
  if ($stdNS) {
3815
3825
  $val = $try;
3816
- $et->WarnOnce("Fixed incorrect URI for xmlns:$ns", 1);
3826
+ $et->Warn("Fixed incorrect URI for xmlns:$ns", 1);
3817
3827
  } elsif ($val =~ m(^http://ns.nikon.com/BASIC_PARAM)) {
3818
3828
  $et->OverrideFileType('NXD','application/x-nikon-nxd');
3819
3829
  } else {
@@ -3894,9 +3904,9 @@ sub ParseXMPElement($$$;$$$$)
3894
3904
  if ($nItems == 1000) {
3895
3905
  my ($tg,$ns) = GetXMPTagID($propList);
3896
3906
  if ($isWriting) {
3897
- $et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3907
+ $et->Warn("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3898
3908
  } elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
3899
- $et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3909
+ $et->Warn("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3900
3910
  last;
3901
3911
  }
3902
3912
  }
@@ -3996,12 +4006,12 @@ sub ParseXMPElement($$$;$$$$)
3996
4006
  } elsif ($$et{XmpAbout} ne $attrs{$shortName}) {
3997
4007
  if ($isWriting) {
3998
4008
  my $str = "Different 'rdf:about' attributes not handled";
3999
- unless ($$et{WARNED_ONCE}{$str}) {
4009
+ unless ($$et{WAS_WARNED}{$str}) {
4000
4010
  $et->Error($str, 1);
4001
- $$et{WARNED_ONCE}{$str} = 1;
4011
+ $$et{WAS_WARNED}{$str} = 1;
4002
4012
  }
4003
4013
  } elsif ($$et{XmpValidate}) {
4004
- $et->WarnOnce("Different 'rdf:about' attributes");
4014
+ $et->Warn("Different 'rdf:about' attributes");
4005
4015
  }
4006
4016
  }
4007
4017
  }
@@ -2250,6 +2250,44 @@ my %sACDSeeRegionStruct = (
2250
2250
  Gamma => { Writable => 'real', List => 'Seq', Avoid => 1 },
2251
2251
  );
2252
2252
 
2253
+ %Image::ExifTool::XMP::HDRGainMap = (
2254
+ %xmpTableDefaults,
2255
+ GROUPS => { 1 => 'XMP-HDRGainMap', 2 => 'Unknown' },
2256
+ NAMESPACE => 'HDRGainMap',
2257
+ NOTES => 'Used in Apple HDR GainMap images.',
2258
+ HDRGainMapVersion => {
2259
+ PrintConv => 'IsInt($val) ? join(".",unpack("C*", pack "N", $val)) : $val',
2260
+ PrintConvInv => q{
2261
+ return $val unless $val =~ /^\d+\.\d+\.\d+\.\d+$/;
2262
+ return unpack('N', pack('C*', split /\./, $val));
2263
+ },
2264
+ },
2265
+ );
2266
+
2267
+ %Image::ExifTool::XMP::apdi = (
2268
+ %xmpTableDefaults,
2269
+ GROUPS => { 1 => 'XMP-apdi', 2 => 'Image' },
2270
+ NAMESPACE => 'apdi',
2271
+ NOTES => 'Used in Apple HDR GainMap images.',
2272
+ NativeFormat => {
2273
+ PrintConv => q{
2274
+ return $val unless IsInt($val);
2275
+ my $tmp = pack("N", $val);
2276
+ $tmp =~ /^\w{4}$/ ? $tmp : $val;
2277
+ },
2278
+ PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
2279
+ },
2280
+ AuxiliaryImageType => { },
2281
+ StoredFormat => {
2282
+ PrintConv => q{
2283
+ return $val unless IsInt($val);
2284
+ my $tmp = pack("N", $val);
2285
+ $tmp =~ /^\w{4}$/ ? $tmp : $val;
2286
+ },
2287
+ PrintConvInv => '$val =~ /^\w{4}$/ ? unpack("N", $val) : $val',
2288
+ },
2289
+ );
2290
+
2253
2291
  # SVG namespace properties (ref 9)
2254
2292
  %Image::ExifTool::XMP::SVG = (
2255
2293
  GROUPS => { 0 => 'SVG', 1 => 'SVG', 2 => 'Image' },
@@ -330,7 +330,7 @@ sub ProcessRAR($$)
330
330
  $et->Warn('Large block encountered. Aborting.');
331
331
  last;
332
332
  } elsif ($et->Options('LargeFileSupport') eq '2') {
333
- $et->WarnOnce('Processing large block (LargeFileSupport is 2)');
333
+ $et->Warn('Processing large block (LargeFileSupport is 2)');
334
334
  }
335
335
  }
336
336
  # process the block