exiftool_vendored 12.37.0 → 12.41.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +73 -0
  3. data/bin/MANIFEST +2 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -45
  7. data/bin/arg_files/exif2xmp.args +5 -0
  8. data/bin/arg_files/xmp2exif.args +6 -0
  9. data/bin/config_files/acdsee.config +6 -6
  10. data/bin/config_files/photoshop_paths.config +30 -7
  11. data/bin/config_files/picasa_faces.config +1 -1
  12. data/bin/config_files/pix4d.config +2 -2
  13. data/bin/config_files/tiff_version.config +2 -2
  14. data/bin/exiftool +100 -67
  15. data/bin/lib/File/RandomAccess.pm +1 -1
  16. data/bin/lib/File/RandomAccess.pod +2 -2
  17. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  18. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  19. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  20. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  21. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  22. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  23. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  24. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  25. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  26. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  27. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  28. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  29. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -4
  30. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  31. data/bin/lib/Image/ExifTool/Canon.pm +79 -5
  32. data/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
  33. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  34. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  35. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  36. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  37. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  38. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  39. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  40. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  41. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  42. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  43. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  44. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  45. data/bin/lib/Image/ExifTool/EXE.pm +1 -1
  46. data/bin/lib/Image/ExifTool/Exif.pm +53 -21
  47. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  48. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  50. data/bin/lib/Image/ExifTool/FLIR.pm +16 -4
  51. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  52. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  53. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  54. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  55. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  56. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  57. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  58. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  59. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  60. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  61. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  62. data/bin/lib/Image/ExifTool/Geotag.pm +4 -3
  63. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  64. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  65. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  66. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  67. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  68. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  69. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  70. data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  71. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  72. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  73. data/bin/lib/Image/ExifTool/Import.pm +1 -1
  74. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  75. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  76. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  77. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  78. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  79. data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  81. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  82. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  83. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  96. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  97. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  98. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  99. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  100. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  101. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  102. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  103. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  104. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  106. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  110. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  111. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  114. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  115. data/bin/lib/Image/ExifTool/MacOS.pm +10 -10
  116. data/bin/lib/Image/ExifTool/MakerNotes.pm +13 -2
  117. data/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  118. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  119. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  120. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  121. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Nikon.pm +1062 -189
  123. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  124. data/bin/lib/Image/ExifTool/NikonCustom.pm +519 -6
  125. data/bin/lib/Image/ExifTool/NikonSettings.pm +17 -18
  126. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  127. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  128. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  129. data/bin/lib/Image/ExifTool/Olympus.pm +8 -7
  130. data/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
  131. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  133. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  135. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  136. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  138. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PNG.pm +28 -8
  140. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  142. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  144. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  145. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  147. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  148. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  149. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  150. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  151. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  152. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  153. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  154. data/bin/lib/Image/ExifTool/QuickTime.pm +10 -6
  155. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +16 -5
  156. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  157. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  158. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  159. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  160. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  161. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  162. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  164. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Samsung.pm +6 -2
  166. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  168. data/bin/lib/Image/ExifTool/Shift.pl +3 -1
  169. data/bin/lib/Image/ExifTool/Shortcuts.pm +3 -2
  170. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  171. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  172. data/bin/lib/Image/ExifTool/Sony.pm +11 -5
  173. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  175. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  176. data/bin/lib/Image/ExifTool/TagLookup.pm +6385 -6290
  177. data/bin/lib/Image/ExifTool/TagNames.pod +361 -22
  178. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  179. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  180. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  181. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  182. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  183. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  184. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  185. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  186. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  187. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  188. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  189. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  190. data/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  191. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  192. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  193. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +9 -4
  194. data/bin/lib/Image/ExifTool/WriteXMP.pl +3 -1
  195. data/bin/lib/Image/ExifTool/Writer.pl +6 -5
  196. data/bin/lib/Image/ExifTool/XMP.pm +51 -25
  197. data/bin/lib/Image/ExifTool/XMP2.pl +3 -2
  198. data/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
  199. data/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  200. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  201. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  202. data/bin/lib/Image/ExifTool.pm +23 -6
  203. data/bin/lib/Image/ExifTool.pod +71 -69
  204. data/bin/perl-Image-ExifTool.spec +43 -43
  205. data/lib/exiftool_vendored/version.rb +1 -1
  206. metadata +2 -2
@@ -297,7 +297,7 @@ This module contains definitions required by Image::ExifTool to read WTV
297
297
 
298
298
  =head1 AUTHOR
299
299
 
300
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
300
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
301
301
 
302
302
  This library is free software; you can redistribute it and/or modify it
303
303
  under the same terms as Perl itself.
