exiftool-vendored.pl 13.0.1 → 13.16.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 (216) hide show
  1. package/bin/Changes +254 -20
  2. package/bin/MANIFEST +10 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +3 -3
  6. package/bin/arg_files/exif2xmp.args +4 -0
  7. package/bin/arg_files/xmp2exif.args +2 -1
  8. package/bin/build_geolocation +1 -1
  9. package/bin/exiftool +356 -213
  10. package/bin/lib/File/RandomAccess.pm +1 -1
  11. package/bin/lib/File/RandomAccess.pod +2 -2
  12. package/bin/lib/Image/ExifTool/AAC.pm +1 -1
  13. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  14. package/bin/lib/Image/ExifTool/AFCP.pm +6 -6
  15. package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  16. package/bin/lib/Image/ExifTool/APE.pm +2 -2
  17. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  18. package/bin/lib/Image/ExifTool/ASF.pm +2 -2
  19. package/bin/lib/Image/ExifTool/Apple.pm +11 -9
  20. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  21. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  22. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +36 -22
  26. package/bin/lib/Image/ExifTool/CBOR.pm +5 -2
  27. package/bin/lib/Image/ExifTool/Canon.pm +66 -27
  28. package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  29. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  30. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  31. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  32. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  33. package/bin/lib/Image/ExifTool/Charset.pm +1 -1
  34. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  35. package/bin/lib/Image/ExifTool/DJI.pm +196 -30
  36. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  41. package/bin/lib/Image/ExifTool/EXE.pm +138 -33
  42. package/bin/lib/Image/ExifTool/Exif.pm +29 -16
  43. package/bin/lib/Image/ExifTool/FITS.pm +3 -3
  44. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  45. package/bin/lib/Image/ExifTool/FLIF.pm +3 -3
  46. package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  47. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  48. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  49. package/bin/lib/Image/ExifTool/FlashPix.pm +17 -21
  50. package/bin/lib/Image/ExifTool/Font.pm +2 -2
  51. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  52. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  53. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  54. package/bin/lib/Image/ExifTool/GIF.pm +144 -93
  55. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GM.pm +1 -1
  57. package/bin/lib/Image/ExifTool/GPS.pm +34 -30
  58. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  59. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  60. package/bin/lib/Image/ExifTool/Geolocation.pm +19 -9
  61. package/bin/lib/Image/ExifTool/Geotag.pm +46 -12
  62. package/bin/lib/Image/ExifTool/GoPro.pm +120 -8
  63. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HP.pm +2 -2
  65. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  66. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  67. package/bin/lib/Image/ExifTool/ICC_Profile.pm +81 -2
  68. package/bin/lib/Image/ExifTool/ICO.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ID3.pm +8 -8
  70. package/bin/lib/Image/ExifTool/IPTC.pm +10 -7
  71. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  72. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  73. package/bin/lib/Image/ExifTool/Import.pm +5 -4
  74. package/bin/lib/Image/ExifTool/InDesign.pm +2 -2
  75. package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JPEG.pm +32 -5
  77. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  78. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  79. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  80. package/bin/lib/Image/ExifTool/Jpeg2000.pm +10 -9
  81. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  82. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  83. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  84. package/bin/lib/Image/ExifTool/LNK.pm +2 -2
  85. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  101. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  102. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  103. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  104. package/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
  105. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  106. package/bin/lib/Image/ExifTool/M2TS.pm +57 -18
  107. package/bin/lib/Image/ExifTool/MIE.pm +15 -6
  108. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  109. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MISB.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  115. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  116. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  117. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MXF.pm +3 -3
  119. package/bin/lib/Image/ExifTool/MacOS.pm +3 -2
  120. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  121. package/bin/lib/Image/ExifTool/Matroska.pm +22 -6
  122. package/bin/lib/Image/ExifTool/Microsoft.pm +2 -2
  123. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  124. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  125. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Nikon.pm +495 -39
  127. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  128. package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  129. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  131. package/bin/lib/Image/ExifTool/OOXML.pm +8 -8
  132. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  133. package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  134. package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  135. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  136. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  138. package/bin/lib/Image/ExifTool/PDF.pm +49 -18
  139. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  140. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  141. package/bin/lib/Image/ExifTool/PLIST.pm +4 -4
  142. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  143. package/bin/lib/Image/ExifTool/PNG.pm +20 -8
  144. package/bin/lib/Image/ExifTool/PPM.pm +12 -3
  145. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  146. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  147. package/bin/lib/Image/ExifTool/Panasonic.pm +27 -3
  148. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  149. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  150. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  151. package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
  152. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  153. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  154. package/bin/lib/Image/ExifTool/Photoshop.pm +65 -4
  155. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  156. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  157. package/bin/lib/Image/ExifTool/Protobuf.pm +270 -0
  158. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  159. package/bin/lib/Image/ExifTool/QuickTime.pm +326 -88
  160. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
  161. package/bin/lib/Image/ExifTool/README +12 -2
  162. package/bin/lib/Image/ExifTool/RIFF.pm +21 -6
  163. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  164. package/bin/lib/Image/ExifTool/RTF.pm +2 -2
  165. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  168. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  170. package/bin/lib/Image/ExifTool/Ricoh.pm +4 -4
  171. package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  172. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  174. package/bin/lib/Image/ExifTool/Shift.pl +1 -1
  175. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  176. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  177. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Sony.pm +5 -4
  179. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  181. package/bin/lib/Image/ExifTool/TagInfoXML.pm +6 -5
  182. package/bin/lib/Image/ExifTool/TagLookup.pm +7023 -6968
  183. package/bin/lib/Image/ExifTool/TagNames.pod +445 -29
  184. package/bin/lib/Image/ExifTool/Text.pm +4 -3
  185. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  186. package/bin/lib/Image/ExifTool/Torrent.pm +3 -3
  187. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  188. package/bin/lib/Image/ExifTool/VCard.pm +3 -3
  189. package/bin/lib/Image/ExifTool/Validate.pm +6 -6
  190. package/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  191. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  192. package/bin/lib/Image/ExifTool/WPG.pm +1 -1
  193. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  194. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  195. package/bin/lib/Image/ExifTool/WriteExif.pl +3 -3
  196. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  197. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  198. package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  199. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  200. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  201. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +166 -79
  202. package/bin/lib/Image/ExifTool/WriteRIFF.pl +17 -6
  203. package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -3
  204. package/bin/lib/Image/ExifTool/Writer.pl +89 -96
  205. package/bin/lib/Image/ExifTool/XISF.pm +1 -1
  206. package/bin/lib/Image/ExifTool/XMP.pm +28 -13
  207. package/bin/lib/Image/ExifTool/XMP2.pl +103 -1
  208. package/bin/lib/Image/ExifTool/XMPStruct.pl +2 -3
  209. package/bin/lib/Image/ExifTool/ZIP.pm +2 -2
  210. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  211. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  212. package/bin/lib/Image/ExifTool.pm +335 -163
  213. package/bin/lib/Image/ExifTool.pod +119 -73
  214. package/bin/perl-Image-ExifTool.spec +1 -1
  215. package/bin/windows_exiftool.txt +96 -51
  216. package/package.json +6 -6
