exiftool_vendored 12.35.0 → 12.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +59 -4
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -45
  7. data/bin/exiftool +79 -59
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  11. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  12. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  13. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  14. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  15. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  16. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  17. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  18. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  19. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +10 -4
  23. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  24. data/bin/lib/Image/ExifTool/Canon.pm +143 -10
  25. data/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
  26. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  28. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  29. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  31. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  34. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DarwinCore.pm +3 -3
  37. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  38. data/bin/lib/Image/ExifTool/EXE.pm +1 -1
  39. data/bin/lib/Image/ExifTool/Exif.pm +22 -2
  40. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  41. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIR.pm +16 -4
  44. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  46. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  47. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  48. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  50. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GIF.pm +6 -2
  52. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GPS.pm +15 -11
  54. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  55. data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  56. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  57. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  58. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  59. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  60. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  61. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  62. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  63. data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  64. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  66. data/bin/lib/Image/ExifTool/Import.pm +1 -1
  67. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  68. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  69. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  70. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  71. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  72. data/bin/lib/Image/ExifTool/Jpeg2000.pm +4 -1
  73. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  74. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  75. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  76. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  77. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  79. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  81. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  96. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  97. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  98. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  99. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  100. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  101. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  102. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  103. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  104. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  106. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  110. data/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  111. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  112. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  114. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  115. data/bin/lib/Image/ExifTool/Nikon.pm +1870 -83
  116. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  117. data/bin/lib/Image/ExifTool/NikonCustom.pm +523 -6
  118. data/bin/lib/Image/ExifTool/NikonSettings.pm +150 -87
  119. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  120. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  121. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  123. data/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
  124. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  125. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  126. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  127. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  128. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  129. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  130. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  131. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  132. data/bin/lib/Image/ExifTool/PNG.pm +29 -8
  133. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  135. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  136. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  138. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  139. data/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  140. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  144. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  145. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  147. data/bin/lib/Image/ExifTool/QuickTime.pm +4 -3
  148. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
  149. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  150. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  151. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  152. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  153. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  155. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  156. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  158. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  159. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  160. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  161. data/bin/lib/Image/ExifTool/Shift.pl +3 -1
  162. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  164. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  166. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  168. data/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  169. data/bin/lib/Image/ExifTool/TagLookup.pm +6496 -5895
  170. data/bin/lib/Image/ExifTool/TagNames.pod +1507 -43
  171. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  172. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  175. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  176. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  177. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  178. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  179. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  180. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  181. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  182. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  183. data/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  184. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  185. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  186. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +2 -1
  187. data/bin/lib/Image/ExifTool/WriteXMP.pl +11 -12
  188. data/bin/lib/Image/ExifTool/Writer.pl +12 -8
  189. data/bin/lib/Image/ExifTool/XMP.pm +149 -45
  190. data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
  191. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  192. data/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  193. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  194. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  195. data/bin/lib/Image/ExifTool.pm +24 -10
  196. data/bin/lib/Image/ExifTool.pod +64 -63
  197. data/bin/perl-Image-ExifTool.spec +43 -43
  198. data/lib/exiftool_vendored/version.rb +1 -1
  199. metadata +2 -2
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.47';
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' },
@@ -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)
@@ -2363,6 +2452,7 @@ my %sPantryItem = (
2363
2452
  NOTES => 'Adobe Lightroom "lr" namespace tags.',
2364
2453
  privateRTKInfo => { },
2365
2454
  hierarchicalSubject => { List => 'Bag' },
2455
+ weightedFlatSubject => { List => 'Bag' },
2366
2456
  );
2367
2457
 
2368
2458
  # Adobe Album namespace properties (album) (ref PH)
@@ -3363,26 +3453,6 @@ NoLoop:
3363
3453
  my $key = $et->FoundTag($tagInfo, $val) or return 0;
3364
3454
  # save original components of rational numbers (used when copying)
3365
3455
  $$et{RATIONAL}{$key} = $rational if defined $rational;
3366
- # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
3367
- if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
3368
- my $subdir = $$tagInfo{SubDirectory};
3369
- my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
3370
- # process subdirectory information
3371
- my %dirInfo = (
3372
- DirName => $$subdir{DirName} || $$tagInfo{Name},
3373
- DataPt => $dataPt,
3374
- DirLen => length $$dataPt,
3375
- IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3376
- );
3377
- my $oldOrder = GetByteOrder();
3378
- SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
3379
- my $oldNS = $$et{definedNS};
3380
- delete $$et{definedNS};
3381
- my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
3382
- $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
3383
- SetByteOrder($oldOrder);
3384
- $$et{definedNS} = $oldNS;
3385
- }
3386
3456
  # save structure/list information if necessary
3387
3457
  if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
3388
3458
  not $$et{NO_STRUCT})
@@ -3413,6 +3483,29 @@ NoLoop:
3413
3483
  my $tagID = join('/',@$props);
3414
3484
  $et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
3415
3485
  }