@@ -623,7 +623,7 @@ JPEG files, and would lead to far fewer problems with corrupted metadata.
623
623
 
624
624
  =head1 AUTHOR
625
625
 
626
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
626
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
627
627
 
628
628
  This library is free software; you can redistribute it and/or modify it
629
629
  under the same terms as Perl itself.
@@ -2563,7 +2563,7 @@ This file contains routines to write EXIF metadata.
2563
2563
 
2564
2564
  =head1 AUTHOR
2565
2565
 
2566
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2566
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2567
2567
 
2568
2568
  This library is free software; you can redistribute it and/or modify it
2569
2569
  under the same terms as Perl itself.
@@ -715,7 +715,7 @@ seldom-used routines.
715
715
 
716
716
  =head1 AUTHOR
717
717
 
718
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
718
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
719
719
 
720
720
  This library is free software; you can redistribute it and/or modify it
721
721
  under the same terms as Perl itself.
@@ -750,7 +750,7 @@ C<PDF-update> pseudo group).
750
750
 
751
751
  =head1 AUTHOR
752
752
 
753
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
753
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
754
754
 
755
755
  This library is free software; you can redistribute it and/or modify it
756
756
  under the same terms as Perl itself.
@@ -61,7 +61,7 @@ sub HexEncode($)
61
61
 
62
62
  #------------------------------------------------------------------------------
63
63
  # Write profile chunk (possibly compressed if Zlib is available)
64
- # Inputs: 0) outfile, 1) Raw profile type, 2) data ref
64
+ # Inputs: 0) outfile, 1) Raw profile type (SCALAR ref for iCCP name), 2) data ref
65
65
  # 3) profile header type (undef if not a text profile)
66
66
  # Returns: 1 on success
67
67
  sub WriteProfile($$$;$)
@@ -73,10 +73,10 @@ sub WriteProfile($$$;$)
73
73
  }
