exiftool-vendored.pl 12.33.0 → 12.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/LICENSE +10 -3
  2. package/bin/Changes +116 -0
  3. package/bin/MANIFEST +2 -0
  4. package/bin/META.json +1 -1
  5. package/bin/META.yml +1 -1
  6. package/bin/README +45 -45
  7. package/bin/config_files/acdsee.config +6 -6
  8. package/bin/config_files/photoshop_paths.config +30 -7
  9. package/bin/config_files/picasa_faces.config +1 -1
  10. package/bin/config_files/pix4d.config +2 -2
  11. package/bin/config_files/tiff_version.config +2 -2
  12. package/bin/exiftool +112 -82
  13. package/bin/lib/File/RandomAccess.pm +1 -1
  14. package/bin/lib/File/RandomAccess.pod +2 -2
  15. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  16. package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  17. package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  18. package/bin/lib/Image/ExifTool/APE.pm +1 -1
  19. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  20. package/bin/lib/Image/ExifTool/ASF.pm +1 -1
  21. package/bin/lib/Image/ExifTool/Apple.pm +1 -1
  22. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  26. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  27. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +15 -4
  28. package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  29. package/bin/lib/Image/ExifTool/Canon.pm +225 -13
  30. package/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
  31. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  32. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  33. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  34. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  35. package/bin/lib/Image/ExifTool/Charset.pm +3 -1
  36. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DJI.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  41. package/bin/lib/Image/ExifTool/DarwinCore.pm +3 -3
  42. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  43. package/bin/lib/Image/ExifTool/EXE.pm +1 -1
  44. package/bin/lib/Image/ExifTool/Exif.pm +64 -20
  45. package/bin/lib/Image/ExifTool/FITS.pm +1 -1
  46. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  47. package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  48. package/bin/lib/Image/ExifTool/FLIR.pm +48 -11
  49. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  50. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  51. package/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  52. package/bin/lib/Image/ExifTool/Font.pm +1 -1
  53. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  54. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  55. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GIF.pm +6 -2
  57. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  58. package/bin/lib/Image/ExifTool/GPS.pm +15 -11
  59. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  60. package/bin/lib/Image/ExifTool/Geotag.pm +4 -3
  61. package/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  62. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  63. package/bin/lib/Image/ExifTool/HP.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  65. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  66. package/bin/lib/Image/ExifTool/ICC_Profile.pm +97 -5
  67. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  68. package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  70. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  71. package/bin/lib/Image/ExifTool/Import.pm +1 -1
  72. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  73. package/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  74. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  75. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  77. package/bin/lib/Image/ExifTool/Jpeg2000.pm +109 -12
  78. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  79. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  80. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  81. package/bin/lib/Image/ExifTool/LNK.pm +1 -1
  82. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  83. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  84. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  85. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  101. package/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  102. package/bin/lib/Image/ExifTool/MIE.pm +1 -1
  103. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  104. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  105. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  106. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  107. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  108. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  109. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MXF.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  115. package/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  116. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  117. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  119. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  120. package/bin/lib/Image/ExifTool/Nikon.pm +1918 -72
  121. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  122. package/bin/lib/Image/ExifTool/NikonCustom.pm +523 -6
  123. package/bin/lib/Image/ExifTool/NikonSettings.pm +150 -87
  124. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  125. package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  127. package/bin/lib/Image/ExifTool/Olympus.pm +7 -7
  128. package/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
  129. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  131. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  132. package/bin/lib/Image/ExifTool/PDF.pm +6 -4
  133. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  134. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  135. package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  136. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PNG.pm +29 -8
  138. package/bin/lib/Image/ExifTool/PPM.pm +1 -1
  139. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  140. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  141. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  142. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  143. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  144. package/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  145. package/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  146. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  147. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  148. package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  149. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  150. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  151. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  152. package/bin/lib/Image/ExifTool/QuickTime.pm +25 -7
  153. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
  154. package/bin/lib/Image/ExifTool/README +4 -0
  155. package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  156. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  157. package/bin/lib/Image/ExifTool/RTF.pm +1 -1
  158. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  159. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  160. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  161. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  162. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  163. package/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  164. package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
  165. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Shift.pl +3 -1
  168. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  170. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  171. package/bin/lib/Image/ExifTool/Sony.pm +34 -12
  172. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  174. package/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  175. package/bin/lib/Image/ExifTool/TagLookup.pm +6581 -5893
  176. package/bin/lib/Image/ExifTool/TagNames.pod +1641 -59
  177. package/bin/lib/Image/ExifTool/Text.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  179. package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  181. package/bin/lib/Image/ExifTool/VCard.pm +1 -1
  182. package/bin/lib/Image/ExifTool/Validate.pm +1 -1
  183. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  184. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  185. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  186. package/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  187. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  188. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  189. package/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  190. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  191. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  192. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +19 -4
  193. package/bin/lib/Image/ExifTool/WriteXMP.pl +13 -12
  194. package/bin/lib/Image/ExifTool/Writer.pl +56 -10
  195. package/bin/lib/Image/ExifTool/XMP.pm +169 -54
  196. package/bin/lib/Image/ExifTool/XMP2.pl +6 -4
  197. package/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
  198. package/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  199. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  200. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  201. package/bin/lib/Image/ExifTool.pm +93 -13
  202. package/bin/lib/Image/ExifTool.pod +80 -70
  203. package/bin/perl-Image-ExifTool.spec +43 -43
  204. package/bin/pp_build_exe.args +5 -5
  205. package/package.json +3 -3
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.46';
53
+ $VERSION = '3.51';
54
54
  @ISA = qw(Exporter);