@@ -918,7 +918,7 @@ the maker notes of NEF images.
918
918
 
919
919
  =head1 AUTHOR
920
920
 
921
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
921
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
922
922
 
923
923
  This library is free software; you can redistribute it and/or modify it
924
924
  under the same terms as Perl itself.
@@ -112,7 +112,7 @@ $VERSION = '1.26';
112
112
  113 => 'Power Zoom +',
113
113
  114 => 'Power Zoom -',
114
114
  115 => 'Delete',
115
- 116 => 'Pixel Shift Shooting',
115
+ 116 => 'Pixel Shift Shooting', #Z8 (Z9 fw 5.1 maps as 'Save and Load Power Zoom Position')
116
116
  117 => 'Cycle AF-area Mode',
117
117
  118 => 'Raw Processing (Current)', #118-131 are Playback Retouch options
118
118
  119 => 'Raw Processing (Multiple)',
@@ -11362,7 +11362,7 @@ this information.
11362
11362
 
11363
11363
  =head1 AUTHOR
11364
11364
 
11365
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
11365
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
11366
11366
 
11367
11367
  This library is free software; you can redistribute it and/or modify it
11368
11368
  under the same terms as Perl itself.
@@ -2132,7 +2132,7 @@ Nikon cameras such as the D6 and Z7mk2.
2132
2132
 
2133
2133
  =head1 AUTHOR
2134
2134
 
2135
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2135
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2136
2136
 
2137
2137
  This library is free software; you can redistribute it and/or modify it
2138
2138
  under the same terms as Perl itself.
@@ -107,7 +107,7 @@ interpret Nintendo maker notes EXIF meta information.
107
107
 
108
108
  =head1 AUTHOR
109
109
 
110
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
110
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
111
111
 
112
112
  This library is free software; you can redistribute it and/or modify it