74
74
  if (not defined $profile) {
75
75
  # write ICC profile as compressed iCCP chunk if possible
76
- if ($rawType eq 'icm') {
76
+ if (ref $rawType) {
77
77
  return 0 unless $deflate;
78
78
  $chunk = 'iCCP';
79
- $prefix = "$rawType\0\0";
79
+ $prefix = "$$rawType\0\0";
80
80
  } else {
81
81
  $chunk = $rawType;
82
82
  if ($rawType eq $stdCase{zxif}) {
@@ -116,7 +116,7 @@ sub WriteProfile($$$;$)
116
116
  }
117
117
 
118
118
  #------------------------------------------------------------------------------
119
- # Add iCCP chunk to the PNG image if necessary (must come before PLTE and IDAT)
119
+ # Add iCCP-related chunks to the PNG image if necessary (must come before PLTE and IDAT)
120
120
  # Inputs: 0) ExifTool object ref, 1) output file or scalar ref
121
121
  # Returns: true on success
122
122
  sub Add_iCCP($$)
@@ -127,9 +127,28 @@ sub Add_iCCP($$)
127
127
  my $tagTablePtr = Image::ExifTool::GetTagTable('Image::ExifTool::ICC_Profile::Main');
128
128
  my %dirInfo = ( Parent => 'PNG', DirName => 'ICC_Profile' );
129
129
  my $buff = $et->WriteDirectory(\%dirInfo, $tagTablePtr);
130
- if (defined $buff and length $buff and WriteProfile($outfile, 'icm', \$buff)) {
131
- $et->VPrint(0, "Created ICC profile\n");
132
- delete $$et{ADD_DIRS}{ICC_Profile}; # don't add it again
130
+ if (defined $buff and length $buff) {
131
+ my $profileName = $et->GetNewValue($Image::ExifTool::PNG::Main{'iCCP-name'});
132
+ $profileName = 'icm' unless defined $profileName;
133
+ if (WriteProfile($outfile, \$profileName, \$buff)) {
134
+ $et->VPrint(0, "Created ICC profile with name '${profileName}'\n");
135
+ delete $$et{ADD_DIRS}{ICC_Profile}; # don't add it again
136
+ }
137
+ }
138
+ }
139
+ # must also add sRGB and gAMA before PLTE and IDAT
140
+ if ($$et{ADD_PNG}) {
141
+ my ($tag, %addBeforePLTE);
142
+ foreach $tag (qw(sRGB gAMA)) {
143
+ next unless $$et{ADD_PNG}{$tag};
144
+ $addBeforePLTE{$tag} = $$et{ADD_PNG}{$tag};
145
+ delete $$et{ADD_PNG}{$tag};
146
+ }
147
+ if (%addBeforePLTE) {
148
+ my $save = $$et{ADD_PNG};
149
+ $$et{ADD_PNG} = \%addBeforePLTE;
150
+ AddChunks($et, $outfile);
151
+ $$et{ADD_PNG} = $save;
133
152
  }
134
153
  }
135
154
  return 1;
@@ -244,9 +263,10 @@ sub AddChunks($$;@)
244
263
  # write any outstanding PNG tags
245
264
  foreach $tag (sort keys %$addTags) {
246
265
  my $tagInfo = $$addTags{$tag};
266
+ next if $$tagInfo{FakeTag}; # (iCCP-name)
247
267
  my $nvHash = $et->GetNewValueHash($tagInfo);
248
- # (native PNG information is always preferred, so don't check IsCreating)
249
- next unless $et->IsOverwriting($nvHash);
268
+ # (native PNG information is always preferred, so don't rely on just IsCreating)
269
+ next unless $$nvHash{IsCreating} or $et->IsOverwriting($nvHash) > 0;
250
270
  my $val = $et->GetNewValue($nvHash);
251
271
  if (defined $val) {
252
272
  next if $$nvHash{EditOnly};
@@ -381,7 +401,7 @@ strings).
381
401
 
382
402
  =head1 AUTHOR
383
403
 
384
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
404
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
385
405
 
386
406
  This library is free software; you can redistribute it and/or modify it
387
407
  under the same terms as Perl itself.
@@ -257,7 +257,7 @@ default resource name, and applied if no appended name is provided.
257
257
 
258
258
  =head1 AUTHOR
259
259
 
260
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
260
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
261
261
 
262
262
  This library is free software; you can redistribute it and/or modify it
263
263
  under the same terms as Perl itself.
@@ -687,7 +687,7 @@ Thanks to Tim Kordick for his help testing the EPS writer.
687
687
 
688
688
  =head1 AUTHOR
689
689
 
690
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
690
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
691
691
 
692
692
  This library is free software; you can redistribute it and/or modify it
693
693
  under the same terms as Perl itself.
@@ -1335,6 +1335,7 @@ sub WriteQuickTime($$$)
1335
1335
  # write the new atom if it was modified
1336
1336
  if (defined $newData) {
1337
1337
  my $sizeDiff = length($buff) - length($newData);
1338
+ # pad to original size if specified, otherwise give verbose message about the changed size
1338
1339
  if ($sizeDiff > 0 and $$tagInfo{PreservePadding} and $et->Options('QuickTimePad')) {
1339
1340
  $newData .= "\0" x $sizeDiff;
1340
1341
  $et->VPrint(1, " ($$tagInfo{Name} padded to original size)");
@@ -1390,9 +1391,13 @@ sub WriteQuickTime($$$)
1390
1391
  $pos += $siz;
1391
1392
  }
1392
1393
  if ($msg) {
1393
- my $grp = $$et{CUR_WRITE_GROUP} || $parent;
1394
- $et->Error("$msg for $grp");
1395
- return $rtnErr;
1394
+ # (allow empty sample description for non-audio/video handler types, eg. 'url ', 'meta')
1395
+ if ($$et{HandlerType}) {
1396
+ my $grp = $$et{CUR_WRITE_GROUP} || $parent;
1397
+ $et->Error("$msg for $grp");
1398
+ return $rtnErr;
1399
+ }
1400
+ $flg = 1; # (this seems to be the case)
1396
1401
  }
1397
1402
  $$et{QtDataFlg} = $flg;
1398
1403
  }
@@ -1922,7 +1927,7 @@ QuickTime-based file formats like MOV and MP4.
1922
1927
 
1923
1928
  =head1 AUTHOR
1924
1929
 
1925
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1930
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1926
1931
 
1927
1932
  This library is free software; you can redistribute it and/or modify it
1928
1933
  under the same terms as Perl itself.
@@ -298,6 +298,8 @@ sub SetPropertyPath($$;$$$$)
298
298
  $flatInfo = $$tagTablePtr{$flatID};
299
299
  if ($flatInfo) {
300
300
  return if $$flatInfo{PropertyPath};
301
+ } elsif (@$propList > 50) {
302
+ return; # avoid deep recursion
301
303
  } else {
302
304
  # flattened tag doesn't exist, so create it now
303
305
  # (could happen if we were just writing a structure)
@@ -1619,7 +1621,7 @@ This file contains routines to write XMP metadata.
1619
1621
 
1620
1622
  =head1 AUTHOR
1621
1623
 
1622
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1624
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1623
1625
 
1624
1626
  This library is free software; you can redistribute it and/or modify it
1625
1627
  under the same terms as Perl itself.
@@ -136,9 +136,9 @@ my %rawType = (
136
136
  my @delGroups = qw(
137
137
  Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11
138
138
  APP12 APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
139
- FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD
140
- IPTC ItemList JFIF Jpeg2000 Keys MakerNotes Meta MetaIFD Microsoft MIE
141
- MPF NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs
139
+ FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC
140
+ ItemList JFIF Jpeg2000 Keys MakerNotes Meta MetaIFD Microsoft MIE MPF
141
+ NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs
142
142
  PrintIM QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
143
143
  );
144
144
  # family 2 group names that we can delete
@@ -3532,7 +3532,8 @@ PAT: foreach $pattern (@patterns) {
3532
3532
  # 2) optional tag value (before RawConv) if deleting specific values
3533
3533
  # Returns: >0 - tag should be overwritten
3534
3534
  # =0 - the tag should be preserved
3535
- # <0 - not sure, we need the value to know
3535
+ # <0 - not sure, we need the old value to tell (if there is no old value
3536
+ # then the tag should be written if $$nvHash{IsCreating} is true)
3536
3537
  # Notes: $$nvHash{Value} is updated with the new value when shifting a value
3537
3538
  sub IsOverwriting($$;$)
3538
3539
  {
@@ -7036,7 +7037,7 @@ used routines.
7036
7037
 
7037
7038
  =head1 AUTHOR
7038
7039
 
7039
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
7040
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
7040
7041
 
7041
7042
  This library is free software; you can redistribute it and/or modify it
7042
7043
  under the same terms as Perl itself.
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
  require Exporter;
52
52
 
53
- $VERSION = '3.49';
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
@@ -878,6 +881,18 @@ my %sRangeMask = (
878
881
  Name => 'Device',
879
882
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::Device' },
880
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
+ },
881
896
  );
882
897
 
883
898
  # hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
@@ -2134,8 +2149,8 @@ my %sPantryItem = (
2134
2149
  Groups => { 2 => 'Location' },
2135
2150
  Writable => 'integer',
2136
2151
  PrintConv => {
2137
- 2 => '2-Dimensional',
2138
- 3 => '3-Dimensional',
2152
+ 2 => '2-Dimensional Measurement',
2153
+ 3 => '3-Dimensional Measurement',
2139
2154
  },
2140
2155
  },
2141
2156
  GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' },
@@ -3384,6 +3399,10 @@ NoLoop:
3384
3399
  }
3385
3400
  # save property list for verbose "adding" message unless this tag already exists
3386
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
+ }
3387
3406
  AddTagToTable($tagTablePtr, $tagID, $tagInfo);
3388
3407
  last;
3389
3408
  }
@@ -3438,26 +3457,6 @@ NoLoop:
3438
3457
  my $key = $et->FoundTag($tagInfo, $val) or return 0;
3439
3458
  # save original components of rational numbers (used when copying)
3440
3459
  $$et{RATIONAL}{$key} = $rational if defined $rational;
3441
- # allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
3442
- if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
3443
- my $subdir = $$tagInfo{SubDirectory};
3444
- my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
3445
- # process subdirectory information
3446
- my %dirInfo = (
3447
- DirName => $$subdir{DirName} || $$tagInfo{Name},
3448
- DataPt => $dataPt,
3449
- DirLen => length $$dataPt,
3450
- IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
3451
- );
3452
- my $oldOrder = GetByteOrder();
3453
- SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
3454
- my $oldNS = $$et{definedNS};
3455
- delete $$et{definedNS};
3456
- my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
3457
- $et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
3458
- SetByteOrder($oldOrder);
3459
- $$et{definedNS} = $oldNS;
3460
- }
3461
3460
  # save structure/list information if necessary
3462
3461
  if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
3463
3462
  not $$et{NO_STRUCT})
@@ -3488,6 +3487,29 @@ NoLoop:
3488
3487
  my $tagID = join('/',@$props);
3489
3488
  $et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
3490
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
+ }
3491
3513
  return 1;
3492
3514
  }
