exiftool_vendored 13.10.0 → 13.14.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. checksums.yaml +4 -4
  2. data/bin/Changes +82 -19
  3. data/bin/MANIFEST +6 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +3 -3
  7. data/bin/arg_files/exif2xmp.args +4 -0
  8. data/bin/arg_files/xmp2exif.args +2 -1
  9. data/bin/build_geolocation +1 -1
  10. data/bin/exiftool +208 -150
  11. data/bin/lib/File/RandomAccess.pm +1 -1
  12. data/bin/lib/File/RandomAccess.pod +2 -2
  13. data/bin/lib/Image/ExifTool/AAC.pm +1 -1
  14. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  15. data/bin/lib/Image/ExifTool/AFCP.pm +6 -6
  16. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  17. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  18. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  19. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  20. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  21. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  23. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  24. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  25. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  26. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +29 -18
  27. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  28. data/bin/lib/Image/ExifTool/Canon.pm +8 -4
  29. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  30. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  31. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  32. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  33. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  34. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DJI.pm +150 -46
  37. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  38. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  39. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  40. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  41. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  42. data/bin/lib/Image/ExifTool/EXE.pm +123 -32
  43. data/bin/lib/Image/ExifTool/Exif.pm +7 -4
  44. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  45. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  46. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  47. data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  48. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  49. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  50. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  51. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  52. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  53. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  55. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  56. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  57. data/bin/lib/Image/ExifTool/GM.pm +1 -1
  58. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  59. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  60. data/bin/lib/Image/ExifTool/Geolocation.pm +17 -8
  61. data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  62. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  63. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  64. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  65. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  66. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  67. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  68. data/bin/lib/Image/ExifTool/ICO.pm +1 -1
  69. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  70. data/bin/lib/Image/ExifTool/IPTC.pm +8 -5
  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 +5 -4
  74. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  75. data/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  76. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  77. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  78. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  79. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  81. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  82. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  83. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  84. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  96. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  97. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  98. data/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  99. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  100. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  101. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  102. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  103. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  104. data/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
  105. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  106. data/bin/lib/Image/ExifTool/M2TS.pm +22 -13
  107. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  109. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  110. data/bin/lib/Image/ExifTool/MISB.pm +1 -1
  111. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  114. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  115. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  116. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  117. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  118. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  119. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  120. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  121. data/bin/lib/Image/ExifTool/Matroska.pm +12 -4
  122. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  123. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  124. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  125. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  126. data/bin/lib/Image/ExifTool/Nikon.pm +166 -35
  127. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  128. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  129. data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  130. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  131. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  134. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  135. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  136. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  138. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  143. data/bin/lib/Image/ExifTool/PNG.pm +1 -1
  144. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  145. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  147. data/bin/lib/Image/ExifTool/Panasonic.pm +20 -2
  148. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  149. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  150. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  151. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  152. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  153. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  155. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  156. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Protobuf.pm +48 -20
  158. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  159. data/bin/lib/Image/ExifTool/QuickTime.pm +206 -66
  160. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +21 -303
  161. data/bin/lib/Image/ExifTool/README +4 -0
  162. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  163. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  164. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  166. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  168. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  169. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  170. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  172. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  175. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  176. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  177. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  178. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  179. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  180. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  181. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  182. data/bin/lib/Image/ExifTool/TagLookup.pm +3449 -3435
  183. data/bin/lib/Image/ExifTool/TagNames.pod +164 -47
  184. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  185. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  186. data/bin/lib/Image/ExifTool/Torrent.pm +3 -3
  187. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  188. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  189. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  190. data/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  191. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  192. data/bin/lib/Image/ExifTool/WPG.pm +1 -1
  193. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  194. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  195. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  196. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  197. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  198. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  199. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  200. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  201. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +74 -43
  202. data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
  203. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  204. data/bin/lib/Image/ExifTool/Writer.pl +21 -16
  205. data/bin/lib/Image/ExifTool/XISF.pm +1 -1
  206. data/bin/lib/Image/ExifTool/XMP.pm +1 -1
  207. data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
  208. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  209. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  210. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  211. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  212. data/bin/lib/Image/ExifTool.pm +34 -12
  213. data/bin/lib/Image/ExifTool.pod +57 -46
  214. data/bin/perl-Image-ExifTool.spec +1 -1
  215. data/lib/exiftool_vendored/version.rb +1 -1
  216. metadata +4 -2