3486
+ # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
3487
+ if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
3488
+ my $subdir = $$tagInfo{SubDirectory};
3489
+ my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
3490
+ # decode if necessary (eg. Nikon XMP-ast:XMLPackets)
3491
+ $dataPt = DecodeBase64($$dataPt) if $$tagInfo{Encoding} and $$tagInfo{Encoding} eq 'Base64';
3492
+ # process subdirectory information
3493
+ my %dirInfo = (
3494
+ DirName => $$subdir{DirName} || $$tagInfo{Name},
3495
+ DataPt => $dataPt,
3496
+ DirLen => length $$dataPt,
3497
+ IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties)
3498
+ IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3499
+ );
3500
+ my $oldOrder = GetByteOrder();
3501
+ SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
3502
+ my $oldNS = $$et{definedNS};
3503
+ delete $$et{definedNS};
3504
+ my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
3505
+ $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
3506
+ SetByteOrder($oldOrder);
3507
+ $$et{definedNS} = $oldNS;
3508
+ }
3416
3509
  return 1;
3417
3510
  }
3418
3511
 
@@ -3505,6 +3598,17 @@ sub ParseXMPElement($$$;$$$$)
3505
3598
  }
3506
3599
  $start = pos($$dataPt); # start from here the next time around
3507
3600
 
3601
+ # ignore specified XMP namespaces/properties
3602
+ if ($$et{EXCL_XMP_LOOKUP} and not $isWriting and $prop =~ /^(.+):(.*)/) {
3603
+ my ($ns, $nm) = (lc($stdXlatNS{$1} || $1), lc($2));
3604
+ if ($$et{EXCL_XMP_LOOKUP}{"xmp-$ns:all"} or $$et{EXCL_XMP_LOOKUP}{"xmp-$ns:$nm"} or
3605
+ $$et{EXCL_XMP_LOOKUP}{"xmp-all:$nm"})
3606
+ {
3607
+ ++$count; # (pretend we found something so we don't store as a tag value)
3608
+ next;
3609
+ }
3610
+ }
3611
+
3508
3612
  # extract property attributes
3509
3613
  my ($parseResource, %attrs, @attrs);
3510
3614
  while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) {
@@ -3602,9 +3706,9 @@ sub ParseXMPElement($$$;$$$$)
3602
3706
  if ($nItems == 1000) {
3603
3707
  my ($tg,$ns) = GetXMPTagID($propList);
3604
3708
  if ($isWriting) {
3605
- $et->Warn("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3709
+ $et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1);
3606
3710
  } elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
3607
- $et->Warn("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3711
+ $et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
3608
3712
  last;
3609
3713
  }
3610
3714
  }
@@ -4261,7 +4365,7 @@ information.
4261
4365
 
4262
4366
  =head1 AUTHOR
4263
4367
 
4264
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
4368
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
4265
4369
 
4266
4370
  This library is free software; you can redistribute it and/or modify it
4267
4371
  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,7 +531,7 @@ 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' },
@@ -2125,7 +2126,7 @@ This file contains definitions for less common XMP namespaces.
2125
2126
 
2126
2127
  =head1 AUTHOR
2127
2128
 
2128
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2129
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2129
2130
 
2130
2131
  This library is free software; you can redistribute it and/or modify it
2131
2132
  under the same terms as Perl itself.
@@ -855,7 +855,7 @@ information.
855
855
 
856
856
  =head1 AUTHOR
857
857
 
858
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
858
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
859
859
 
860
860
  This library is free software; you can redistribute it and/or modify it
861
861
  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.
@@ -8,7 +8,7 @@
8
8
  # Revisions: Nov. 12/2003 - P. Harvey Created
9
9
  # (See html/history.html for revision history)
10
10
  #
11
- # Legal: Copyright (c) 2003-2021, Phil Harvey (philharvey66 at gmail.com)
11
+ # Legal: Copyright (c) 2003-2022, Phil Harvey (philharvey66 at gmail.com)
12
12
  # This library is free software; you can redistribute it and/or
13
13
  # modify it under the same terms as Perl itself.
14
14
  #------------------------------------------------------------------------------
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars);
31
31
 
32
- $VERSION = '12.35';
32
+ $VERSION = '12.39';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -406,6 +406,8 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
406
406
  # NDPI => ['TIFF', 'Hamamatsu NanoZoomer Digital Pathology Image'],
407
407
  NEF => ['TIFF', 'Nikon (RAW) Electronic Format'],
408
408
  NEWER => 'COS',
409
+ NKSC => ['XMP', 'Nikon Sidecar'],
410
+
409
411
  NMBTEMPLATE => ['ZIP','Apple Numbers Template'],
410
412
  NRW => ['TIFF', 'Nikon RAW (2)'],
411
413
  NUMBERS => ['ZIP','Apple Numbers spreadsheet'],