3493
3515
 
@@ -3712,7 +3734,11 @@ sub ParseXMPElement($$$;$$$$)
3712
3734
  } elsif ($prop eq 'rdf:Description') {
3713
3735
  # remove unnecessary rdf:Description elements since parseType='Resource'
3714
3736
  # is more efficient (also necessary to make property path consistent)
3715
- $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
+ }
3716
3742
  } elsif ($prop eq 'xmp:xmpmeta') {
3717
3743
  # patch MicrosoftPhoto unconformity
3718
3744
  $prop = 'x:xmpmeta';
@@ -4347,7 +4373,7 @@ information.
4347
4373
 
4348
4374
  =head1 AUTHOR
4349
4375
 
4350
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
4376
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
4351
4377
 
4352
4378
  This library is free software; you can redistribute it and/or modify it
4353
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,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.
@@ -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.
@@ -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.37';
32
+ $VERSION = '12.41';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -320,7 +320,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
320
320
  FPF => ['FPF', 'FLIR Public image Format'],
321
321
  FPX => ['FPX', 'FlashPix'],
322
322
  GIF => ['GIF', 'Compuserve Graphics Interchange Format'],
323
- GPR => ['TIFF', 'GoPro RAW'],
323
+ GPR => ['TIFF', 'General Purpose RAW'], # https://gopro.github.io/gpr/
324
324
  GZ => 'GZIP',
325
325
  GZIP => ['GZIP', 'GNU ZIP compressed archive'],
326
326
  HDP => ['TIFF', 'Windows HD Photo'],
@@ -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',
@@ -1796,6 +1799,7 @@ my %systemTagsNotes = (
1796
1799
  Writable => 1,
1797
1800
  Protected => 1,
1798
1801
  },
1802
+ PageCount => { Notes => 'the number of pages in a multi-page TIFF document' },
1799
1803
  );