@@ -5,22 +5,30 @@
5
5
  #
6
6
  # Revisions: 2016-07-25 - P. Harvey Created
7
7
  # 2017-06-23 - PH Added XMP tags
8
+ # 2024-12-04 - PH Added protobuf tags
8
9
  #------------------------------------------------------------------------------
9
10
 
10
11
  package Image::ExifTool::DJI;
11
12
 
12
13
  use strict;
13
- use vars qw($VERSION);
14
+ use vars qw($VERSION %knownProtocol);
14
15
  use Image::ExifTool qw(:DataAccess :Utils);
15
16
  use Image::ExifTool::Exif;
16
17
  use Image::ExifTool::XMP;
17
18
  use Image::ExifTool::GPS;
18
19
  use Image::ExifTool::Protobuf;
19
20
 
20
- $VERSION = '1.10';
21
+ $VERSION = '1.12';
21
22
 
22
23
  sub ProcessDJIInfo($$$);
23
24
 
25
+ %knownProtocol = (
26
+ 'dvtm_ac203.proto' => 1, # Osmo Action 4
27
+ 'dvtm_ac204.proto' => 1, # Osmo Action 5
28
+ 'dvtm_AVATA2.proto' => 1, # Avanta 2
29
+ 'dvtm_wm265e.proto' => 1, # Mavic 3
30
+ );
31
+
24
32
  my %convFloat2 = (
25
33
  PrintConv => 'sprintf("%+.2f", $val)',
26
34
  PrintConvInv => '$val',
@@ -189,47 +197,50 @@ my %convFloat2 = (
189
197
 
190
198
  # metadata in protobuf format (djmd and dbgi meta types, ref PH)
191
199
  %Image::ExifTool::DJI::Protobuf = (
192
- GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
200
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
193
201
  TAG_PREFIX => '',
194
202
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
195
203
  NOTES => q{
196
- Tags found in protobuf-format DJI meta djmd and dbgi timed metadata. Only a
197
- few tags are currently known, but unknown djmd tags may be extracted by
198
- setting the Unknown option to 1 (or 2 to also extract unknown dbgi debug
199
- tags). Tag ID's are composed of the corresponding .proto file name combined
200
- with the hierarchical protobuf field numbers. The "dvtm_AVATA2.proto" file
201
- is used by the DJI Avanta 2, and "dvtm_ac203.proto" by the OsmoAction4.
204
+ Tags found in protobuf-format DJI djmd and dbgi timed metadata. The known
205
+ tags listed below are extracted by default, but unknown djmd tags may be
206
+ extracted as well by setting the Unknown option to 1, or 2 to also extract
207
+ unknown dbgi debug tags. Tag ID's are composed of the corresponding .proto
208
+ file name combined with the hierarchical protobuf field numbers.
209
+
210
+ ExifTool currently extracts timed GPS plus a few other tags from DJI devices
211
+ which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
212
+ dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
213
+ dvtm_wm265e.proto (Mavic 3).
214
+
215
+ Note that with the protobuf format, numerical tags missing from the output
216
+ for a given protocol should be considered to have the default value of 0.
217
+ },
218
+ Protocol => {
219
+ RawConv => q{
220
+ unless ($Image::ExifTool::DJI::knownProtocol{$val}) {
221
+ $self->Warn("Unknown protocol $val (please submit sample for testing)");
222
+ }
223
+ return $val;
224
+ },
202
225
  },
203
- Protocol => { },
226
+ #
227
+ # Osmo Action 4
228
+ #
229
+ 'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
204
230
  # dvtm_ac203_1-1-6 - some version number
205
231
  'dvtm_ac203_1-1-10' => 'Model',
206
- 'dvtm_ac203_2-3-1' => { Name => 'FrameWidth', Format => 'unsigned' },
207
- 'dvtm_ac203_2-3-2' => { Name => 'FrameHeight', Format => 'unsigned' },
208
- 'dvtm_ac203_2-3-3' => { Name => 'FrameRate', Format => 'float' },
209
- # dvtm_ac203_3-4-1-4 - model code?
210
- 'dvtm_ac203_3-4-2-1-1' => {
211
- Name => 'CoordinateUnits',
212
- Format => 'unsigned',
213
- # don't extract this -- just convert to degrees
214
- RawConv => '$$self{CoordUnits} = $val; undef',
215
- Hidden => 1,
216
- # PrintConv => { 0 => 'Radians', 1 => 'Degrees' },
217
- },
218
- 'dvtm_ac203_3-4-2-1-2' => {
219
- Name => 'GPSLatitude',
220
- Format => 'double',
221
- # set ExifTool GPSLatitude/GPSLongitude members so GPSDateTime will be generated if necessary
222
- RawConv => '$$self{GPSLatitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
223
- PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
232
+ 'dvtm_ac203_2-3' => {
233
+ Name => 'FrameInfo',
234
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
224
235
  },
225
- 'dvtm_ac203_3-4-2-1-3' => {
226
- Name => 'GPSLongitude',
227
- Format => 'double',
228
- RawConv => '$$self{GPSLongitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
229
- PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
236
+ # dvtm_ac203_3-4-1-4 - model code?
237
+ 'dvtm_ac203_3-4-2-1' => {
238
+ Name => 'GPSInfo',
239
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
230
240
  },
231
241
  'dvtm_ac203_3-4-2-2' => {
232
242
  Name => 'GPSAltitude',
243
+ Groups => { 2 => 'Location' },
233
244
  Format => 'unsigned',
234
245
  ValueConv => '$val / 1000',
235
246
  },
@@ -241,38 +252,131 @@ my %convFloat2 = (
241
252
  ValueConv => '$val =~ tr/-/:/; $val',
242
253
  PrintConv => '$self->ConvertDateTime($val)',
243
254
  },
255
+ #
256
+ # Osmo Action 5
257
+ #
258
+ 'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
259
+ # dvtm_ac204_1-1-6 - some version number
260
+ 'dvtm_ac204_1-1-10' => 'Model',
261
+ 'dvtm_ac204_2-3' => {
262
+ Name => 'FrameInfo',
263
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
264
+ },
265
+ # dvtm_ac204_3-4-1-4 - model code?
266
+ 'dvtm_ac204_3-4-2-1' => {
267
+ Name => 'GPSInfo',
268
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
269
+ },
270
+ # dvtm_ac204_3-2-4-1 - shutter speed? (rational)
271
+ 'dvtm_ac204_3-4-2-2' => {
272
+ Name => 'GPSAltitude',
273
+ Groups => { 2 => 'Location' },
274
+ Format => 'unsigned',
275
+ ValueConv => '$val / 1000',
276
+ },
277
+ 'dvtm_ac204_3-4-2-6-1' => {
278
+ Name => 'GPSDateTime',
279
+ Format => 'string',
280
+ Groups => { 2 => 'Time' },
281
+ RawConv => '$$self{GPSDateTime} = $val',
282
+ ValueConv => '$val =~ tr/-/:/; $val',
283
+ PrintConv => '$self->ConvertDateTime($val)',
284
+ },
285
+ #
286
+ # Avanta 2
287
+ #
244
288
  # dvtm_AVATA2_1-1-2 - some version number
245
289
  # dvtm_AVATA2_1-1-3 - some version number
290
+ 'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
246
291
  'dvtm_AVATA2_1-1-10' => 'Model',
247
- 'dvtm_AVATA2_2-2-3-1' => 'SerialNumber', # (NC)
248
- 'dvtm_AVATA2_2-3-1' => { Name => 'FrameWidth', Format => 'unsigned' },
249
- 'dvtm_AVATA2_2-3-2' => { Name => 'FrameHeight', Format => 'unsigned' },
250
- 'dvtm_AVATA2_2-3-3' => { Name => 'FrameRate', Format => 'float' },
292
+ # dvtm_AVATA2_2-2-1-4 - model code?
293
+ 'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
294
+ 'dvtm_AVATA2_2-3' => {
295
+ Name => 'FrameInfo',
296
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
297
+ },
251
298
  # dvtm_AVATA2_3-1-1 - frame number (starting at 1)
252
299
  'dvtm_AVATA2_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
253
300
  Name => 'TimeStamp',
301
+ Groups => { 2 => 'Time' },
254
302
  Format => 'unsigned',
255
303
  # milliseconds, but I don't know what the zero is
256
304
  ValueConv => '$val / 1e6',
257
305
  },
258
306
  # dvtm_AVATA2_3-2-1-4 - model code?
307
+ # dvtm_AVATA2_3-2-1-5 - frame rate?
308
+ # dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
259
309
  # dvtm_AVATA2_3-4-1-4 - model code?
260
- 'dvtm_AVATA2_3-4-4-1-1' => { # (NC) (default seems to be radians if missing)
261
- Name => 'CoordinateDegrees',
310
+ # dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
311
+ 'dvtm_AVATA2_3-4-4-1' => {
312
+ Name => 'GPSInfo',
313
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
314
+ },
315
+ #
316
+ # Mavic 3
317
+ #
318
+ 'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
319
+ 'dvtm_wm265e_1-1-10' => 'Model',
320
+ 'dvtm_wm265e_2-2' => {
321
+ Name => 'FrameInfo',
322
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
323
+ },
324
+ # dvtm_wm265e_3-2-1-4 - model code?
325
+ 'dvtm_wm265e_3-2-2-1' => { Name => 'ISO', Format => 'float' },
326
+ 'dvtm_wm265e_3-2-3-1' => {
327
+ Name => 'ShutterSpeed',
328
+ Format => 'rational',
329
+ ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
330
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
331
+ },
332
+ # dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
333
+ 'dvtm_wm265e_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
334
+ 'dvtm_wm265e_3-3-4-1' => {
335
+ Name => 'GPSInfo',
336
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
337
+ },
338
+ 'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
339
+ 'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
340
+ 'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
341
+ 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
342
+ 'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
343
+ 'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
344
+ 'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
345
+ 'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
346
+ );
347
+
348
+ %Image::ExifTool::DJI::FrameInfo = (
349
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
350
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
351
+ VARS => { HEX_ID => 0 },
352
+ 1 => { Name => 'FrameWidth', Format => 'unsigned' },
353
+ 2 => { Name => 'FrameHeight', Format => 'unsigned' },
354
+ 3 => { Name => 'FrameRate', Format => 'float' },
355
+ );
356
+
357
+ %Image::ExifTool::DJI::GPSInfo = (
358
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
359
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
360
+ VARS => { HEX_ID => 0 },
361
+ 1 => {
362
+ Name => 'CoordinateUnits',
262
363
  Format => 'unsigned',
263
- RawConv => '$$self{CoordDegrees} = $val; undef',
264
- Hidden => 1,
364
+ Notes => 'not extracted, but used internally to convert coordinates to degrees',
365
+ # don't extract this -- just convert to degrees
366
+ RawConv => '$$self{CoordUnits} = $val; undef',
367
+ # PrintConv => { 0 => 'Radians', 1 => 'Degrees' },
265
368
  },
266
- 'dvtm_AVATA2_3-4-4-1-2' => {
369
+ 2 => {
267
370
  Name => 'GPSLatitude',
268
371
  Format => 'double',
269
- RawConv => '$$self{GPSLatitude} = $$self{CoordDegrees} ? $val : $val * 180 / 3.141592653589793', # (NC)
372
+ # set ExifTool GPSLatitude/GPSLongitude members so GPSDateTime will be generated if necessary
373
+ RawConv => '$$self{GPSLatitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
270
374
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
271
375
  },
272
- 'dvtm_AVATA2_3-4-4-1-3' => {
376
+ 3 => {
273
377
  Name => 'GPSLongitude',
274
378
  Format => 'double',
275
- RawConv => '$$self{GPSLongitude} = $$self{CoordDegrees} ? $val : $val * 180 / 3.141592653589793', # (NC)
379
+ RawConv => '$$self{GPSLongitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
276
380
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
277
381
  },
278
382
  );
@@ -328,7 +432,7 @@ the maker notes in images from some DJI Phantom drones.
328
432
 
329
433
  =head1 AUTHOR
330
434
 
331
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
435
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
332
436
 
333
437
  This library is free software; you can redistribute it and/or modify it
334
438
  under the same terms as Perl itself.
@@ -849,7 +849,7 @@ information in DNG (Digital Negative) images.
849
849
 
850
850
  =head1 AUTHOR
851
851
 
852
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
852
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
853
853
 
854
854
  This library is free software; you can redistribute it and/or modify it
855
855
  under the same terms as Perl itself.
@@ -225,7 +225,7 @@ metadata from DPX (Digital Picture Exchange) images.
225
225
 
226
226
  =head1 AUTHOR
227
227
 
228
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
228
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
229
229
 
230
230
  This library is free software; you can redistribute it and/or modify it
231
231
  under the same terms as Perl itself.
@@ -291,7 +291,7 @@ information from DV (raw Digital Video) files.
291
291
 
292
292
  =head1 AUTHOR
293
293
 
294
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
294
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
295
295
 
296
296
  This library is free software; you can redistribute it and/or modify it
297
297
  under the same terms as Perl itself.
@@ -372,7 +372,7 @@ This file contains tag definitions for the Darwin Core XMP namespace.
372
372
 
373
373
  =head1 AUTHOR
374
374
 
375
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
375
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
376
376
 
377
377
  This library is free software; you can redistribute it and/or modify it
378
378
  under the same terms as Perl itself.
@@ -353,7 +353,7 @@ Image::ExifTool::AIFF.
353
353
 
354
354
  =head1 AUTHOR
355
355
 
356
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
356
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
357
357
 
358
358
  This library is free software; you can redistribute it and/or modify it
359
359
  under the same terms as Perl itself.
@@ -13,6 +13,7 @@
13
13
  # 5) http://msdn.microsoft.com/en-us/library/ms809762.aspx
14
14
  # 6) http://code.google.com/p/pefile/
15
15
  # 7) http://www.codeproject.com/KB/DLL/showver.aspx
16
+ # 8) https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
16
17
  #------------------------------------------------------------------------------
17
18
 
18
19
  package Image::ExifTool::EXE;
@@ -21,7 +22,7 @@ use strict;
21
22
  use vars qw($VERSION);
22
23
  use Image::ExifTool qw(:DataAccess :Utils);
23
24
 
24
- $VERSION = '1.19';
25
+ $VERSION = '1.21';
25
26
 
26
27
  sub ProcessPEResources($$);
27
28
  sub ProcessPEVersion($$);
@@ -171,6 +172,13 @@ my %languageCode = (
171
172
  '100C' => 'French (Swiss)',
172
173
  );
173
174
 
175
+ my %int32uTime = (
176
+ Format => 'int32u',
177
+ Groups => { 0 => 'EXE', 1 => 'EXE', 2 => 'Time' },
178
+ ValueConv => 'ConvertUnixTime($val,1)',
179
+ PrintConv => '$self->ConvertDateTime($val)',
180
+ );
181
+
174
182
  # Information extracted from PE COFF (Windows EXE) file header
175
183
  %Image::ExifTool::EXE::Main = (
176
184
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -215,13 +223,7 @@ my %languageCode = (
215
223
  0xc0ee => 'clr pure MSIL',
216
224
  },
217
225
  },
218
- 2 => {
219
- Name => 'TimeStamp',
220
- Format => 'int32u',
221
- Groups => { 2 => 'Time' },
222
- ValueConv => 'ConvertUnixTime($val,1)',
223
- PrintConv => '$self->ConvertDateTime($val)',
224
- },
226
+ 2 => { Name => 'TimeStamp', %int32uTime },
225
227
  9 => {
226
228
  Name => 'ImageFileCharacteristics',
227
229
  # ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_file_header
@@ -243,6 +245,10 @@ my %languageCode = (
243
245
  15 => 'Bytes reversed hi',
244
246
  }},
245
247
  },
248
+ #
249
+ # optional header starts at index 10
250
+ # (note: all extracted tags are the same for 32 and 64-bit versions of the optional header)
251
+ #
246
252
  10 => {
247
253
  Name => 'PEType',
248
254
  PrintHex => 1,
@@ -308,6 +314,42 @@ my %languageCode = (
308
314
  },
309
315
  );
310
316
 
317
+ # information extracted from newer CodeView PDB70 ("RSDS") debug entry
318
+ %Image::ExifTool::EXE::DebugRSDS = (
319
+ GROUPS => { 2 => 'Other' },
320
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
321
+ NOTES => 'CodeView RSDS debug information found in some Windows EXE files.',
322
+ 0 => {
323
+ Name => 'PDBModifyDate',
324
+ Notes => 'Taken from debug directory entry pointing to RSDS record.',
325
+ %int32uTime,
326
+ },
327
+ 20 => { Name => 'PDBAge', Format => 'int32u' },
328
+ 24 => { Name => 'PDBFileName', Format => 'string' },
329
+ );
330
+
331
+ # information extracted from older CodeView PDB20 ("NB10") debug entry
332
+ %Image::ExifTool::EXE::DebugNB10 = (
333
+ GROUPS => { 2 => 'Other' },
334
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
335
+ NOTES => 'CodeView NB10 debug information found in some Windows EXE files.',
336
+ 0 => {
337
+ Name => 'PDBModifyDate',
338
+ Notes => 'Taken from debug directory entry pointing to NB10 record.',
339
+ %int32uTime,
340
+ },
341
+ 8 => { Name => 'PDBCreateDate',%int32uTime },
342
+ 12 => { Name => 'PDBAge', Format => 'int32u' },
343
+ 16 => { Name => 'PDBFileName', Format => 'string' },
344
+ );
345
+
346
+ %Image::ExifTool::EXE::Misc = (
347
+ GROUPS => { 2 => 'Other' },
348
+ VARS => { ID_LABEL => 'Index1' },
349
+ NOTES => 'Miscellaneous CodeView debug information in Windows EXE files.',
350
+ 12 => 'EXEFileName',
351
+ );
352
+
311
353
  # PE file version information (ref 6)
312
354
  %Image::ExifTool::EXE::PEVersion = (
313
355
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -974,6 +1016,22 @@ sub ProcessPEVersion($$)
974
1016
  return 1;
975
1017
  }
976
1018
 
1019
+ #------------------------------------------------------------------------------
1020
+ # Get actual file offset given a virtual address in a PE file
1021
+ # Inputs: 0) virtual address, 1) section list ref
1022
+ # Returns: absolute file offset or undef on error
1023
+ sub GetFileOffset($$)
1024
+ {
1025
+ my ($addr, $sections) = @_;
1026
+ my $section;
1027
+ foreach $section (@$sections) {
1028
+ next unless $addr >= $$section{VirtualAddress} and
1029
+ $addr < $$section{VirtualAddress} + $$section{Size};
1030
+ return $addr + $$section{Base} - $$section{VirtualAddress};
1031
+ }
1032
+ return undef;
1033
+ }
1034
+
977
1035
  #------------------------------------------------------------------------------
978
1036
  # Process Windows PE Resources
979
1037
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref
@@ -994,6 +1052,7 @@ sub ProcessPEResources($$)
994
1052
  my $nameEntries = Get16u(\$buff, 12);
995
1053
  my $idEntries = Get16u(\$buff, 14);
996
1054
  my $count = $nameEntries + $idEntries;
1055
+ return 0 if $count > 10000;
997
1056
  $raf->Read($buff, $count * 8) == $count * 8 or return 0;
998
1057
  # loop through all resource entries
999
1058
  for ($item=0; $item<$count; ++$item) {
@@ -1023,18 +1082,12 @@ sub ProcessPEResources($$)
1023
1082
  # get position of this resource in the file
1024
1083
  my $buf2;
1025
1084
  $raf->Seek($entryPos + $base, 0) and $raf->Read($buf2, 16) == 16 or return 0;
1026
- my $off = Get32u(\$buf2, 0);
1085
+ my $addr = Get32u(\$buf2, 0);
1027
1086
  my $len = Get32u(\$buf2, 4);
1028
1087
  # determine which section this is in so we can convert the virtual address
1029
- my ($section, $filePos);
1030
- foreach $section (@{$$dirInfo{Sections}}) {
1031
- next unless $off >= $$section{VirtualAddress} and
1032
- $off < $$section{VirtualAddress} + $$section{Size};
1033
- $filePos = $off + $$section{Base} - $$section{VirtualAddress};
1034
- last;
1035
- }
1036
- return 0 unless $filePos;
1037
- $raf->Seek($filePos, 0) and $raf->Read($buf2, $len) == $len or return 0;
1088
+ my $fileOff = GetFileOffset($addr, $$dirInfo{Sections});
1089
+ return 0 unless $fileOff;
1090
+ $raf->Seek($fileOff, 0) and $raf->Read($buf2, $len) == $len or return 0;
1038
1091
  ProcessPEVersion($et, {
1039
1092
  DataPt => \$buf2,
1040
1093
  DataLen => $len,
@@ -1050,7 +1103,8 @@ sub ProcessPEResources($$)
1050
1103
  #------------------------------------------------------------------------------
1051
1104
  # Process Windows PE file data dictionary
1052
1105
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref
1053
- # Returns: true on success
1106
+ # Returns: true on success or if the PE resources didn't exist, or false on error
1107
+ # processing the PE resources
1054
1108
  sub ProcessPEDict($$)
1055
1109
  {
1056
1110
  my ($et, $dirInfo) = @_;
@@ -1078,6 +1132,7 @@ sub ProcessPEDict($$)
1078
1132
  Sections => \@sections,
1079
1133
  );
1080
1134
  }
1135
+ $$dirInfo{Sections} = \@sections; # return section information
1081
1136
  # process the first resource section
1082
1137
  ProcessPEResources($et, \%dirInfo) or return 0 if %dirInfo;
1083
1138
  return 1;
@@ -1228,11 +1283,12 @@ sub ProcessEXE($$)
1228
1283
  # read the rest of the optional header if necessary
1229
1284
  my $optSize = Get16u(\$buff, 20);
1230
1285
  my $more = $optSize + 24 - $size;
1286
+ my $magic = 0;
1231
1287
  if ($more > 0) {
1232
1288
  if ($raf->Read($buf2, $more) == $more) {
1233
1289
  $buff .= $buf2;
1234
1290
  $size += $more;
1235
- my $magic = Get16u(\$buff, 24);
1291
+ $magic = Get16u(\$buff, 24);
1236
1292
  # verify PE magic number
1237
1293
  unless ($magic == 0x107 or $magic == 0x10b or $magic == 0x20b) {
1238
1294
  $et->Warn('Unknown PE magic number');
@@ -1246,21 +1302,54 @@ sub ProcessEXE($$)
1246
1302
  # process PE COFF file header
1247
1303
  $tagTablePtr = GetTagTable('Image::ExifTool::EXE::Main');
1248
1304
  %dirInfo = (
1249
- DataPt => \$buff,
1250
- DataPos => $raf->Tell() - $size,
1251
- DataLen => $size,
1305
+ DataPt => \$buff,
1306
+ DataPos => $raf->Tell() - $size,
1307
+ DataLen => $size,
1252
1308
  DirStart => 4,
1253
- DirLen => $size - 4,
1309
+ DirLen => $size - 4,
1254
1310
  );
1255
1311
  $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
1256
- # process data dictionary
1257
1312
  my $num = Get16u(\$buff, 6); # NumberOfSections
1258
- if ($raf->Read($buff, 40 * $num) == 40 * $num) {
1259
- %dirInfo = (
1260
- RAF => $raf,
1261
- DataPt => \$buff,
1262
- );
1263
- ProcessPEDict($et, \%dirInfo) or $et->Warn('Error processing PE data dictionary');
1313
+ # image data directory entry for debug info is index 6,
1314
+ # so offset is 4 bytes + 20 byte header + 96 bytes into PE32 optional
1315
+ # header (or 112 bytes for PE32+) + 6 * 8 bytes into data directory
1316
+ my $dirEntry = $magic == 0x20b ? 184 : 168;
1317
+ my ($addr, $len, $pos, $buf2); # virtual address/size of debug section
1318
+ if (length($buff) >= $dirEntry + 8) {
1319
+ $addr = Get32u(\$buff, $dirEntry);
1320
+ $len = Get32u(\$buff, $dirEntry+4);
1321
+ }
1322
+ # process data dictionary
1323
+ # (ref https://www.debuginfo.com/articles/debuginfomatch.html)
1324
+ return 1 unless $raf->Read($buff, 40 * $num) == 40 * $num;
1325
+ %dirInfo = ( RAF => $raf, DataPt => \$buff );
1326
+ ProcessPEDict($et, \%dirInfo) or $et->Warn('Error processing PE resources');
1327
+ # dive into debug section to extract pdb info if available
1328
+ return 1 unless $addr and $len < 2800 and $dirInfo{Sections} and
1329
+ ($magic == 0x10b or $magic == 0x20b);
1330
+ # get file offset for debug section
1331
+ my $off = GetFileOffset($addr, $dirInfo{Sections});
1332
+ return 1 unless $off and $raf->Seek($off,0) and
1333
+ $raf->Read($buff,$len) == $len;
1334
+ for ($pos=0; $pos+28<=$len; $pos+=28) {
1335
+ my $type = Get32u(\$buff,$pos+12);
1336
+ next unless $type == 2 or $type == 4; # (CodeView debug data)
1337
+ my ($n, $of) = (Get32u(\$buff,$pos+16), Get32u(\$buff,$pos+24));
1338
+ next unless $n < 1e4 and $raf->Seek($of,0) and $raf->Read($buf2,$n) == $n;
1339
+ if ($type == 2) { # CodeView debug info
1340
+ next unless $buf2 =~ /^(RSDS|NB10)/;
1341
+ $tagTablePtr = GetTagTable("Image::ExifTool::EXE::Debug$1");
1342
+ substr($buf2,0,4) = substr($buff,$pos+4,4); # use timestamp from debug dir
1343
+ %dirInfo = ( DataPt => \$buf2, DataPos => $of );
1344
+ $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
1345
+ } else { # misc debug info
1346
+ next unless $n > 12;
1347
+ my $exe = substr($buf2,12);
1348
+ $exe = $et->Decode($exe, 'UCS2') if Get32u(\$buf2,8);
1349
+ $exe =~ s/\0.*//; # truncate at null
1350
+ $tagTablePtr = GetTagTable('Image::ExifTool::EXE::Misc');
1351
+ $et->HandleTag($tagTablePtr, 12, $exe, DataPt => \$buf2, DataPos => $of);
1352
+ }
1264
1353
  }
1265
1354
  return 1;
1266
1355
  }
@@ -1454,7 +1543,7 @@ library files.
1454
1543
 
1455
1544
  =head1 AUTHOR
1456
1545
 
1457
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1546
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1458
1547
 
1459
1548
  This library is free software; you can redistribute it and/or modify it
1460
1549
  under the same terms as Perl itself.
@@ -1477,6 +1566,8 @@ under the same terms as Perl itself.
1477
1566
 
1478
1567
  =item L<http://www.codeproject.com/KB/DLL/showver.aspx>
1479
1568
 
1569
+ =item L<https://learn.microsoft.com/en-us/windows/win32/debug/pe-format>
1570
+
1480
1571
  =back
1481
1572
 
1482
1573
  =head1 SEE ALSO
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.55';
60
+ $VERSION = '4.56';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -246,10 +246,13 @@ $formatName[129] = 'utf8'; # (Exif 3.0)
246
246
  # 34888,34889 - ESRI reserved
247
247
  34892 => 'Lossy JPEG', # (DNG 1.4)
248
248
  34925 => 'LZMA2', #LibTiff
249
- 34926 => 'Zstd', #LibTiff
250
- 34927 => 'WebP', #LibTiff
249
+ 34926 => 'Zstd (old)', #LibTiff
250
+ 34927 => 'WebP (old)', #LibTiff
251
251
  34933 => 'PNG', # (TIFF mail list)
252
252
  34934 => 'JPEG XR', # (TIFF mail list)
253
+ 50000 => 'Zstd', #LibTiff 4.7
254
+ 50001 => 'WebP', #LibTiff 4.7
255
+ 50002 => 'JPEG XL (old)', #LibTiff 4.7
253
256
  52546 => 'JPEG XL', # (DNG 1.7)
254
257
  65000 => 'Kodak DCR Compressed', #PH
255
258
  65535 => 'Pentax PEF Compressed', #Jens
@@ -7140,7 +7143,7 @@ EXIF and TIFF meta information.
7140
7143
 
7141
7144
  =head1 AUTHOR
7142
7145
 
7143
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
7146
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
7144
7147
 
7145
7148
  This library is free software; you can redistribute it and/or modify it
7146
7149
  under the same terms as Perl itself.
@@ -137,7 +137,7 @@ information from FITS (Flexible Image Transport System) images.
137
137
 
138
138
  =head1 AUTHOR
139
139
 
140
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
140
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
141
141
 
142
142
  This library is free software; you can redistribute it and/or modify it
143
143
  under the same terms as Perl itself.
@@ -298,7 +298,7 @@ information from Free Lossless Audio Codec (FLAC) audio files.
298
298
 
299
299
  =head1 AUTHOR
300
300
 
301
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
301
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
302
302
 
303
303
  This library is free software; you can redistribute it and/or modify it
304
304
  under the same terms as Perl itself.
@@ -329,7 +329,7 @@ meta information in FLIF (Free Lossless Image Format) images.
329
329
 
330
330
  =head1 AUTHOR
331
331
 
332
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
332
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
333
333
 
334
334
  This library is free software; you can redistribute it and/or modify it
335
335
  under the same terms as Perl itself.
@@ -1633,7 +1633,7 @@ Systems Inc. thermal image files (FFF, FPF and JPEG format).
1633
1633
 
1634
1634
  =head1 AUTHOR
1635
1635
 
1636
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1636
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1637
1637
 
1638
1638
  This library is free software; you can redistribute it and/or modify it
1639
1639
  under the same terms as Perl itself.