55
55
  @EXPORT_OK = qw(EscapeXML UnescapeXML);
56
56
 
@@ -192,6 +192,9 @@ my %xmpNS = (
192
192
  GettyImagesGIFT => 'http://xmp.gettyimages.com/gift/1.0/',
193
193
  LImage => 'http://ns.leiainc.com/photos/1.0/image/',
194
194
  Profile => 'http://ns.google.com/photos/dd/1.0/profile/',
195
+ sdc => 'http://ns.nikon.com/sdc/1.0/',
196
+ ast => 'http://ns.nikon.com/asteroid/1.0/',
197
+ nine => 'http://ns.nikon.com/nine/1.0/',
195
198
  );
196
199
 
197
200
  # build reverse namespace lookup
@@ -436,9 +439,38 @@ my %sOECF = (
436
439
  Names => { List => 'Seq' },
437
440
  Values => { List => 'Seq', Writable => 'rational' },
438
441
  );
439
-
442
+ my %sAreaModels = (
443
+ STRUCT_NAME => 'AreaModels',
444
+ NAMESPACE => 'crs',
445
+ ColorRangeMaskAreaSampleInfo => { FlatName => 'ColorSampleInfo' },
446
+ AreaComponents => { FlatName => 'Components', List => 'Seq' },
447
+ );
448
+ my %sCorrRangeMask = (
449
+ STRUCT_NAME => 'CorrRangeMask',
450
+ NAMESPACE => 'crs',
451
+ NOTES => 'Called CorrectionRangeMask by the spec.',
452
+ Version => { },
453
+ Type => { },
454
+ ColorAmount => { Writable => 'real' },
455
+ LumMin => { Writable => 'real' },
456
+ LumMax => { Writable => 'real' },
457
+ LumFeather => { Writable => 'real' },
458
+ DepthMin => { Writable => 'real' },
459
+ DepthMax => { Writable => 'real' },
460
+ DepthFeather=> { Writable => 'real' },
461
+ # new in LR 11.0
462
+ Invert => { Writable => 'boolean' },
463
+ SampleType => { Writable => 'integer' },
464
+ AreaModels => {
465
+ List => 'Seq',
466
+ Struct => \%sAreaModels,
467
+ },
468
+ LumRange => { },
469
+ LuminanceDepthSampleInfo => { },
470
+ );
440
471
  # new LR2 crs structures (PH)