113
113
  under the same terms as Perl itself.
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::XMP;
15
15
  use Image::ExifTool::ZIP;
16
16
 
17
- $VERSION = '1.08';
17
+ $VERSION = '1.09';
18
18
 
19
19
  # test for recognized OOXML document extensions
20
20
  my %isOOXML = (
@@ -360,12 +360,12 @@ sub ProcessDOCX($$)
360
360
  }
361
361
  # process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml)
362
362
  my %dirInfo = (
363
- DataPt => \$buff,
364
- DirLen => length $buff,
365
- DataLen => length $buff,
366
- XMPParseOpts => {
367
- FoundProc => \&FoundTag,
368
- },
363
+ DataPt => \$buff,
364
+ DirLen => length $buff,
365
+ # (skip over XML header if it exists)
366
+ DirStart => ($buff =~ /<\?xml\s+.*?\?>/g ? pos($buff) : 0),
367
+ DataLen => length $buff,
368
+ XMPParseOpts => { FoundProc => \&FoundTag },
369
369
  );
370
370
  $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
371
371
  undef $buff; # (free memory now)
@@ -395,7 +395,7 @@ archives of XML files.
395
395
 
396
396
  =head1 AUTHOR
397
397
 
398
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
398
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
399
399
 
400
400
  This library is free software; you can redistribute it and/or modify it
401
401
  under the same terms as Perl itself.
@@ -215,7 +215,7 @@ information from Ogg bitstream container files.
215
215
 
216
216
  =head1 AUTHOR
217
217
 
218
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
218
+ Copyright 2003-2025, 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.
@@ -4194,7 +4194,7 @@ Olympus or Epson maker notes in EXIF information.
4194
4194
 
4195
4195
  =head1 AUTHOR
4196
4196
 
4197
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
4197
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
4198
4198
 
4199
4199
  This library is free software; you can redistribute it and/or modify it
4200
4200
  under the same terms as Perl itself.
@@ -341,7 +341,7 @@ information from OpenEXR images.
341
341
 
342
342
  =head1 AUTHOR
343
343
 
344
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
344
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
345
345
 
346
346
  This library is free software; you can redistribute it and/or modify it
347
347
  under the same terms as Perl itself.
@@ -69,7 +69,7 @@ information from Ogg Opus audio files.
69
69
 
70
70
  =head1 AUTHOR
71
71
 
72
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
72
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
73
73
 
74
74
  This library is free software; you can redistribute it and/or modify it
75
75
  under the same terms as Perl itself.
@@ -71,7 +71,7 @@ information from Portable FloatMap (PFM) images.
71
71
 
72
72
  =head1 AUTHOR
73
73
 
74
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
74
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
75
75
 
76
76
  This library is free software; you can redistribute it and/or modify it
77
77
  under the same terms as Perl itself.
@@ -114,7 +114,7 @@ information from PC Paintbrush (PCX) files.
114
114
 
115
115
  =head1 AUTHOR
116
116
 
117
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
117
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
118
118
 
119
119
  This library is free software; you can redistribute it and/or modify it
120
120
  under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  require Exporter;
23
23
 