1800
1804
 
1801
1805
  # tags defined by UserParam option (added at runtime)
@@ -4088,8 +4092,9 @@ sub Open($*$;$)
4088
4092
  my ($self, $fh, $file, $mode) = @_;
4089
4093
 
4090
4094
  $file =~ s/^([\s&])/.\/$1/; # protect leading whitespace or ampersand
4091
- # default to read mode ('<') unless input is a pipe
4092
- $mode = ($file =~ /\|$/ ? '' : '<') unless $mode;
4095
+ # default to read mode ('<') unless input is a trusted pipe
4096
+ $mode = (($file =~ /\|$/ and $$self{TRUST_PIPE}) ? '' : '<') unless $mode;
4097
+ delete $$self{TRUST_PIPE};
4093
4098
  if ($mode) {
4094
4099
  if ($self->EncodeFileName($file)) {
4095
4100
  # handle Windows Unicode file name
@@ -6028,6 +6033,8 @@ sub IdentifyTrailer($;$)
6028
6033
  $type = 'Samsung';
6029
6034
  } elsif ($buff =~ /8db42d694ccc418790edff439fe026bf$/s) {
6030
6035
  $type = 'Insta360';
6036
+ } elsif ($buff =~ m(\0{6}/NIKON APP$)) {
6037
+ $type = 'NikonApp';
6031
6038
  }
6032
6039
  last;
6033
6040
  }
@@ -6063,6 +6070,9 @@ sub ProcessTrailers($$)
6063
6070
  if ($dirName eq 'Insta360') {
6064
6071
  require 'Image/ExifTool/QuickTimeStream.pl';
6065
6072
  $proc = 'Image::ExifTool::QuickTime::ProcessInsta360';
6073
+ } elsif ($dirName eq 'NikonApp') {
6074
+ require Image::ExifTool::Nikon;
6075
+ $proc = 'Image::ExifTool::Nikon::ProcessNikonApp';
6066
6076
  } else {
6067
6077
  require "Image/ExifTool/$dirName.pm";
6068
6078
  $proc = "Image::ExifTool::${dirName}::Process$dirName";
@@ -7439,7 +7449,11 @@ sub DoProcessTIFF($$;$)
7439
7449
  # this looks like a BigTIFF image
7440
7450
  $raf->Seek(0);
7441
7451
  require Image::ExifTool::BigTIFF;
7442
- return 1 if Image::ExifTool::BigTIFF::ProcessBTF($self, $dirInfo);
7452
+ my $result = Image::ExifTool::BigTIFF::ProcessBTF($self, $dirInfo);
7453
+ if ($result) {
7454
+ $self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage};
7455
+ return 1;
7456
+ }
7443
7457
  } elsif ($identifier == 0x4f52 or $identifier == 0x5352) {
7444
7458
  # Olympus ORF image (set FileType now because base type is 'ORF')
7445
7459
  $self->SetFileType($fileType = 'ORF');
@@ -7532,6 +7546,9 @@ sub DoProcessTIFF($$;$)
7532
7546
  # override whatever FileType we set since we now know it is DNG
7533
7547
  $self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
7534
7548
  }
7549
+ if ($$self{TIFF_TYPE} eq 'TIFF') {
7550
+ $self->FoundTag(PageCount => $$self{PageCount}) if $$self{MultiPage};
7551
+ }
7535
7552
  return 1;
7536
7553
  }
7537
7554
  #