441
- my %sCorrectionMask = (
472
+ my %sCorrectionMask;
473
+ %sCorrectionMask = (
442
474
  STRUCT_NAME => 'CorrectionMask',
443
475
  NAMESPACE => 'crs',
444
476
  # disable List behaviour of flattened Gradient/PaintBasedCorrections
@@ -473,19 +505,26 @@ my %sCorrectionMask = (
473
505
  Alpha => { Writable => 'real', List => 0 },
474
506
  CenterValue => { Writable => 'real', List => 0 },
475
507
  PerimeterValue=>{ Writable => 'real', List => 0 },
476
- );
477
- my %sCorrectionRangeMask = (
478
- STRUCT_NAME => 'CorrectionRangeMask',
479
- NAMESPACE => 'crs',
480
- Version => { },
481
- Type => { },
482
- ColorAmount => { Writable => 'real' },
483
- LumMin => { Writable => 'real' },
484
- LumMax => { Writable => 'real' },
485
- LumFeather => { Writable => 'real' },
486
- DepthMin => { Writable => 'real' },
487
- DepthMax => { Writable => 'real' },
488
- DepthFeather=> { Writable => 'real' },
508
+ # new in LR 11.0 MaskGroupBasedCorrections
509
+ MaskActive => { Writable => 'boolean', List => 0 },
510
+ MaskName => { List => 0 },
511
+ MaskBlendMode=> { Writable => 'integer', List => 0 },
512
+ MaskInverted => { Writable => 'boolean', List => 0 },
513
+ MaskSyncID => { List => 0 },
514
+ MaskVersion => { List => 0 },
515
+ MaskSubType => { List => 0 },
516
+ ReferencePoint => { List => 0 },
517
+ InputDigest => { List => 0 },
518
+ MaskDigest => { List => 0 },
519
+ WholeImageArea => { List => 0 },
520
+ Origin => { List => 0 },
521
+ Masks => { Struct => \%sCorrectionMask, NoSubStruct => 1 },
522
+ CorrectionRangeMask => {
523
+ Name => 'CorrRangeMask',
524
+ Notes => 'called CorrectionRangeMask by the spec',
525
+ FlatName => 'Range',
526
+ Struct => \%sCorrRangeMask,
527
+ },
489
528
  );
490
529
  my %sCorrection = (
491
530
  STRUCT_NAME => 'Correction',
@@ -499,8 +538,8 @@ my %sCorrection = (
499
538
  LocalClarity => { FlatName => 'Clarity', Writable => 'real', List => 0 },
500
539
  LocalSharpness => { FlatName => 'Sharpness', Writable => 'real', List => 0 },
501
540
  LocalBrightness => { FlatName => 'Brightness', Writable => 'real', List => 0 },
502
- LocalToningHue => { FlatName => 'Hue', Writable => 'real', List => 0 },
503
- LocalToningSaturation => { FlatName => 'Saturation', Writable => 'real', List => 0 },
541
+ LocalToningHue => { FlatName => 'ToningHue', Writable => 'real', List => 0 },
542
+ LocalToningSaturation => { FlatName => 'ToningSaturation', Writable => 'real', List => 0 },
504
543
  LocalExposure2012 => { FlatName => 'Exposure2012', Writable => 'real', List => 0 },
505
544
  LocalContrast2012 => { FlatName => 'Contrast2012', Writable => 'real', List => 0 },
506
545
  LocalHighlights2012 => { FlatName => 'Highlights2012', Writable => 'real', List => 0 },
@@ -516,15 +555,20 @@ my %sCorrection = (
516
555
  LocalBlacks2012 => { FlatName => 'Blacks2012', Writable => 'real', List => 0 },
517
556
  LocalDehaze => { FlatName => 'Dehaze', Writable => 'real', List => 0 },
518
557
  LocalTexture => { FlatName => 'Texture', Writable => 'real', List => 0 },
558
+ # new in LR 11.0
519
559
  CorrectionRangeMask => {
560
+ Name => 'CorrRangeMask',
561
+ Notes => 'called CorrectionRangeMask by the spec',
520
562
  FlatName => 'RangeMask',
521
- Struct => \%sCorrectionRangeMask,
563
+ Struct => \%sCorrRangeMask,
522
564
  },
523
565
  CorrectionMasks => {
524
566
  FlatName => 'Mask',
525
567
  Struct => \%sCorrectionMask,
526
568
  List => 'Seq',
527
569
  },
570
+ CorrectionName => { },
571
+ CorrectionSyncID => { },
528
572
  );
529
573
  my %sRetouchArea = (
530
574
  STRUCT_NAME => 'RetouchArea',
@@ -543,6 +587,30 @@ my %sRetouchArea = (
543
587
  List => 'Seq',
544
588
  },
545
589
  );
590
+ my %sMapInfo = (
591
+ STRUCT_NAME => 'MapInfo',
592
+ NAMESPACE => 'crs',
593
+ NOTES => q{
594
+ Called RangeMaskMapInfo by the specification, the same as the containing
595
+ structure.
596
+ },
597
+ RGBMin => { },
598
+ RGBMax => { },
599
+ LabMin => { },
600
+ LabMax => { },
601
+ LumEq => { List => 'Seq' },
602
+ );
603
+ my %sRangeMask = (
604
+ STRUCT_NAME => 'RangeMask',
605
+ NAMESPACE => 'crs',
606
+ NOTES => q{
607
+ This structure is actually called RangeMaskMapInfo, but it only contains one
608
+ element which is a RangeMaskMapInfo structure (Yes, really!). So these are
609
+ renamed to RangeMask and MapInfo respectively to avoid confusion and
610
+ redundancy in the tag names.
611
+ },
612
+ RangeMaskMapInfo => { FlatName => 'MapInfo', Struct => \%sMapInfo },
613
+ );
546
614
 
547
615
  # main XMP tag table (tag ID's are used for the family 1 group names)
548
616
  %Image::ExifTool::XMP::Main = (
@@ -813,6 +881,18 @@ my %sRetouchArea = (
813
881
  Name => 'Device',
814
882
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::Device' },
815
883
  },
884
+ sdc => {
885
+ Name => 'sdc',
886
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::sdc' },
887
+ },
888
+ ast => {
889
+ Name => 'ast',
890
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ast' },
891
+ },
892
+ nine => {
893
+ Name => 'nine',
894
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::nine' },
895
+ },
816
896
  );
817
897
 
818
898
  # hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
@@ -1581,6 +1661,14 @@ my %sPantryItem = (
1581
1661
  AutoToneDigestNoSat => { },
1582
1662
  ToggleStyleDigest => { },
1583
1663
  ToggleStyleAmount => { Writable => 'integer' },
1664
+ # new for LightRoom 11.0
1665
+ CompatibleVersion => { },
1666
+ MaskGroupBasedCorrections => {
1667
+ FlatName => 'MaskGroupBasedCorr',
1668
+ Struct => \%sCorrection,
1669
+ List => 'Seq',
1670
+ },
1671
+ RangeMaskMapInfo => { Name => 'RangeMask', Struct => \%sRangeMask, FlatName => 'RangeMask' },
1584
1672
  );
1585
1673
 
1586
1674
  # Tiff namespace properties (tiff)
@@ -1672,7 +1760,7 @@ my %sPantryItem = (
1672
1760
  Software => { },
1673
1761
  Artist => { Groups => { 2 => 'Author' } },
1674
1762
  Copyright => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' },
1675
- NativeDigest => { }, #PH
1763
+ NativeDigest => { Avoid => 1 }, #PH
1676
1764
  );
1677
1765
 
1678
1766
  # Exif namespace properties (exif)
@@ -2061,8 +2149,8 @@ my %sPantryItem = (
2061
2149
  Groups => { 2 => 'Location' },
2062
2150
  Writable => 'integer',
2063
2151
  PrintConv => {
2064
- 2 => '2-Dimensional',
2065
- 3 => '3-Dimensional',
2152
+ 2 => '2-Dimensional Measurement',
2153
+ 3 => '3-Dimensional Measurement',
2066
2154
  },
2067
2155
  },
2068
2156
  GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' },
@@ -2142,8 +2230,8 @@ my %sPantryItem = (
2142
2230
  NAMESPACE => 'exifEX',
2143
2231
  PRIORITY => 0, # not as reliable as actual EXIF tags
2144
2232
  NOTES => q{
2145
- EXIF tags added by the EXIF 2.31 for XMP specification (see
2146
- L<http://www.cipa.jp/std/documents/e/DC-X010-2017.pdf>).
2233
+ EXIF tags added by the EXIF 2.32 for XMP specification (see
2234
+ L<https://cipa.jp/std/documents/download_e.html?DC-010-2020_E>).
2147
2235
  },
2148
2236
  Gamma => { Writable => 'rational' },
2149
2237
  PhotographicSensitivity => { Writable => 'integer' },
@@ -2307,6 +2395,7 @@ my %sPantryItem = (
2307
2395
  VignetteCorrectionAlreadyApplied => { Writable => 'boolean' },
2308
2396
  LateralChromaticAberrationCorrectionAlreadyApplied => { Writable => 'boolean' },
2309
2397
  LensDistortInfo => { }, # (LR 7.5.1, 4 signed rational values)
2398
+ NeutralDensityFactor => { }, # (LR 11.0 - rational value, but denominator seems significant)
2310
2399
  );
2311
2400
 
2312
2401
  # IPTC Core namespace properties (Iptc4xmpCore) (ref 4)
@@ -2349,8 +2438,9 @@ my %sPantryItem = (
2349
2438
  Scene => { Groups => { 2 => 'Other' }, List => 'Bag' },
2350
2439
  SubjectCode => { Groups => { 2 => 'Other' }, List => 'Bag' },
2351
2440
  # Copyright - have seen this in a sample (Jan 2021), but I think it is non-standard
2352
- AltTextAccessibility =>{ Groups => { 2 => 'Other' }, Writable => 'lang-alt' }, # added 2021-10-13
2353
- ExtDescrAccessibility=>{ Groups => { 2 => 'Other' }, Writable => 'lang-alt' }, # added 2021-10-13
2441
+ # new IPTC Core 1.3 properties
2442
+ AltTextAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' },
2443
+ ExtDescrAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' },
2354
2444
  );
2355
2445
 
2356
2446
  # Adobe Lightroom namespace properties (lr) (ref PH)
@@ -2362,6 +2452,7 @@ my %sPantryItem = (
2362
2452
  NOTES => 'Adobe Lightroom "lr" namespace tags.',
2363
2453
  privateRTKInfo => { },
2364
2454
  hierarchicalSubject => { List => 'Bag' },
2455
+ weightedFlatSubject => { List => 'Bag' },
2365
2456
  );
2366
2457
 
2367
2458
  # Adobe Album namespace properties (album) (ref PH)
@@ -3308,6 +3399,10 @@ NoLoop:
3308
3399
  }
3309
3400
  # save property list for verbose "adding" message unless this tag already exists
3310
3401
  $added = \@tagList unless $$tagTablePtr{$tagID};
3402
+ # if this is an empty structure, we must add a Struct field
3403
+ if (not length $val and $$attrs{'rdf:parseType'} and $$attrs{'rdf:parseType'} eq 'Resource') {
3404
+ $$tagInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' };
3405
+ }
3311
3406
  AddTagToTable($tagTablePtr, $tagID, $tagInfo);
3312
3407
  last;
3313
3408
  }
@@ -3362,26 +3457,6 @@ NoLoop:
3362
3457
  my $key = $et->FoundTag($tagInfo, $val) or return 0;
3363
3458
  # save original components of rational numbers (used when copying)
3364
3459
  $$et{RATIONAL}{$key} = $rational if defined $rational;
3365
- # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
3366
- if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
3367
- my $subdir = $$tagInfo{SubDirectory};
3368
- my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
3369
- # process subdirectory information
3370
- my %dirInfo = (
3371
- DirName => $$subdir{DirName} || $$tagInfo{Name},
3372
- DataPt => $dataPt,
3373
- DirLen => length $$dataPt,
3374
- IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3375
- );
3376
- my $oldOrder = GetByteOrder();
3377
- SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
3378
- my $oldNS = $$et{definedNS};
3379
- delete $$et{definedNS};
3380
- my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
3381
- $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
3382
- SetByteOrder($oldOrder);
3383
- $$et{definedNS} = $oldNS;
3384
- }
3385
3460
  # save structure/list information if necessary
3386
3461
  if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
3387
3462
  not $$et{NO_STRUCT})
@@ -3412,6 +3487,29 @@ NoLoop:
3412
3487
  my $tagID = join('/',@$props);
3413
3488
  $et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
3414
3489
  }
3490
+ # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
3491
+ if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
3492
+ my $subdir = $$tagInfo{SubDirectory};
3493
+ my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
3494
+ # decode if necessary (eg. Nikon XMP-ast:XMLPackets)
3495
+ $dataPt = DecodeBase64($$dataPt) if $$tagInfo{Encoding} and $$tagInfo{Encoding} eq 'Base64';
3496
+ # process subdirectory information
3497
+ my %dirInfo = (
3498
+ DirName => $$subdir{DirName} || $$tagInfo{Name},
3499
+ DataPt => $dataPt,
3500
+ DirLen => length $$dataPt,
3501
+ IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties)
3502
+ IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3503
+ );
3504
+ my $oldOrder = GetByteOrder();
3505
+ SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
3506
+ my $oldNS = $$et{definedNS};
3507
+ delete $$et{definedNS};
3508
+ my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
3509
+ $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
3510
+ SetByteOrder($oldOrder);
3511
+ $$et{definedNS} = $oldNS;
3512
+ }
3415
3513
  return 1;