24
- $VERSION = '1.58';
24
+ $VERSION = '1.60';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -349,6 +349,7 @@ my %supportedFilter = (
349
349
  # tags in PDF ICCBased, Cs1 and CS0 dictionaries
350
350
  %Image::ExifTool::PDF::ICCBased = (
351
351
  _stream => {
352
+ Name => 'ICC_Profile',
352
353
  SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
353
354
  },
354
355
  );
@@ -470,6 +471,7 @@ my %supportedFilter = (
470
471
  # tags in PDF AIMetaData dictionary
471
472
  %Image::ExifTool::PDF::AIMetaData = (
472
473
  _stream => {
474
+ Name => 'AIStream',
473
475
  SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
474
476
  },
475
477
  );
@@ -477,6 +479,7 @@ my %supportedFilter = (
477
479
  # tags in PDF ImageResources dictionary
478
480
  %Image::ExifTool::PDF::ImageResources = (
479
481
  _stream => {
482
+ Name => 'PhotoshopStream',
480
483
  SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
481
484
  },
482
485
  );
@@ -1212,7 +1215,7 @@ sub DecodeStream($$)
1212
1215
  # be sure we can process all the filters before we take the time to do the decryption
1213
1216
  foreach $filter (@filters) {
1214
1217
  next if $supportedFilter{$filter};
1215
- $et->WarnOnce("Unsupported Filter $filter");
1218
+ $et->Warn("Unsupported Filter $filter");
1216
1219
  return 0;
1217
1220
  }
1218
1221
  # apply decryption first if required (and if the default encryption
@@ -1241,7 +1244,7 @@ sub DecodeStream($$)
1241
1244
  if (ref $decodeParms eq 'HASH') {
1242
1245
  $pre = $$decodeParms{Predictor};
1243
1246
  if ($pre and $pre ne '1' and $pre ne '12') {
1244
- $et->WarnOnce("FlateDecode Predictor $pre currently not supported");
1247
+ $et->Warn("FlateDecode Predictor $pre currently not supported");
1245
1248
  return 0;
1246
1249
  }
1247
1250
  }
@@ -1256,7 +1259,7 @@ sub DecodeStream($$)
1256
1259
  return 0;
1257
1260
  }
1258
1261
  } else {
1259
- $et->WarnOnce('Install Compress::Zlib to process filtered streams');
1262
+ $et->Warn('Install Compress::Zlib to process filtered streams');
1260
1263
  return 0;
1261
1264
  }
1262
1265
  next unless $pre and $pre eq '12'; # 12 = 'up' prediction
@@ -1265,7 +1268,7 @@ sub DecodeStream($$)
1265
1268
  my $cols = $$decodeParms{Columns};
1266
1269
  unless ($cols) {
1267
1270
  # currently only support 'up' prediction
1268
- $et->WarnOnce('No Columns for decoding stream');
1271
+ $et->Warn('No Columns for decoding stream');
1269
1272
  return 0;
1270
1273
  }
1271
1274
  my @bytes = unpack('C*', $$dict{_stream});
@@ -1273,7 +1276,7 @@ sub DecodeStream($$)
1273
1276
  my $buff = '';
1274
1277
  while (@bytes > $cols) {
1275
1278
  unless (($_ = shift @bytes) == 2) {
1276
- $et->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
1279
+ $et->Warn("Unsupported PNG filter $_"); # (yes, PNG)
1277
1280
  return 0;
1278
1281
  }
1279
1282
  foreach (@pre) {
@@ -1293,11 +1296,11 @@ sub DecodeStream($$)
1293
1296
  my $name = $$decodeParms{Name};
1294
1297
  next unless defined $name or $name eq 'Identity';
1295
1298
  if ($name ne 'StdCF') {
1296
- $et->WarnOnce("Unsupported Crypt Filter $name");
1299
+ $et->Warn("Unsupported Crypt Filter $name");
1297
1300
  return 0;
1298
1301
  }
1299
1302
  unless ($cryptInfo) {
1300
- $et->WarnOnce('Missing Encrypt StdCF entry');
1303
+ $et->Warn('Missing Encrypt StdCF entry');
1301
1304
  return 0;
1302
1305
  }
1303
1306
  # decrypt the stream manually because we want to:
@@ -1315,15 +1318,15 @@ sub DecodeStream($$)
1315
1318
  # make sure we don't have any unsupported decoding parameters
1316
1319
  if (ref $decodeParms eq 'HASH') {
1317
1320
  if ($$decodeParms{Predictor}) {
1318
- $et->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
1321
+ $et->Warn("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
1319
1322
  return 0;
1320
1323
  } elsif ($$decodeParms{EarlyChange}) {
1321
- $et->WarnOnce("LZWDecode EarlyChange currently not supported");
1324
+ $et->Warn("LZWDecode EarlyChange currently not supported");
1322
1325
  return 0;
1323
1326
  }
1324
1327
  }
1325
1328
  unless (DecodeLZW(\$$dict{_stream})) {
1326
- $et->WarnOnce('LZW decompress error');
1329
+ $et->Warn('LZW decompress error');
1327
1330
  return 0;
1328
1331
  }
1329
1332
 
@@ -1359,7 +1362,7 @@ sub DecodeStream($$)
1359
1362
  last if $_ eq '~';
1360
1363
  # (both $n and $val are zero again now)
1361
1364
  }
1362
- $err and $et->WarnOnce("ASCII85Decode error $err");
1365
+ $err and $et->Warn("ASCII85Decode error $err");
1363
1366
  $$dict{_stream} = pack('C*', @out);
1364
1367
  }
1365
1368
  }
@@ -1595,9 +1598,13 @@ sub DecryptInit($$$)
1595
1598
  $password = $et->Options('Password');
1596
1599
  return 'Document is password protected (use Password option)' unless defined $password;
1597
1600
  # make sure there is no UTF-8 flag on the password
1598
- if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($password) } or $@)) {
1601
+ if ($] >= 5.006 and ($$et{OPTIONS}{EncodeHangs} or
1602
+ eval { require Encode; Encode::is_utf8($password) } or $@))
1603
+ {
1604
+ local $SIG{'__WARN__'} = sub { };
1599
1605
  # repack by hand if Encode isn't available
1600
- $password = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$password)) : Encode::encode('utf8',$password);
1606
+ $password = ($$et{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
1607
+ 'U0C*' : 'C0C*', $password)) : Encode::encode('utf8', $password);
1601
1608
  }