@@ -691,6 +693,7 @@ my %fileDescription = (
691
693
  MRW => 'image/x-minolta-mrw',
692
694
  MXF => 'application/mxf',
693
695
  NEF => 'image/x-nikon-nef',
696
+ NKSC => 'application/x-nikon-nxstudio',
694
697
  NRW => 'image/x-nikon-nrw',
695
698
  NUMBERS => 'application/x-iwork-numbers-sffnumbers',
696
699
  ODB => 'application/vnd.oasis.opendocument.database',
@@ -1211,10 +1214,10 @@ my %systemTagsNotes = (
1211
1214
  ZoneIdentifier => {
1212
1215
  Groups => { 1 => 'System', 2 => 'Other' },
1213
1216
  Notes => q{
1214
- Windows only. Used to indicate that a file has a Zone.Identifier alternate
1215
- data stream, which is used by some Windows browsers to mark downloaded files
1216
- as possibly unsafe to run. May be deleted to remove this stream. Requires
1217
- Win32API::File
1217
+ Windows only. Existence indicates that the file has a Zone.Identifier
1218
+ alternate data stream, which is used by some Windows browsers to mark
1219
+ downloaded files as possibly unsafe to run. May be deleted to remove this
1220
+ stream. Requires Win32API::File
1218
1221
  },
1219
1222
  Writable => 1,
1220
1223
  WritePseudo => 1,
@@ -4088,8 +4091,9 @@ sub Open($*$;$)
4088
4091
  my ($self, $fh, $file, $mode) = @_;
4089
4092
 
4090
4093
  $file =~ s/^([\s&])/.\/$1/; # protect leading whitespace or ampersand
4091
- # default to read mode ('<') unless input is a pipe
4092
- $mode = ($file =~ /\|$/ ? '' : '<') unless $mode;
4094
+ # default to read mode ('<') unless input is a trusted pipe
4095
+ $mode = (($file =~ /\|$/ and $$self{TRUST_PIPE}) ? '' : '<') unless $mode;
4096
+ delete $$self{TRUST_PIPE};
4093
4097
  if ($mode) {
4094
4098
  if ($self->EncodeFileName($file)) {
4095
4099
  # handle Windows Unicode file name
@@ -4252,6 +4256,7 @@ sub ParseArguments($;@)
4252
4256
  $$self{REQ_TAG_LOOKUP} = { };
4253
4257
  $$self{EXCL_TAG_LOOKUP} = { };
4254
4258
  $$self{IO_TAG_LIST} = undef;
4259
+ delete $$self{EXCL_XMP_LOOKUP};
4255
4260
 
4256
4261
  # handle our input arguments
4257
4262
  while (@_) {
@@ -4335,7 +4340,11 @@ sub ParseArguments($;@)
4335
4340
  # generate lookup for excluded tags
4336
4341
  if ($$options{Exclude}) {
4337
4342
  foreach (@{$$options{Exclude}}) {
4338
- /([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc($1)} = 1;
4343
+ /([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc $1} = 1;
4344
+ if (/(xmp-.*:[-\w]+)#?/i) {
4345
+ $$self{EXCL_XMP_LOOKUP} or $$self{EXCL_XMP_LOOKUP} = { };
4346
+ $$self{EXCL_XMP_LOOKUP}{lc $1} = 1;
4347
+ }
4339
4348
  }
4340
4349
  # exclude list is used only for EXCL_TAG_LOOKUP when TAGS_FROM_FILE is set
4341
4350
  undef $$options{Exclude} if $$self{TAGS_FROM_FILE};
@@ -6023,6 +6032,8 @@ sub IdentifyTrailer($;$)
6023
6032
  $type = 'Samsung';
6024
6033
  } elsif ($buff =~ /8db42d694ccc418790edff439fe026bf$/s) {
6025
6034
  $type = 'Insta360';
6035
+ } elsif ($buff =~ m(\0{6}/NIKON APP$)) {
6036
+ $type = 'NikonApp';
6026
6037
  }
6027
6038
  last;
6028
6039
  }
@@ -6058,6 +6069,9 @@ sub ProcessTrailers($$)
6058
6069
  if ($dirName eq 'Insta360') {
6059
6070
  require 'Image/ExifTool/QuickTimeStream.pl';
6060
6071
  $proc = 'Image::ExifTool::QuickTime::ProcessInsta360';
6072
+ } elsif ($dirName eq 'NikonApp') {
6073
+ require Image::ExifTool::Nikon;
6074
+ $proc = 'Image::ExifTool::Nikon::ProcessNikonApp';
6061
6075
  } else {
6062
6076
  require "Image/ExifTool/$dirName.pm";
6063
6077
  $proc = "Image::ExifTool::${dirName}::Process$dirName";
@@ -6309,7 +6323,7 @@ sub ProcessJPEG($$)
6309
6323
  my $markerName = JpegMarkerName($marker);
6310
6324
  $$path[$pn] = $markerName;
6311
6325
  # issue warning if we skipped some garbage
6312
- if ($skipped and not $foundSOS) {
6326
+ if ($skipped and not $foundSOS and $markerName ne 'SOS') {
6313
6327
  $self->Warn("Skipped unknown $skipped bytes after JPEG $markerName segment", 1);
6314
6328
  if ($htmlDump) {
6315
6329
  $self->HDump($nextSegPos-4-$skipped, $skipped, "[unknown $skipped bytes]", undef, 0x08);