3416
3514
  }
3417
3515
 
@@ -3504,6 +3602,17 @@ sub ParseXMPElement($$$;$$$$)
3504
3602
  }
3505
3603
  $start = pos($$dataPt); # start from here the next time around
3506
3604
 
3605
+ # ignore specified XMP namespaces/properties
3606
+ if ($$et{EXCL_XMP_LOOKUP} and not $isWriting and $prop =~ /^(.+):(.*)/) {
3607
+ my ($ns, $nm) = (lc($stdXlatNS{$1} || $1), lc($2));
3608
+ if ($$et{EXCL_XMP_LOOKUP}{"xmp-$ns:all"} or $$et{EXCL_XMP_LOOKUP}{"xmp-$ns:$nm"} or
3609
+ $$et{EXCL_XMP_LOOKUP}{"xmp-all:$nm"})
3610
+ {
3611
+ ++$count; # (pretend we found something so we don't store as a tag value)
3612
+ next;
3613
+ }
3614
+ }
3615
+
3507
3616
  # extract property attributes
3508
3617
  my ($parseResource, %attrs, @attrs);
3509
3618
  while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) {
@@ -3601,9 +3710,9 @@ sub ParseXMPElement($$$;$$$$)
3601
3710
  if ($nItems == 1000) {
3602
3711
  my ($tg,$ns) = GetXMPTagID($propList);
3603
3712
  if ($isWriting) {
3604
- $et->Warn("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3713
+ $et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3605
3714
  } elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
3606
- $et->Warn("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3715
+ $et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3607
3716
  last;
3608
3717
  }
3609
3718
  }
@@ -3625,7 +3734,11 @@ sub ParseXMPElement($$$;$$$$)
3625
3734
  } elsif ($prop eq 'rdf:Description') {
3626
3735
  # remove unnecessary rdf:Description elements since parseType='Resource'
3627
3736
  # is more efficient (also necessary to make property path consistent)
3628
- $parseResource = 1 if grep /^rdf:Description$/, @$propList;
3737
+ if (grep /^rdf:Description$/, @$propList) {
3738
+ $parseResource = 1;
3739
+ # set parseType so we know this is a structure
3740
+ $attrs{'rdf:parseType'} = 'Resource';
3741
+ }
3629
3742
  } elsif ($prop eq 'xmp:xmpmeta') {
3630
3743
  # patch MicrosoftPhoto unconformity
3631
3744
  $prop = 'x:xmpmeta';
@@ -3975,14 +4088,16 @@ sub ProcessXMP($$;$)
3975
4088
  } elsif ($buf2 =~ /<plist[\s>]/) {
3976
4089
  $type = 'PLIST';
3977
4090
  }
3978
- if ($isSVG and $$et{XMP_CAPTURE}) {
3979
- $et->Error("ExifTool does not yet support writing of SVG images");
3980
- return 0;
3981
- }
3982
4091
  }