1602
1609
  } else {
1603
1610
  return 'Incorrect password';
@@ -1823,7 +1830,7 @@ sub ProcessDict($$$$;$$)
1823
1830
 
1824
1831
  $nesting = ($nesting || 0) + 1;
1825
1832
  if ($nesting > 50) {
1826
- $et->WarnOnce('Nesting too deep (directory ignored)');
1833
+ $et->Warn('Nesting too deep (directory ignored)');
1827
1834
  return;
1828
1835
  }
1829
1836
  # save entire dictionary for rewriting if specified
@@ -1983,7 +1990,7 @@ sub ProcessDict($$$$;$$)
1983
1990
  if ($$tagInfo{IgnoreDuplicates}) {
1984
1991
  my $flag = "ProcessedPDF_$tag";
1985
1992
  if ($$et{$flag}) {
1986
- next if $et->WarnOnce("Ignored duplicate $tag dictionary", 2);
1993
+ next if $et->Warn("Ignored duplicate $tag dictionary", 2);
1987
1994
  } else {
1988
1995
  $$et{$flag} = 1;
1989
1996
  }
@@ -2157,6 +2164,20 @@ sub ProcessDict($$$$;$$)
2157
2164
  last;
2158
2165
  }
2159
2166
  # decode stream if necessary
2167
+ if ($cryptInfo and ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3} and
2168
+ $$dict{Length} and $$dict{Length} > 10000) and not $$dict{_decrypted} and
2169
+ not $$et{PDF_CAPTURE}) # (capturing PDF for writing?)
2170
+ {
2171
+ my $type = $$dict{Type} || '';
2172
+ if ($type ne '/Metadata' or $$dict{Length} > 100000) {
2173
+ if ($$et{OPTIONS}{IgnoreMinorErrors}) {
2174
+ $et->Warn("Decrypting large $$tagInfo{Name} (will be slow)");
2175
+ } else {
2176
+ $et->Warn("Skipping large AES-encrypted $$tagInfo{Name}", 2);
2177
+ last;
2178
+ }
2179
+ }
2180
+ }
2160
2181
  DecodeStream($et, $dict) or last;
2161
2182
  if ($verbose > 2) {
2162
2183
  $et->VPrint(2,"$$et{INDENT}$$et{DIR_NAME} stream data\n");
@@ -2233,7 +2254,17 @@ sub ReadPDF($$)
2233
2254
  $raf->Read($buff, $len) == $len or return -3;
2234
2255
  # find the LAST xref table in the file (may be multiple %%EOF marks,
2235
2256
  # and comments between "startxref" and "%%EOF")
2236
- $buff =~ /^.*startxref(\s+)(\d+)(\s+)(%[^\x0d\x0a]*\s+)*%%EOF/s or return -4;
2257
+ $buff =~ /^.*startxref(\s+)(\d+)(\s+)((%[^\x0d\x0a]*\s+)*)%%EOF/s or return -4;
2258
+ # parse comments to read SEAL information
2259
+ if ($4) {
2260
+ my @com = split /[\x0d\x0d]+/, $4;
2261
+ foreach (@com) {
2262
+ /^(%+\s*)<seal seal=/ or next;
2263
+ my $dat = substr $_, length($1);
2264
+ my $tbl = GetTagTable('Image::ExifTool::XMP::SEAL');
2265
+ $et->ProcessDirectory({ DataPt => \$dat }, $tbl);
2266
+ }
2267
+ }
2237
2268
  my $ws = $1 . $3;
2238
2269
  my $xr = $2;
2239
2270
  push @xrefOffsets, $xr, 'Main';
@@ -2466,7 +2497,7 @@ and AESV3 (AES-256).
2466
2497
 
2467
2498
  =head1 AUTHOR
2468
2499
 
2469
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2500
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2470
2501
 
2471
2502
  This library is free software; you can redistribute it and/or modify it
2472
2503
  under the same terms as Perl itself.
@@ -119,7 +119,7 @@ information from Progressive Graphics File (PGF) images.
119
119
 
120
120
  =head1 AUTHOR
121
121
 
122
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
122
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
123
123
 
124
124
  This library is free software; you can redistribute it and/or modify it
125
125
  under the same terms as Perl itself.
@@ -1236,7 +1236,7 @@ Verbose or the Unknown option.
1236
1236
 
1237
1237
  =head1 AUTHOR
1238
1238
 
1239
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1239
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1240
1240
 
1241
1241
  This library is free software; you can redistribute it and/or modify it
1242
1242
  under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::XMP;
22
22
  use Image::ExifTool::GPS;
23
23
 
24
- $VERSION = '1.12';
24
+ $VERSION = '1.13';
25
25
 
26
26
  sub ExtractObject($$;$);
27
27
  sub Get24u($$);
@@ -269,7 +269,7 @@ sub ExtractObject($$;$)
269
269
  if ($type == 13) { # dict
270
270
  # prevent infinite recursion
271
271
  if (defined $parent and length $parent > 1000) {
272
- $et->WarnOnce('Possible deep recursion while parsing PLIST');
272
+ $et->Warn('Possible deep recursion while parsing PLIST');
273
273
  return undef;
274
274
  }
275
275
  my $tagTablePtr = $$plistInfo{TagTablePtr};
@@ -344,7 +344,7 @@ sub ProcessBinaryPLIST($$;$)
344
344
  my ($i, $buff, @table);
345
345
  my $dataPt = $$dirInfo{DataPt};
346
346
 
347
- $et->VerboseDir('Binary PLIST');
347
+ $et->VerboseDir('Binary PLIST') unless $$dirInfo{NoVerboseDir};
348
348
  SetByteOrder('MM');
349
349
 
350
350
  if ($dataPt) {
@@ -450,7 +450,7 @@ This module decodes both the binary and XML-based PLIST format.
450
450
 
451
451
  =head1 AUTHOR
452
452
 
453
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
453
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
454
454
 
455
455
  This library is free software; you can redistribute it and/or modify it
456
456
  under the same terms as Perl itself.
@@ -2601,7 +2601,7 @@ Definitions for PLUS (Picture Licensing Universal System) tags.
2601
2601
 
2602
2602
  =head1 AUTHOR
2603
2603
 
2604
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2604
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2605
2605
 
2606
2606
  This library is free software; you can redistribute it and/or modify it
2607
2607
  under the same terms as Perl itself.
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.68';
39
+ $VERSION = '1.70';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -371,6 +371,10 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
371
371
  IgnoreProp => { meta => 1 }, # ignore 'meta' container
372
372
  },
373
373
  },
374
+ seAl => {
375
+ Name => 'SEAL',
376
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
377
+ },
374
378
  # mkBF,mkTS,mkBS,mkBT ? - written by Adobe FireWorks
375
379
  );
376
380
 