3983
4092
  $isXML = 1;
3984
4093
  } elsif ($2 eq '<rdf:RDF') {
3985
4094
  $isRDF = 1; # recognize XMP without x:xmpmeta element
4095
+ } elsif ($2 eq '<svg') {
4096
+ $isSVG = $isXML = 1;
4097
+ }
4098
+ if ($isSVG and $$et{XMP_CAPTURE}) {
4099
+ $et->Error("ExifTool does not yet support writing of SVG images");
4100
+ return 0;
3986
4101
  }
3987
4102
  if ($buff =~ /^\0\0/) {
3988
4103
  $fmt = 'N'; # UTF-32 MM with or without BOM
@@ -4258,7 +4373,7 @@ information.
4258
4373
 
4259
4374
  =head1 AUTHOR
4260
4375
 
4261
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
4376
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
4262
4377
 
4263
4378
  This library is free software; you can redistribute it and/or modify it
4264
4379
  under the same terms as Perl itself.
@@ -16,6 +16,7 @@
16
16
  # 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
17
17
  # 12) XMPSpecificationPart3_May2013, page 58
18
18
  # 13) https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf
19
+ # 14) http://www.iptc.org/standards/photo-metadata/iptc-standard/
19
20
  #------------------------------------------------------------------------------
20
21
 
21
22
  package Image::ExifTool::XMP;
@@ -530,14 +531,14 @@ my %sImageRegion = ( # new in 1.5
530
531
  rRole => { Namespace => 'Iptc4xmpExt', FlatName => 'Role', List => 'Bag', Struct => \%sEntity },
531
532
  );
532
533
 
533
- # IPTC Extension namespace properties (Iptc4xmpExt) (ref 4)
534
+ # IPTC Extension namespace properties (Iptc4xmpExt) (ref 4, 14)
534
535
  %Image::ExifTool::XMP::iptcExt = (
535
536
  %xmpTableDefaults,
536
537
  GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' },
537
538
  NAMESPACE => 'Iptc4xmpExt',
538
539
  TABLE_DESC => 'XMP IPTC Extension',
539
540
  NOTES => q{
540
- This table contains tags defined by the IPTC Extension schema version 1.5.
541
+ This table contains tags defined by the IPTC Extension schema version 1.6.
541
542
  The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
542
543
  the family 1 group name. (see
543
544
  L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
@@ -797,7 +798,8 @@ my %sImageRegion = ( # new in 1.5
797
798
  audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
798
799
  # new IPTC Extension schema 1.5 property
799
800
  ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
800
- EventID => { List => 'Bag' }, # added 2021-10-13
801
+ # new Extension 1.6 property
802
+ EventId => { Name => 'EventID', List => 'Bag' },
801
803
  );
802
804
 
803
805
  #------------------------------------------------------------------------------
@@ -2124,7 +2126,7 @@ This file contains definitions for less common XMP namespaces.
2124
2126
 
2125
2127
  =head1 AUTHOR
2126
2128
 
2127
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2129
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2128
2130
 
2129
2131
  This library is free software; you can redistribute it and/or modify it
2130
2132
  under the same terms as Perl itself.
@@ -634,15 +634,14 @@ sub RestoreStruct($;$)
634
634
  local $_;
635
635
  my ($et, $keepFlat) = @_;
636
636
  my ($key, %structs, %var, %lists, $si, %listKeys, @siList);
637
- my $ex = $$et{TAG_EXTRA};
638
637
  my $valueHash = $$et{VALUE};
639
638
  my $fileOrder = $$et{FILE_ORDER};
640
639
  my $tagExtra = $$et{TAG_EXTRA};
641
640
  foreach $key (keys %{$$et{TAG_INFO}}) {
642
- $$ex{$key} or next;
643
- my $structProps = $$ex{$key}{Struct} or next;
644
- delete $$ex{$key}{Struct}; # (don't re-use)
645
- my $tagInfo = $$et{TAG_INFO}{$key}; # tagInfo for flattened tag
641
+ $$tagExtra{$key} or next;
642
+ my $structProps = $$tagExtra{$key}{Struct} or next;
643
+ delete $$tagExtra{$key}{Struct}; # (don't re-use)
644
+ my $tagInfo = $$et{TAG_INFO}{$key}; # tagInfo for flattened tag
646
645
  my $table = $$tagInfo{Table};
647
646
  my $prop = shift @$structProps;
648
647
  my $tag = $$prop[0];
@@ -829,8 +828,23 @@ sub RestoreStruct($;$)
829
828
  $var{$_} and push @siList, $_ foreach keys %structs;
830
829
  # save new structures in the same order they were read from file
831
830
  foreach $si (sort { $var{$a}[1] <=> $var{$b}[1] } @siList) {
832
- $key = $et->FoundTag($var{$si}[0], '');
833
- $$valueHash{$key} = $structs{$si};
831
+ # test to see if a tag for this structure has already been generated
832
+ # (this could happen only if one of the structures in a list was empty)
833
+ $key = $var{$si}[0]{Name};
834
+ my $found;
835
+ if ($$valueHash{$key}) {
836
+ my @keys = grep /^$key( \(\d+\))?$/, keys %$valueHash;
837
+ foreach $key (@keys) {
838
+ next unless $$valueHash{$key} eq $structs{$si};
839
+ $found = 1;
840
+ last;
841
+ }
842
+ }
843
+ unless ($found) {
844
+ # otherwise, generate a new tag for this structure
845
+ $key = $et->FoundTag($var{$si}[0], '');
846
+ $$valueHash{$key} = $structs{$si};
847
+ }
834
848
  $$fileOrder{$key} = $var{$si}[1];
835
849
  }
836
850
  }
@@ -855,7 +869,7 @@ information.
855
869
 
856
870
  =head1 AUTHOR
857
871
 
858
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
872
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
859
873
 
860
874
  This library is free software; you can redistribute it and/or modify it
861
875
  under the same terms as Perl itself.
@@ -19,7 +19,7 @@ use strict;
19
19
  use vars qw($VERSION $warnString);
20
20
  use Image::ExifTool qw(:DataAccess :Utils);
21
21
 
22
- $VERSION = '1.26';
22
+ $VERSION = '1.27';
23
23
 
24
24
  sub WarnProc($) { $warnString = $_[0]; }
25
25
 
@@ -125,6 +125,7 @@ my %iWorkType = (
125
125
  Name => 'ZipFileName',
126
126
  Format => 'string[$$self{ZipFileNameLength}]',
127
127
  },
128
+ _com => 'ZipFileComment',
128
129
  );
129
130
 
130
131
  # GNU ZIP tags (ref 3)
@@ -380,6 +381,8 @@ sub HandleMember($$;$)
380
381
  $et->HandleTag($tagTablePtr, 9, $member->compressedSize());
381
382
  $et->HandleTag($tagTablePtr, 11, $member->uncompressedSize());
382
383
  $et->HandleTag($tagTablePtr, 15, $member->fileName());
384
+ my $com = $member->fileComment();
385
+ $et->HandleTag($tagTablePtr, '_com', $com) if defined $com and length $com;
383
386
  }
384
387
 
385
388
  #------------------------------------------------------------------------------
@@ -448,6 +451,10 @@ sub ProcessZIP($$)
448
451
  $et->Warn("$err reading ZIP file");
449
452
  last;
450
453
  }
454
+ # extract zip file comment
455
+ my $comment = $zip->zipfileComment();
456
+ $et->FoundTag(Comment => $comment) if defined $comment and length $comment;
457
+
451
458
  $$dirInfo{ZIP} = $zip;
452
459
 
453
460
  # check for an Office Open file (DOCX, etc)
@@ -655,6 +662,7 @@ sub ProcessZIP($$)
655
662
  DataLen => 30 + $len,
656
663
  DirStart => 0,
657
664
  DirLen => 30 + $len,
665
+ MixedTags => 1, # (to ignore FileComment tag)
658
666
  );
659
667
  $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
660
668
  my $flags = Get16u(\$buff, 6);
@@ -700,7 +708,7 @@ Electronic Publication (EPUB), and Sketch design files (SKETCH).
700
708
 
701
709
  =head1 AUTHOR
702
710
 
703
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
711
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
704
712
 
705
713
  This library is free software; you can redistribute it and/or modify it
706
714
  under the same terms as Perl itself.
@@ -220,7 +220,7 @@ metadata from Zeiss Integrated Software RAW (ZISRAW) CZI files.
220
220
 
221
221
  =head1 AUTHOR
222
222
 
223
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
223
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
224
224
 
225
225
  This library is free software; you can redistribute it and/or modify it
226
226
  under the same terms as Perl itself.
@@ -215,7 +215,7 @@ information from Apple iWork '09 XML+ZIP files.
215
215
 
216
216
  =head1 AUTHOR
217
217
 
218
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
218
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
219
219
 
220
220
  This library is free software; you can redistribute it and/or modify it
221
221
  under the same terms as Perl itself.