@@ -431,6 +435,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
431
435
  %Image::ExifTool::PNG::PhysicalPixel = (
432
436
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
433
437
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
438
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
434
439
  WRITABLE => 1,
435
440
  GROUPS => { 1 => 'PNG-pHYs', 2 => 'Image' },
436
441
  WRITE_GROUP => 'PNG-pHYs',
@@ -961,7 +966,7 @@ sub FoundPNG($$$$;$$$$)
961
966
  my $processed;
962
967
  if ($$tagInfo{SubDirectory}) {
963
968
  if ($$et{OPTIONS}{Validate} and $$tagInfo{NonStandard}) {
964
- $et->WarnOnce("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
969
+ $et->Warn("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
965
970
  }
966
971
  my $subdir = $$tagInfo{SubDirectory};
967
972
  my $dirName = $$subdir{DirName} || $tagName;
@@ -980,8 +985,15 @@ sub FoundPNG($$$$;$$$$)
980
985
  my $processProc = $$subdir{ProcessProc};
981
986
  # nothing more to do if writing and subdirectory is not writable
982
987
  my $subTable = GetTagTable($$subdir{TagTable});
983
- return 1 if $outBuff and not $$subTable{WRITE_PROC};
984
- my $dirName = $$subdir{DirName} || $tagName;
988
+ if ($outBuff and not $$subTable{WRITE_PROC}) {
989
+ if ($$et{DEL_GROUP}{$dirName}) {
990
+ # non-writable directories may be deleted as a group (eg. SEAL)
991
+ $et->VPrint(0, " Deleting $dirName\n");
992
+ $$outBuff = '';
993
+ ++$$et{CHANGED};
994
+ }
995
+ return 1;
996
+ }
985
997
  my %subdirInfo = (
986
998
  DataPt => \$val,
987
999
  DirStart => 0,
@@ -1460,7 +1472,7 @@ sub ProcessPNG($$)
1460
1472
 
1461
1473
  if ($wasEnd) {
1462
1474
  last unless $n; # stop now if normal end of PNG
1463
- $et->WarnOnce("Trailer data after $fileType $endChunk chunk", 1);
1475
+ $et->Warn("Trailer data after $fileType $endChunk chunk", 1);
1464
1476
  $wasTrailer = 1;
1465
1477
  last if $n < 8;
1466
1478
  $$et{SET_GROUP1} = 'Trailer';
@@ -1489,7 +1501,7 @@ sub ProcessPNG($$)
1489
1501
  } elsif ($hdrChunk eq 'IHDR' and $chunk eq 'CgBI') {
1490
1502
  $et->Warn('Non-standard PNG image (Apple iPhone format)');
1491
1503
  } else {
1492
- $et->WarnOnce("$fileType image did not start with $hdrChunk");
1504
+ $et->Warn("$fileType image did not start with $hdrChunk");
1493
1505
  }
1494
1506
  }
1495
1507
  if ($outfile and ($isDatChunk{$chunk} or $chunk eq $endChunk) and @txtOffset) {
@@ -1583,7 +1595,7 @@ sub ProcessPNG($$)
1583
1595
  } else {
1584
1596
  $msg = 'fixed';
1585
1597
  }
1586
- $et->WarnOnce("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1598
+ $et->Warn("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1587
1599
  }
1588
1600
  # read chunk data and CRC
1589
1601
  unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
@@ -1686,7 +1698,7 @@ and JNG (JPEG Network Graphics) images.
1686
1698
 
1687
1699
  =head1 AUTHOR
1688
1700
 
1689
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1701
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1690
1702
 
1691
1703
  This library is free software; you can redistribute it and/or modify it
1692
1704
  under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.10';
19
+ $VERSION = '1.11';
20
20
 
21
21
  #------------------------------------------------------------------------------
22
22
  # Read or write information in a PPM/PGM/PBM image
@@ -29,7 +29,7 @@ sub ProcessPPM($$)
29
29
  my $outfile = $$dirInfo{OutFile};
30
30
  my $verbose = $et->Options('Verbose');
31
31
  my $out = $et->Options('TextOut');
32
- my ($buff, $num, $type, %info);
32
+ my ($buff, $num, $type, %info, $seal);
33
33
  #
34
34
  # read as much of the image as necessary to extract the header and comments
35
35
  #
@@ -77,6 +77,7 @@ sub ProcessPPM($$)
77
77
  if (defined $info{Comment}) {
78
78
  $info{Comment} =~ s/^# ?//mg; # remove "# " at the start of each line
79
79
  $info{Comment} =~ s/[\n\r]+$//; # remove trailing newline
80
+ $seal = 1 if $info{Comment} =~ /^<seal seal=/;
80
81
  }
81
82
  $et->SetFileType($type);
82
83
  my $len = pos($buff);
@@ -91,6 +92,10 @@ sub ProcessPPM($$)
91
92
  ++$$et{CHANGED};
92
93
  $et->VerboseValue('- Comment', $oldComment) if defined $oldComment;
93
94
  $et->VerboseValue('+ Comment', $newComment) if defined $newComment;
95
+ } elsif ($seal and $$et{DEL_GROUP}{SEAL}) {
96
+ # delete SEAL comment
97
+ $et->VerboseValue('- Comment', $oldComment);
98
+ ++$$et{CHANGED};
94
99
  } else {
95
100
  $newComment = $oldComment; # use existing comment
96
101
  }
@@ -116,6 +121,10 @@ sub ProcessPPM($$)
116
121
  print $out "$type header ($len bytes):\n";
117
122
  $et->VerboseDump(\$buff, Len => $len);
118
123
  }
124
+ if ($seal) {
125
+ $et->ProcessDirectory({ DataPt => \$info{Comment} }, GetTagTable('Image::ExifTool::XMP::SEAL'));
126
+ delete $info{Comment};
127
+ }
119
128
  my $tag;
120
129
  foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
121
130
  $et->FoundTag($tag, $info{$tag}) if defined $info{$tag};
@@ -143,7 +152,7 @@ BitMap) images.
143
152
 
144
153
  =head1 AUTHOR
145
154
 
146
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
155
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
147
156
 
148
157
  This library is free software; you can redistribute it and/or modify it
149
158
  under the same terms as Perl itself.
@@ -284,7 +284,7 @@ information from Paint Shop Pro images.
284
284
 
285
285
  =head1 AUTHOR
286
286
 
287
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
287
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
288
288
 
289
289
  This library is free software; you can redistribute it and/or modify it
290
290
  under the same terms as Perl itself.
@@ -379,7 +379,7 @@ KF7 and KF8 books (AZW and AZW3).
379
379
 
380
380
  =head1 AUTHOR
381
381
 
382
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
382
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
383
383
 
384
384
  This library is free software; you can redistribute it and/or modify it
385
385
  under the same terms as Perl itself.
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.22';
40
+ $VERSION = '2.24';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -360,12 +360,16 @@ my %shootingMode = (
360
360
  '16' => 'Normal?', # (only mode for DMC-LC20)
361
361
  '16 0' => '1-area', # (FZ8)
362
362
  '16 16' => '1-area (high speed)', # (FZ8)
363
+ '16 32' => '1-area +', #forum16903 (G9M2)
364
+ '17 0' => 'Full Area', #forum16903 (G9M2)
363
365
  # '32 0' is Face Detect for FS7, and Face Detect or Focus Tracking
364
366
  # for the DMC-FZ200 (ref 17), and Auto is DMC-L1 guess,
365
367
  '32 0' => 'Tracking',
366
368
  '32 1' => '3-area (left)?', # (DMC-L1 guess)
367
369
  '32 2' => '3-area (center)?', # (DMC-L1 guess)
368
370
  '32 3' => '3-area (right)?', # (DMC-L1 guess)
371
+ '32 16' => 'Zone', #forum16903 (G9M2)
372
+ '32 18' => 'Zone (horizontal/vertical)', #forum16903 (G9M2)
369
373
  # '32 16' ? (DC-GH6)
370
374
  '64 0' => 'Face Detect',
371
375
  '64 1' => 'Face Detect (animal detect on)', #forum11194
@@ -1448,6 +1452,26 @@ my %shootingMode = (
1448
1452
  Name => 'MinimumISO',
1449
1453
  Writable => 'int32u',
1450
1454
  },
1455
+ 0xe9 => { #forum16903 (DC-G9M2)
1456
+ Name => 'AFSubjectDetection',
1457
+ Writable => 'int16u',
1458
+ PrintConv => {
1459
+ 0 => 'n/a',
1460
+ 1 => 'Human Eye/Face/Body',
1461
+ 2 => 'Animal', #PH (NC) (DC-S5 and DC-S5M2)
1462
+ 3 => 'Human Eye/Face',
1463
+ 4 => 'Animal Body',
1464
+ 5 => 'Animal Eye/Body',
1465
+ 6 => 'Car',
1466
+ 7 => 'Motorcycle',
1467
+ 8 => 'Car (main part priority)',
1468
+ 9 => 'Motorcycle (helmet priority)',
1469
+ 10 => 'Train',
1470
+ 11 => 'Train (main part priority)',
1471
+ 12 => 'Airplane',
1472
+ 13 => 'Airplane (nose priority)',
1473
+ }
1474
+ },
1451
1475
  0xee => { #PH (DC-GH6)
1452
1476
  Name => 'DynamicRangeBoost',
1453
1477
  Writable => 'int16u',
@@ -2802,7 +2826,7 @@ sub ProcessLeicaTrailer($;$)
2802
2826
  }
2803
2827
  } else { # M (Type 240)
2804
2828
  # scan for the lens type (M writes 114 bytes of garbage first)
2805
- if ($buff =~ /\G.{114}([\x20-\x7f]*\0*)/sg and length($1) >= 50) {
2829
+ if ($buff =~ /\G.{114}([\x20-\x7e]*\0*)/sg and length($1) >= 50) {
2806
2830
  $expect = 114;
2807
2831
  }
2808
2832
  }
@@ -2902,7 +2926,7 @@ Panasonic and Leica maker notes in EXIF information.
2902
2926
 
2903
2927
  =head1 AUTHOR
2904
2928
 
2905
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2929
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2906
2930
 
2907
2931
  This library is free software; you can redistribute it and/or modify it
2908
2932
  under the same terms as Perl itself.
@@ -935,7 +935,7 @@ write meta information in Panasonic/Leica RAW, RW2 and RWL images.
935
935
 
936
936
  =head1 AUTHOR
937
937
 
938
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
938
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
939
939
 
940
940
  This library is free software; you can redistribute it and/or modify it
941
941
  under the same terms as Perl itself.