exiftool_vendored 9.33.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 (864) hide show
  1. checksums.yaml +15 -0
  2. data/bin/Image-ExifTool-9.33/Changes +6241 -0
  3. data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
  4. data/bin/Image-ExifTool-9.33/META.yml +27 -0
  5. data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
  6. data/bin/Image-ExifTool-9.33/README +227 -0
  7. data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
  8. data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
  9. data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
  10. data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
  11. data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
  12. data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
  13. data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
  14. data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
  15. data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
  16. data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
  17. data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
  18. data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
  19. data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
  20. data/bin/Image-ExifTool-9.33/exiftool +5715 -0
  21. data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
  22. data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
  23. data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
  24. data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
  25. data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
  27. data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
  28. data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
  29. data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
  30. data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
  31. data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
  32. data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
  33. data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
  34. data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
  35. data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
  36. data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
  37. data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
  38. data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
  39. data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
  40. data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
  41. data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
  42. data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
  43. data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
  44. data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
  45. data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
  46. data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
  47. data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
  48. data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
  49. data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
  50. data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
  51. data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
  52. data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
  53. data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
  54. data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
  55. data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
  56. data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
  57. data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
  58. data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
  59. data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
  60. data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
  61. data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
  62. data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
  63. data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
  64. data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
  65. data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
  66. data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
  67. data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
  68. data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
  69. data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
  70. data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
  71. data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
  72. data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
  73. data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
  74. data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
  75. data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
  76. data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
  77. data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
  78. data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
  79. data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
  80. data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
  81. data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
  82. data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
  83. data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
  84. data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
  85. data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
  86. data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
  87. data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
  88. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
  89. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
  90. data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
  91. data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
  92. data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
  93. data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
  94. data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
  95. data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
  96. data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
  97. data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
  98. data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
  99. data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
  100. data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
  101. data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
  102. data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
  103. data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
  104. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
  105. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
  106. data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
  107. data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
  108. data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
  109. data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
  110. data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
  111. data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
  112. data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
  113. data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
  114. data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
  115. data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
  116. data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
  117. data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
  118. data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
  119. data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
  120. data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
  121. data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
  122. data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
  123. data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
  124. data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
  125. data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
  126. data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
  127. data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
  128. data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
  129. data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
  130. data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
  131. data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
  132. data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
  133. data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
  134. data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
  135. data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
  136. data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
  137. data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
  138. data/bin/Image-ExifTool-9.33/html/config.html +312 -0
  139. data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
  140. data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
  141. data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
  142. data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
  143. data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
  144. data/bin/Image-ExifTool-9.33/html/history.html +358 -0
  145. data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
  146. data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
  147. data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
  148. data/bin/Image-ExifTool-9.33/html/install.html +239 -0
  149. data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
  150. data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
  151. data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
  152. data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
  153. data/bin/Image-ExifTool-9.33/html/style.css +31 -0
  154. data/bin/Image-ExifTool-9.33/html/under.html +124 -0
  155. data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
  156. data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
  157. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
  158. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
  159. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
  160. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
  161. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
  162. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
  163. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
  164. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
  165. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
  166. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
  167. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
  168. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
  169. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
  170. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
  171. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
  172. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  173. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
  174. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  175. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
  176. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
  177. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
  178. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
  179. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
  180. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
  181. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
  182. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
  183. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
  184. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
  185. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
  186. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
  187. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
  188. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
  189. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
  190. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
  191. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
  192. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
  193. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
  194. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
  195. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
  196. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
  197. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
  198. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
  199. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
  200. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
  201. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
  202. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
  203. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
  204. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
  205. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
  206. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
  207. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
  208. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
  209. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
  210. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
  211. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
  212. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
  213. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
  214. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
  215. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
  216. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
  217. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
  218. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
  219. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
  220. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
  221. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
  222. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
  223. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
  224. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
  225. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
  226. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
  227. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  228. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
  229. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
  230. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
  231. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
  232. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
  233. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  234. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
  235. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
  236. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
  237. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
  238. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
  239. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
  240. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  241. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
  242. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  243. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
  244. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  245. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
  246. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  247. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
  248. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  249. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  250. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
  251. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  252. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  253. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
  254. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  255. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  256. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  257. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  258. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
  259. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
  260. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
  261. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  262. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  263. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
  264. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
  265. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
  266. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
  267. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
  268. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
  269. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
  270. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
  271. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
  272. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
  273. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
  274. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
  275. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
  276. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
  277. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
  278. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  279. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
  280. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
  281. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  282. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
  283. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
  284. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
  285. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
  286. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
  287. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
  288. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
  289. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
  290. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
  291. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
  292. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
  293. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
  294. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  295. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
  296. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
  297. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
  298. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  299. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
  300. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
  301. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
  302. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  303. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
  304. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
  305. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
  306. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
  307. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
  308. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
  309. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
  310. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
  311. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
  312. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
  313. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
  314. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
  315. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
  316. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
  317. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
  318. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  319. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
  320. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
  321. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
  322. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  323. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
  324. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
  325. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
  326. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
  327. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
  328. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  329. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
  330. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  331. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
  332. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
  333. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  334. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
  335. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  336. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
  337. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
  338. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
  339. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
  340. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
  341. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
  342. data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
  343. data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
  344. data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
  345. data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
  346. data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
  347. data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
  348. data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
  349. data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
  350. data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
  351. data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
  352. data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
  353. data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
  354. data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
  355. data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
  356. data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
  357. data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
  358. data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
  359. data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
  360. data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
  361. data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
  362. data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
  363. data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
  364. data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
  365. data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
  366. data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
  367. data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
  368. data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
  369. data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
  370. data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
  371. data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
  372. data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
  373. data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
  374. data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
  375. data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
  376. data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
  377. data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
  378. data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
  379. data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
  380. data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
  381. data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
  382. data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
  383. data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
  384. data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
  385. data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
  386. data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
  387. data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
  388. data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
  389. data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
  390. data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
  391. data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
  392. data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
  393. data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
  394. data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
  395. data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
  396. data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
  397. data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
  398. data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
  399. data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
  400. data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
  401. data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
  402. data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
  403. data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
  404. data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
  405. data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
  406. data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
  407. data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
  408. data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
  409. data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
  410. data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
  411. data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
  412. data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
  413. data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
  414. data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
  415. data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
  416. data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
  417. data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
  418. data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
  419. data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
  420. data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
  421. data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
  422. data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
  423. data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
  424. data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
  425. data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
  426. data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
  427. data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
  428. data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
  429. data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
  430. data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
  431. data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
  432. data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
  433. data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
  434. data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
  435. data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
  436. data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
  437. data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
  438. data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
  439. data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
  440. data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
  441. data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
  442. data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
  443. data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
  444. data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
  445. data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
  446. data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
  447. data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
  448. data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
  449. data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
  450. data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
  451. data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
  452. data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
  453. data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
  454. data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
  455. data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
  456. data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
  457. data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
  458. data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
  459. data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
  460. data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
  461. data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
  462. data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
  463. data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
  464. data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
  465. data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
  466. data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
  467. data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
  468. data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
  469. data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
  470. data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
  471. data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
  472. data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
  473. data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
  474. data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
  475. data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
  476. data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
  477. data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
  478. data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
  479. data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
  480. data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
  481. data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
  482. data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
  483. data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
  484. data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
  485. data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
  486. data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
  487. data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
  488. data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
  489. data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
  490. data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
  491. data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
  492. data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
  493. data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
  494. data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
  495. data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
  496. data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
  497. data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
  498. data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
  499. data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
  500. data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
  501. data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
  502. data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
  503. data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
  504. data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
  505. data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
  506. data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
  507. data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
  508. data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
  509. data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
  510. data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
  511. data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
  512. data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
  513. data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
  514. data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
  515. data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
  516. data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
  517. data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
  518. data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
  519. data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
  520. data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
  521. data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
  522. data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
  523. data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
  524. data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
  525. data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
  526. data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
  527. data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
  528. data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
  529. data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
  530. data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
  531. data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
  532. data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
  533. data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
  534. data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
  535. data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
  536. data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
  537. data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
  538. data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
  539. data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
  540. data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
  541. data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
  542. data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
  543. data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
  544. data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
  545. data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
  546. data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
  547. data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
  548. data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
  549. data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
  550. data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
  551. data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
  552. data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
  553. data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
  554. data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
  555. data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
  556. data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
  557. data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
  558. data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
  559. data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
  560. data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
  561. data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
  562. data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
  563. data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
  564. data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
  565. data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
  566. data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
  567. data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
  568. data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
  569. data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
  570. data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
  571. data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
  572. data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
  573. data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
  574. data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
  575. data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
  576. data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
  577. data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
  578. data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
  579. data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
  580. data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
  581. data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
  582. data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
  583. data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
  584. data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
  585. data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
  586. data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
  587. data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
  588. data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
  589. data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
  590. data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
  591. data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
  592. data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
  593. data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
  594. data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
  595. data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
  596. data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
  597. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
  598. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
  599. data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
  600. data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
  601. data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
  602. data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
  603. data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
  604. data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
  605. data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
  606. data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
  607. data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
  608. data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
  609. data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
  610. data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
  611. data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
  612. data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
  613. data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
  614. data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
  615. data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
  616. data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
  617. data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
  618. data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
  619. data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
  620. data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
  621. data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
  622. data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
  623. data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
  624. data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
  625. data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
  626. data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
  627. data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
  628. data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
  629. data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
  630. data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
  631. data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
  632. data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
  633. data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
  634. data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
  635. data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
  636. data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
  637. data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
  638. data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
  639. data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
  640. data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
  641. data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
  642. data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
  643. data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
  644. data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
  645. data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
  646. data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
  647. data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
  648. data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
  649. data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
  650. data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
  651. data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
  652. data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
  653. data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
  654. data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
  655. data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
  656. data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
  657. data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
  658. data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
  659. data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
  660. data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
  661. data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
  662. data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
  663. data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
  664. data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
  665. data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
  666. data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
  667. data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
  668. data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
  669. data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
  670. data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
  671. data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
  672. data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
  673. data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
  674. data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
  675. data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
  676. data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
  677. data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
  678. data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
  679. data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
  680. data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
  681. data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
  682. data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
  683. data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
  684. data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
  685. data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
  686. data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
  687. data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
  688. data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
  689. data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
  690. data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
  691. data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
  692. data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
  693. data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
  694. data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
  695. data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
  696. data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
  697. data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
  698. data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
  699. data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
  700. data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
  701. data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
  702. data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
  703. data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
  704. data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
  705. data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
  706. data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
  707. data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
  708. data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
  709. data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
  710. data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
  711. data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
  712. data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
  713. data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
  714. data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
  715. data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
  716. data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
  717. data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
  718. data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
  719. data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
  720. data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
  721. data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
  722. data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
  723. data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
  724. data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
  725. data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
  726. data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
  727. data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
  728. data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
  729. data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
  730. data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
  731. data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
  732. data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
  733. data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
  734. data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
  735. data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
  736. data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
  737. data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
  738. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
  739. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
  740. data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
  741. data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
  742. data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
  743. data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
  744. data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
  745. data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
  746. data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
  747. data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
  748. data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
  749. data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
  750. data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
  751. data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
  752. data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
  753. data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
  754. data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
  755. data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
  756. data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
  757. data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
  758. data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
  759. data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
  760. data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
  761. data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
  762. data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
  763. data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
  764. data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
  765. data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
  766. data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
  767. data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
  768. data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
  769. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
  770. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
  771. data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
  772. data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
  773. data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
  774. data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
  775. data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
  776. data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
  777. data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
  778. data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
  779. data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
  780. data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
  781. data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
  782. data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
  783. data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
  784. data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
  785. data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
  786. data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
  787. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
  788. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
  789. data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
  790. data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
  791. data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
  792. data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
  793. data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
  794. data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
  795. data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
  796. data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
  797. data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
  798. data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
  799. data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
  800. data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
  801. data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
  802. data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
  803. data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
  804. data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
  805. data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
  806. data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
  807. data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
  808. data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
  809. data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
  810. data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
  811. data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
  812. data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
  813. data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
  814. data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
  815. data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
  816. data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
  817. data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
  818. data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
  819. data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
  820. data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
  821. data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
  822. data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
  823. data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
  824. data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
  825. data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
  826. data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
  827. data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
  828. data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
  829. data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
  830. data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
  831. data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
  832. data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
  833. data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
  834. data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
  835. data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
  836. data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
  837. data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
  838. data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
  839. data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
  840. data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
  841. data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
  842. data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
  843. data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
  844. data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
  845. data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
  846. data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
  847. data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
  848. data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
  849. data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
  850. data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
  851. data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
  852. data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
  853. data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
  854. data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
  855. data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
  856. data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
  857. data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
  858. data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
  859. data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
  860. data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
  861. data/lib/exiftool_vendored.rb +10 -0
  862. data/lib/exiftool_vendored/version.rb +3 -0
  863. data/lib/exiftool_vendored/version_extractor.rb +17 -0
  864. metadata +977 -0
@@ -0,0 +1,1173 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: Geotag.pm
3
+ #
4
+ # Description: Geotagging utility routines
5
+ #
6
+ # Revisions: 2009/04/01 - P. Harvey Created
7
+ # 2009/09/27 - PH Added Geosync feature
8
+ # 2009/06/25 - PH Read Garmin TCX track logs
9
+ # 2009/09/11 - PH Read ITC GPS track logs
10
+ # 2012/01/08 - PH Extract orientation information from PTNTHPR
11
+ # 2012/05/08 - PH Read Winplus Beacon .TXT files
12
+ #
13
+ # References: 1) http://www.topografix.com/GPX/1/1/
14
+ # 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
15
+ # 3) http://code.google.com/apis/kml/documentation/kmlreference.html
16
+ # 4) http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf
17
+ #------------------------------------------------------------------------------
18
+
19
+ package Image::ExifTool::Geotag;
20
+
21
+ use strict;
22
+ use vars qw($VERSION);
23
+ use Image::ExifTool qw(:Public);
24
+
25
+ $VERSION = '1.36';
26
+
27
+ sub JITTER() { return 2 } # maximum time jitter
28
+
29
+ sub SetGeoValues($$;$);
30
+ sub PrintFix($@);
31
+
32
+ # XML tags that we recognize (keys are forced to lower case)
33
+ my %xmlTag = (
34
+ lat => 'lat', # GPX
35
+ latitude => 'lat', # Garmin
36
+ latitudedegrees => 'lat', # Garmin TCX
37
+ lon => 'lon', # GPX
38
+ longitude => 'lon', # Garmin
39
+ longitudedegrees => 'lon', # Garmin TCX
40
+ ele => 'alt', # GPX
41
+ elevation => 'alt', # PH
42
+ alt => 'alt', # PH
43
+ altitude => 'alt', # Garmin
44
+ altitudemeters => 'alt', # Garmin TCX
45
+ 'time' => 'time', # GPX/Garmin
46
+ fix => 'fixtype', # GPX
47
+ hdop => 'hdop', # GPX
48
+ vdop => 'vdop', # GPX
49
+ pdop => 'pdop', # GPX
50
+ sat => 'nsats', # GPX
51
+ when => 'time', # KML
52
+ coordinates => 'coords', # KML
53
+ course => 'dir', # (written by Arduino)
54
+ pitch => 'pitch', # (written by Arduino)
55
+ roll => 'roll', # (written by Arduino)
56
+ # XML containers (fix is reset at the opening tag of these properties)
57
+ wpt => '', # GPX
58
+ trkpt => '', # GPX
59
+ rtept => '', # GPX
60
+ trackpoint => '', # Garmin
61
+ placemark => '', # KML
62
+ );
63
+
64
+ # fix information keys which must be interpolated around a circle
65
+ my %cyclical = (lon => 1, track => 1, dir => 1, roll => 1);
66
+
67
+ # fix information keys for each of our general categories
68
+ my %fixInfoKeys = (
69
+ 'pos' => [ 'lat', 'lon' ],
70
+ track => [ 'track', 'speed' ],
71
+ alt => [ 'alt' ],
72
+ orient => [ 'dir', 'pitch', 'roll' ],
73
+ );
74
+
75
+ my %isOrient = ( dir => 1, pitch => 1, roll => 1 ); # test for orientation key
76
+
77
+ my $secPerDay = 24 * 3600; # a useful constant
78
+
79
+ #------------------------------------------------------------------------------
80
+ # Load GPS track log file
81
+ # Inputs: 0) ExifTool ref, 1) track log data or file name
82
+ # Returns: geotag hash data reference or error string
83
+ # - the geotag hash has the following members:
84
+ # Points - hash of GPS fix information hashes keyed by Unix time
85
+ # Times - list of sorted Unix times (keys of Points hash)
86
+ # NoDate - flag if some points have no date (ie. referenced to 1970:01:01)
87
+ # IsDate - flag if some points have date
88
+ # Has - hash of flags for available information (track, orient, alt)
89
+ # - the fix information hash may contain:
90
+ # lat - signed latitude (required)
91
+ # lon - signed longitude (required)
92
+ # alt - signed altitude
93
+ # time - fix time in UTC as XML string
94
+ # fixtype- type of fix ('none'|'2d'|'3d'|'dgps'|'pps')
95
+ # pdop - dilution of precision
96
+ # hdop - horizontal DOP
97
+ # vdop - vertical DOP
98
+ # sats - comma-separated list of active satellites
99
+ # nsats - number of active satellites
100
+ # track - track heading (deg true)
101
+ # dir - image direction (deg true)
102
+ # pitch - pitch angle (deg)
103
+ # roll - roll angle (deg)
104
+ # speed - speed (knots)
105
+ # first - flag set for first fix of track
106
+ # - concatenates new data with existing track data stored in ExifTool NEW_VALUE
107
+ # for the Geotag tag
108
+ sub LoadTrackLog($$;$)
109
+ {
110
+ local ($_, $/, *EXIFTOOL_TRKFILE);
111
+ my ($exifTool, $val) = @_;
112
+ my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
113
+ my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea);
114
+ my ($canCut, $cutPDOP, $cutHDOP, $cutSats);
115
+
116
+ unless (eval 'require Time::Local') {
117
+ return 'Geotag feature requires Time::Local installed';
118
+ }
119
+ # add data to existing track
120
+ my $geotag = $exifTool->GetNewValues('Geotag') || { };
121
+ # get lookup for available information types
122
+ my $has = $$geotag{Has};
123
+ $has or $has = $$geotag{Has} = { 'pos' => 1 };
124
+ my $format = '';
125
+ # is $val track log data?
126
+ if ($val =~ /^(\xef\xbb\xbf)?<(\?xml|gpx)[\s>]/) {
127
+ $format = 'XML';
128
+ $/ = '>'; # set input record separator to '>' for XML/GPX data
129
+ } elsif ($val =~ /(\x0d\x0a|\x0d|\x0a)/) {
130
+ $/ = $1;
131
+ } else {
132
+ # $val is track file name
133
+ open EXIFTOOL_TRKFILE, $val or return "Error opening GPS file '$val'";
134
+ $raf = new File::RandomAccess(\*EXIFTOOL_TRKFILE);
135
+ unless ($raf->Read($_, 256)) {
136
+ close EXIFTOOL_TRKFILE;
137
+ return "Empty track file '$val'";
138
+ }
139
+ # look for XML or GPX header (might as well allow UTF-8 BOM)
140
+ if (/^(\xef\xbb\xbf)?<(\?xml|gpx)[\s>]/) {
141
+ $format = 'XML';
142
+ $/ = '>'; # set input record separator to '>' for XML/GPX data
143
+ } elsif (/(\x0d\x0a|\x0d|\x0a)/) {
144
+ $/ = $1;
145
+ } else {
146
+ close EXIFTOOL_TRKFILE;
147
+ return "Invalid track file '$val'";
148
+ }
149
+ $raf->Seek(0,0);
150
+ $from = "file '$val'";
151
+ }
152
+ unless ($from) {
153
+ # set up RAF for reading log file in memory
154
+ $raf = new File::RandomAccess(\$val);
155
+ $from = 'data';
156
+ }
157
+ # initialize track points lookup
158
+ my $points = $$geotag{Points};
159
+ $points or $points = $$geotag{Points} = { };
160
+
161
+ # initialize cuts
162
+ my $maxHDOP = $exifTool->Options('GeoMaxHDOP');
163
+ my $maxPDOP = $exifTool->Options('GeoMaxPDOP');
164
+ my $minSats = $exifTool->Options('GeoMinSats');
165
+ my $isCut = $maxHDOP || $maxPDOP || $minSats;
166
+
167
+ my $numPoints = 0;
168
+ my $skipped = 0;
169
+ my $lastSecs = 0;
170
+ my $fix = { };
171
+ for (;;) {
172
+ $raf->ReadLine($_) or last;
173
+ # determine file format
174
+ if (not $format) {
175
+ if (/^<(\?xml|gpx)[\s>]/) { # look for XML or GPX header
176
+ $format = 'XML';
177
+ # check for NMEA sentence
178
+ # (must ONLY start with ones that have timestamps! ie. not GSA or PTNTHPR!)
179
+ } elsif (/^\$(GP(RMC|GGA|GLL)|PMGNTRK),/) {
180
+ $format = 'NMEA';
181
+ $nmeaStart = $2 || $1; # save type of first sentence
182
+ } elsif (/^A(FLA|XSY|FIL)/) {
183
+ # (don't set format yet because we want to read HFDTE first)
184
+ $nmeaStart = 'B' ;
185
+ next;
186
+ } elsif (/^HFDTE(\d{2})(\d{2})(\d{2})/) {
187
+ my $year = $3 + ($3 >= 70 ? 1900 : 2000);
188
+ $dateFlarm = Time::Local::timegm(0,0,0,$1,$2-1,$year-1900);
189
+ $nmeaStart = 'B' ;
190
+ $format = 'IGC';
191
+ next;
192
+ } elsif ($nmeaStart and /^B/) {
193
+ # parse IGC fixes without a date
194
+ $format = 'IGC';
195
+ } elsif (/^TP,D,/) {
196
+ $format = 'Winplus';
197
+ } else {
198
+ # search only first 50 lines of file for a valid fix
199
+ last if ++$skipped > 50;
200
+ next;
201
+ }
202
+ }
203
+ #
204
+ # XML format (GPX, KML, Garmin XML/TCX etc)
205
+ #
206
+ if ($format eq 'XML') {
207
+ my ($arg, $tok, $td);
208
+ s/\s*=\s*(['"])\s*/=$1/g; # remove unnecessary white space in attributes
209
+ foreach $arg (split) {
210
+ # parse attributes (ie. GPX 'lat' and 'lon')
211
+ # (note: ignore namespace prefixes if they exist)
212
+ if ($arg =~ /^(\w+:)?(\w+)=(['"])(.*?)\3/g) {
213
+ my $tag = $xmlTag{lc $2};
214
+ if ($tag) {
215
+ $$fix{$tag} = $4;
216
+ $$has{orient} = 1 if $isOrient{$tag};
217
+ }
218
+ }
219
+ # loop through XML elements
220
+ while ($arg =~ m{([^<>]*)<(/)?(\w+:)?(\w+)(>|$)}g) {
221
+ my $tag = $xmlTag{$tok = lc $4};
222
+ # parse as a simple property if this element has a value
223
+ if (defined $tag and not $tag) {
224
+ # a containing property was opened or closed
225
+ if (not $2) {
226
+ # opened: start a new fix
227
+ $lastFix = $fix = { };
228
+ next;
229
+ } elsif ($fix and $lastFix and %$fix) {
230
+ # closed: transfer additional tags from current fix
231
+ foreach (keys %$fix) {
232
+ $$lastFix{$_} = $$fix{$_} unless defined $$lastFix{$_};
233
+ }
234
+ undef $lastFix;
235
+ }
236
+ }
237
+ if (length $1) {
238
+ if ($tag) {
239
+ if ($tag eq 'coords') {
240
+ # read KML "Point" coordinates
241
+ @$fix{'lon','lat','alt'} = split ',', $1;
242
+ } else {
243
+ $$fix{$tag} = $1;
244
+ $$has{orient} = 1 if $isOrient{$tag};
245
+ }
246
+ }
247
+ next;
248
+ } elsif ($tok eq 'td') {
249
+ $td = 1;
250
+ }
251
+ # validate and store GPS fix
252
+ if (defined $$fix{lat} and defined $$fix{lon} and $$fix{'time'} and
253
+ $$fix{lat} =~ /^[+-]?\d+\.?\d*/ and
254
+ $$fix{lon} =~ /^[+-]?\d+\.?\d*/ and
255
+ $$fix{'time'} =~ /^(\d{4})-(\d+)-(\d+)T(\d+):(\d+):(\d+)(\.\d+)?(.*)/)
256
+ {
257
+ $time = Time::Local::timegm($6,$5,$4,$3,$2-1,$1-1900);
258
+ $time += $7 if $7; # add fractional seconds
259
+ my $tz = $8;
260
+ # adjust for time zone (otherwise assume UTC)
261
+ # - allow timezone of +-HH:MM, +-H:MM, +-HHMM or +-HH since
262
+ # the spec is unclear about timezone format
263
+ if ($tz =~ /^([-+])(\d+):(\d{2})\b/ or $tz =~ /^([-+])(\d{2})(\d{2})?\b/) {
264
+ $tz = ($2 * 60 + ($3 || 0)) * 60;
265
+ $tz *= -1 if $1 eq '+'; # opposite sign to change back to UTC
266
+ $time += $tz;
267
+ }
268
+ # validate altitude
269
+ undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
270
+ $isDate = 1;
271
+ $canCut= 1 if defined $$fix{pdop} or defined $$fix{hdop} or defined $$fix{nsats};
272
+ $$has{alt} = 1 if $$fix{alt}; # set "has altitude" flag if appropriate
273
+ $$points{$time} = $fix;
274
+ push @fixTimes, $time; # save times of all fixes in order
275
+ $fix = { };
276
+ ++$numPoints;
277
+ }
278
+ }
279
+ }
280
+ # last ditch check KML description for timestamp (assume it is UTC)
281
+ $$fix{'time'} = "$1T$2Z" if $td and not $$fix{'time'} and
282
+ /[\s>](\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2}(\.\d+)?)/;
283
+ next;
284
+ #
285
+ # Winplus Beacon text file
286
+ #
287
+ } elsif ($format eq 'Winplus') {
288
+ /^TP,D,\s*([-+]?\d+\.\d*),\s*([-+]?\d+\.\d*),\s*(\d+)\/(\d+)\/(\d{4}),\s*(\d+):(\d+):(\d+)/ or next;
289
+ $$fix{lat} = $1;
290
+ $$fix{lon} = $2;
291
+ $time = Time::Local::timegm($8,$7,$6,$4,$3-1,$5-1900);
292
+ $isDate = 1;
293
+ $$points{$time} = $fix;
294
+ push @fixTimes, $time;
295
+ $fix = { };
296
+ ++$numPoints;
297
+ next;
298
+ }
299
+ my (%fix, $secs, $date, $nmea);
300
+ if ($format eq 'NMEA') {
301
+ # ignore unrecognized NMEA sentences
302
+ next unless /^\$(GP(RMC|GGA|GLL|GSA)|PMGNTRK|PTNTHPR),/;
303
+ $nmea = $2 || $1;
304
+ }
305
+ #
306
+ # IGC (flarm) (ref 4)
307
+ #
308
+ if ($format eq 'IGC') {
309
+ # B0939564531208N00557021EA007670089100207
310
+ # BHHMMSSDDMMmmmNDDDMMmmmEAaaaaaAAAAAxxyy
311
+ # HH MM SS DD MM mmm DDD MM mmm aaaaa AAAAA
312
+ # 1 2 3 4 5 6 7 8 9 10 11 12 13 14
313
+ /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{3})([NS])(\d{3})(\d{2})(\d{3})([EW])([AV])(\d{5})(\d{5})/ or next;
314
+ $fix{lat} = ($4 + ($5 + $6/1000)/60) * ($7 eq 'N' ? 1 : -1);
315
+ $fix{lon} = ($8 + ($9 +$10/1000)/60) * ($11 eq 'E' ? 1 : -1);
316
+ $fix{alt} = $12 eq 'A' ? $14 : undef;
317
+ $secs = (($1 * 60) + $2) * 60 + $3;
318
+ # wrap to next day if necessary
319
+ if ($dateFlarm) {
320
+ $dateFlarm += $secPerDay if $secs < $lastSecs - JITTER();
321
+ $date = $dateFlarm;
322
+ }
323
+ $nmea = 'B';
324
+ #
325
+ # NMEA RMC sentence (contains date)
326
+ #
327
+ } elsif ($nmea eq 'RMC') {
328
+ # $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25
329
+ # $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
330
+ /^\$GPRMC,(\d{2})(\d{2})(\d+)(\.\d+)?,A,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next;
331
+ next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year
332
+ $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
333
+ $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
334
+ $fix{speed} = $11 if length $11;
335
+ $fix{track} = $12 if length $12;
336
+ my $year = $15 + ($15 >= 70 ? 1900 : 2000);
337
+ $secs = (($1 * 60) + $2) * 60 + $3;
338
+ $secs += $4 if $4; # add fractional seconds
339
+ $date = Time::Local::timegm(0,0,0,$13,$14-1,$year-1900);
340
+ #
341
+ # NMEA GGA sentence (no date)
342
+ #
343
+ } elsif ($nmea eq 'GGA') {
344
+ # $GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
345
+ # $GPGGA,hhmmss.sss,ddmm.mmmm,N/S,dddmm.mmmm,E/W,0=invalid,sats,hdop,alt,M,...
346
+ /^\$GPGGA,(\d{2})(\d{2})(\d+)(\.\d+)?,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),[1-6],(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?,/ or next;
347
+ $fix{lat} = ($5 + $6/60) * ($7 eq 'N' ? 1 : -1);
348
+ $fix{lon} = ($8 + $9/60) * ($10 eq 'E' ? 1 : -1);
349
+ $fix{nsats} = $11;
350
+ $fix{hdop} = $12;
351
+ $fix{alt} = $13;
352
+ $secs = (($1 * 60) + $2) * 60 + $3;
353
+ $secs += $4 if $4; # add fractional seconds
354
+ $canCut = 1;
355
+ #
356
+ # NMEA GLL sentence (no date)
357
+ #
358
+ } elsif ($nmea eq 'GLL') {
359
+ # $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
360
+ # $GPGLL,ddmm.mmmm,N/S,dddmm.mmmm,E/W,hhmmss.sss,A/V*cs
361
+ /^\$GPGLL,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(\d{2})(\d{2})(\d+)(\.\d+),A/ or next;
362
+ $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1);
363
+ $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1);
364
+ $secs = (($7 * 60) + $8) * 60 + $9;
365
+ $secs += $10 if $10; # add fractional seconds
366
+ #
367
+ # NMEA GSA sentence (satellite status, no date)
368
+ #
369
+ } elsif ($nmea eq 'GSA') {
370
+ # $GPGSA,A,3,04,05,,,,,,,,,,,pdop,hdop,vdop*HH
371
+ /^\$GPGSA,[AM],([23]),((?:\d*,){11}(?:\d*)),(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?,(\d+\.?\d*|\.\d+)?\*/ or next;
372
+ @fix{qw(fixtype sats pdop hdop vdop)} = ($1.'d',$2,$3,$4,$5);
373
+ # count the number of acquired satellites
374
+ my @a = ($fix{sats} =~ /\d+/g);
375
+ $fix{nsats} = scalar @a;
376
+ $canCut = 1;
377
+ #
378
+ # Magellan eXplorist PMGNTRK (Proprietary MaGellaN TRacK) sentence (optional date)
379
+ #
380
+ } elsif ($nmea eq 'PMGNTRK') {
381
+ # $PMGNTRK,4415.026,N,07631.091,W,00092,M,185031.06,A,,020409*65
382
+ # $PMGNTRK,ddmm.mmm,N/S,dddmm.mmm,E/W,alt,F/M,hhmmss.ss,A/V,trkname,DDMMYY*cs
383
+ /^\$PMGNTRK,(\d+)(\d{2}\.\d+),([NS]),(\d+)(\d{2}\.\d+),([EW]),(-?\d+\.?\d*),([MF]),(\d{2})(\d{2})(\d+)(\.\d+)?,A,(?:[^,]*,(\d{2})(\d{2})(\d+))?/ or next;
384
+ $fix{lat} = ($1 + $2/60) * ($3 eq 'N' ? 1 : -1);
385
+ $fix{lon} = ($4 + $5/60) * ($6 eq 'E' ? 1 : -1);
386
+ $fix{alt} = $8 eq 'M' ? $7 : $7 * 12 * 0.0254;
387
+ $secs = (($9 * 60) + $10) * 60 + $11;
388
+ $secs += $12 if $12; # add fractional seconds
389
+ if (defined $15) {
390
+ next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year
391
+ # optional date is available in PMGNTRK sentence
392
+ my $year = $15 + ($15 >= 70 ? 1900 : 2000);
393
+ $date = Time::Local::timegm(0,0,0,$13,$14-1,$year-1900);
394
+ }
395
+ #
396
+ # Honeywell HMR3000 PTNTHPR (Heading Pitch Roll) sentence (no date)
397
+ # (ref http://www.gpsarea.com/uploadfile/download/introduce/hmr3000_manual.pdf)
398
+ #
399
+ } elsif ($nmea eq 'PTNTHPR') {
400
+ # $PTNTHPR,85.9,N,-0.9,N,0.8,N*HH
401
+ # $PTNTHPR,heading,heading status,pitch,pitch status,roll,roll status,*cs
402
+ # status: L=low alarm, M=low warning, N=normal, O=high warning
403
+ # P=high alarm, C=tuning analog circuit
404
+ # (ignore this information on any alarm status)
405
+ /^\$PTNTHPR,(-?[\d.]+),[MNO],(-?[\d.]+),[MNO],(-?[\d.]+),[MNO],/ or next;
406
+ @fix{qw(dir pitch roll)} = ($1,$2,$3);
407
+
408
+ } else {
409
+ next; # this shouldn't happen
410
+ }
411
+ # remember the NMEA formats we successfully read
412
+ $nmea{$nmea} = 1;
413
+ # use last date if necessary (and appropriate)
414
+ if (defined $secs and not defined $date and defined $lastDate) {
415
+ # wrap to next day if necessary
416
+ if ($secs < $lastSecs - JITTER()) {
417
+ $lastSecs -= $secPerDay;
418
+ $lastDate += $secPerDay;
419
+ }
420
+ # use earlier date only if we are within 10 seconds
421
+ if ($secs - $lastSecs < 10) {
422
+ # last date is close, use it for this fix
423
+ $date = $lastDate;
424
+ } else {
425
+ # last date is old, discard it
426
+ undef $lastDate;
427
+ undef $lastSecs;
428
+ }
429
+ }
430
+ # save our last date/time
431
+ if (defined $date) {
432
+ $lastDate = $date;
433
+ $lastSecs = $secs;
434
+ }
435
+ #
436
+ # Add NMEA/IGC fix to our lookup
437
+ # (this is much more complicated than it needs to be because
438
+ # the stupid NMEA format provides no end-of-fix indication)
439
+ #
440
+ # assumptions for each NMEA sentence:
441
+ # - we only parse a time if we get a lat/lon
442
+ # - we always get a time if we have a date
443
+ if ($nmea eq $nmeaStart or (defined $secs and (not defined $fixSecs or
444
+ # don't combine sentences that are outside 10 seconds apart
445
+ ($secs >= $fixSecs and $secs - $fixSecs >= 10) or
446
+ ($secs < $fixSecs and $secs + $secPerDay - $fixSecs >= 10))))
447
+ {
448
+ # start a new fix
449
+ $fix = \%fix;
450
+ $fixSecs = $secs;
451
+ undef $noDateChanged;
452
+ # does this fix have a date/time or time stamp?
453
+ if (defined $date) {
454
+ $fix{isDate} = $isDate = 1;
455
+ $time = $date + $secs;
456
+ } elsif (defined $secs) {
457
+ $time = $secs;
458
+ $noDate = $noDateChanged = 1;
459
+ } else {
460
+ next; # wait until we have a time before adding to lookup
461
+ }
462
+ } else {
463
+ # add new data to existing fix (but don't overwrite earlier values to
464
+ # keep the coordinates in sync with the fix time)
465
+ foreach (keys %fix) {
466
+ $$fix{$_} = $fix{$_} unless defined $$fix{$_};
467
+ }
468
+ if (defined $date) {
469
+ next if $$fix{isDate};
470
+ # move this fix to the proper date
471
+ if (defined $fixSecs) {
472
+ delete $$points{$fixSecs};
473
+ pop @fixTimes if @fixTimes and $fixTimes[-1] == $fixSecs;
474
+ --$numPoints;
475
+ # if we wrapped to the next day since the start of this fix,
476
+ # we must shift the date back to the day of $fixSecs
477
+ $date -= $secPerDay if $secs < $fixSecs;
478
+ } else {
479
+ $fixSecs = $secs;
480
+ }
481
+ $time = $date + $fixSecs;
482
+ $$fix{isDate} = $isDate = 1;
483
+ # revert noDate flag if it was set for this fix
484
+ $noDate = 0 if $noDateChanged;
485
+ } elsif (defined $secs and not defined $fixSecs) {
486
+ $time = $fixSecs = $secs;
487
+ $noDate = $noDateChanged = 1;
488
+ } else {
489
+ next; # wait until we have a time
490
+ }
491
+ }
492
+ # add fix to our lookup
493
+ $$points{$time} = $fix;
494
+ push @fixTimes, $time; # save time of all fixes in order
495
+ ++$numPoints;
496
+ }
497
+ $raf->Close();
498
+
499
+ # set date flags
500
+ if ($noDate and not $$geotag{NoDate}) {
501
+ if ($isDate) {
502
+ $exifTool->Warn('Fixes are date-less -- will use time-only interpolation');
503
+ } else {
504
+ $exifTool->Warn('Some fixes are date-less -- may use time-only interpolation');
505
+ }
506
+ $$geotag{NoDate} = 1;
507
+ }
508
+ $$geotag{IsDate} = 1 if $isDate;
509
+
510
+ # cut bad fixes if necessary
511
+ if ($isCut and $canCut) {
512
+ $cutPDOP = $cutHDOP = $cutSats = 0;
513
+ my @goodTimes;
514
+ foreach (@fixTimes) {
515
+ $fix = $$points{$_} or next;
516
+ if ($maxPDOP and $$fix{pdop} and $$fix{pdop} > $maxPDOP) {
517
+ delete $$points{$_};
518
+ ++$cutPDOP;
519
+ } elsif ($maxHDOP and $$fix{hdop} and $$fix{hdop} > $maxHDOP) {
520
+ delete $$points{$_};
521
+ ++$cutHDOP;
522
+ } elsif ($minSats and defined $$fix{nsats} and $$fix{nsats} ne '' and
523
+ $$fix{nsats} < $minSats)
524
+ {
525
+ delete $$points{$_};
526
+ ++$cutSats;
527
+ } else {
528
+ push @goodTimes, $_;
529
+ }
530
+ }
531
+ @fixTimes = @goodTimes; # update fix times
532
+ $numPoints -= $cutPDOP;
533
+ $numPoints -= $cutHDOP;
534
+ $numPoints -= $cutSats;
535
+ }
536
+ # mark first fix of the track
537
+ while (@fixTimes) {
538
+ $fix = $$points{$fixTimes[0]} or shift(@fixTimes), next;
539
+ $$fix{first} = 1;
540
+ last;
541
+ }
542
+ my $verbose = $exifTool->Options('Verbose');
543
+ if ($verbose) {
544
+ my $out = $exifTool->Options('TextOut');
545
+ print $out "Loaded $numPoints points from GPS track log $from\n";
546
+ print $out "Ignored $cutPDOP points due to GeoMaxPDOP cut\n" if $cutPDOP;
547
+ print $out "Ignored $cutHDOP points due to GeoMaxHDOP cut\n" if $cutHDOP;
548
+ print $out "Ignored $cutSats points due to GeoMinSats cut\n" if $cutSats;
549
+ if ($numPoints and $verbose > 1) {
550
+ print $out ' GPS track start: ' . Image::ExifTool::ConvertUnixTime($fixTimes[0]) . " UTC\n";
551
+ if ($verbose > 3) {
552
+ print $out PrintFix($points, $_) foreach @fixTimes;
553
+ }
554
+ print $out ' GPS track end: ' . Image::ExifTool::ConvertUnixTime($fixTimes[-1]) . " UTC\n";
555
+ }
556
+ }
557
+ if ($numPoints) {
558
+ # reset timestamp list to force it to be regenerated
559
+ delete $$geotag{Times};
560
+ # set flags for available information
561
+ $$has{alt} = 1 if $nmea{GGA} or $nmea{PMGNTRK} or $nmea{B}; # alt
562
+ $$has{track} = 1 if $nmea{RMC}; # track, speed
563
+ $$has{orient} = 1 if $nmea{PTNTHPR}; # dir, pitch, roll
564
+ return $geotag; # success!
565
+ }
566
+ return "No track points found in GPS $from";
567
+ }
568
+
569
+ #------------------------------------------------------------------------------
570
+ # Apply Geosync time correction
571
+ # Inputs: 0) ExifTool ref, 1) Unix UTC time value
572
+ # Returns: sync time difference (and updates input time), or undef if no sync
573
+ sub ApplySyncCorr($$)
574
+ {
575
+ my ($exifTool, $time) = @_;
576
+ my $sync = $exifTool->GetNewValues('Geosync');
577
+ if (ref $sync eq 'HASH') {
578
+ my $syncTimes = $$sync{Times};
579
+ if ($syncTimes) {
580
+ # find the nearest 2 sync points
581
+ my ($i0, $i1) = (0, scalar(@$syncTimes) - 1);
582
+ while ($i1 > $i0 + 1) {
583
+ my $pt = int(($i0 + $i1) / 2);
584
+ if ($time < $$syncTimes[$pt]) {
585
+ $i1 = $pt;
586
+ } else {
587
+ $i0 = $pt;
588
+ }
589
+ }
590
+ my ($t0, $t1) = ($$syncTimes[$i0], $$syncTimes[$i1]);
591
+ # interpolate/extrapolate to account for linear camera clock drift
592
+ my $syncPoints = $$sync{Points};
593
+ my $f = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0);
594
+ $sync = $$syncPoints{$t1} * $f + $$syncPoints{$t0} * (1 - $f);
595
+ } else {
596
+ $sync = $$sync{Offset}; # use fixed time offset
597
+ }
598
+ $_[1] += $sync;
599
+ } else {
600
+ undef $sync;
601
+ }
602
+ return $sync;
603
+ }
604
+
605
+ #------------------------------------------------------------------------------
606
+ # Scan outwards for a fix containing the requested parameter
607
+ # Inputs: 0) name of fix parameter, 1) reference to list of fix times,
608
+ # 2) reference to fix points hash, 3) index of starting time,
609
+ # 4) direction to scan (-1 or +1), 5) maximum time difference
610
+ # Returns: 0) time for fix containing requested information (or undef)
611
+ # 1) the corresponding fix, 2) the value of the requested fix parameter
612
+ sub ScanOutwards($$$$$$)
613
+ {
614
+ my ($key, $times, $points, $i, $dir, $maxSecs) = @_;
615
+ my $t0 = $$times[$i];
616
+ for (;;) {
617
+ $i += $dir;
618
+ last if $i < 0 or $i >= scalar @$times;
619
+ my $t = $$times[$i];
620
+ last if abs($t - $t0) > $maxSecs; # don't look too far
621
+ my $p = $$points{$t};
622
+ my $v = $$p{$key};
623
+ return($t,$p,$v) if defined $v;
624
+ }
625
+ return();
626
+ }
627
+
628
+ #------------------------------------------------------------------------------
629
+ # Find nearest fix containing the specified parameter
630
+ # Inputs: 0) ExifTool ref, 1) name of fix parameter, 2) reference to list of fix times,
631
+ # 3) reference to fix points hash, 4) index of starting time,
632
+ # 5) direction to scan (-1, +1 or undef), 6) maximum time difference
633
+ # Returns: reference to fix hash or undef
634
+ sub FindFix($$$$$$$)
635
+ {
636
+ my ($exifTool, $key, $times, $points, $i, $dir, $maxSecs) = @_;
637
+ my ($t,$p);
638
+ if ($dir) {
639
+ ($t,$p) = ScanOutwards($key, $times, $points, $i, $dir, $maxSecs);
640
+ } else {
641
+ my ($t1, $p1) = ScanOutwards($key, $times, $points, $i, -1, $maxSecs);
642
+ my ($t2, $p2) = ScanOutwards($key, $times, $points, $i, 1, $maxSecs);
643
+ if (defined $t1) {
644
+ if (defined $t2) {
645
+ # both surrounding points are valid, so take the closest one
646
+ ($t, $p) = ($t - $t1 < $t2 - $t) ? ($t1, $p1) : ($t2, $p2);
647
+ } else {
648
+ ($t, $p) = ($t1, $p1);
649
+ }
650
+ } elsif (defined $t2) {
651
+ ($t, $p) = ($t2, $p2);
652
+ }
653
+ }
654
+ if (defined $p and $$exifTool{OPTIONS}{Verbose} > 2) {
655
+ $exifTool->VPrint(2, " Taking $key from fix:\n", PrintFix($points, $t))
656
+ }
657
+ return $p;
658
+ }
659
+
660
+ #------------------------------------------------------------------------------
661
+ # Set new geotagging values according to date/time
662
+ # Inputs: 0) ExifTool object ref, 1) date/time value (or undef to delete tags)
663
+ # 2) optional write group
664
+ # Returns: error string, or '' on success
665
+ # Notes: Uses track data stored in ExifTool NEW_VALUE for Geotag tag
666
+ sub SetGeoValues($$;$)
667
+ {
668
+ local $_;
669
+ my ($exifTool, $val, $writeGroup) = @_;
670
+ my $geotag = $exifTool->GetNewValues('Geotag');
671
+ my $verbose = $exifTool->Options('Verbose');
672
+ my ($fix, $time, $fsec, $noDate, $secondTry, $iExt, $iDir);
673
+
674
+ # remove date if none of our fixes had date information
675
+ $val =~ s/^\S+\s+// if $val and $geotag and not $$geotag{IsDate};
676
+
677
+ # maximum time (sec) from nearest GPS fix when position is still considered valid
678
+ my $geoMaxIntSecs = $exifTool->Options('GeoMaxIntSecs');
679
+ my $geoMaxExtSecs = $exifTool->Options('GeoMaxExtSecs');
680
+
681
+ # use 30 minutes for a default
682
+ defined $geoMaxIntSecs or $geoMaxIntSecs = 1800;
683
+ defined $geoMaxExtSecs or $geoMaxExtSecs = 1800;
684
+
685
+ my $times = $$geotag{Times};
686
+ my $points = $$geotag{Points};
687
+ my $has = $$geotag{Has};
688
+ my $err = '';
689
+ # loop to try date/time value first, then time-only value
690
+ while (defined $val) {
691
+ unless (defined $geotag) {
692
+ $err = 'No GPS track loaded';
693
+ last;
694
+ }
695
+ unless ($times) {
696
+ # generate sorted timestamp list for binary search
697
+ my @times = sort { $a <=> $b } keys %$points;
698
+ $times = $$geotag{Times} = \@times;
699
+ }
700
+ unless ($times and @$times) {
701
+ $err = 'GPS track is empty';
702
+ last;
703
+ }
704
+ unless (eval 'require Time::Local') {
705
+ $err = 'Geotag feature requires Time::Local installed';
706
+ last;
707
+ }
708
+ # convert date/time to UTC
709
+ my ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2);
710
+ if ($val =~ /^(\d{4}):(\d+):(\d+)\s+(\d+):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) {
711
+ # valid date/time value
712
+ ($year,$mon,$day,$hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);
713
+ } elsif ($val =~ /^(\d{2}):(\d+):(\d+)(\.\d*)?(Z|([-+])(\d+):(\d+))?/) {
714
+ # valid time-only value
715
+ ($hr,$min,$sec,$fs,$tz,$t0,$t1,$t2) = ($1,$2,$3,$4,$5,$6,$7,$8);
716
+ # use Jan. 2 to avoid going negative after tz adjustment
717
+ ($year,$mon,$day) = (1970,1,2);
718
+ $noDate = 1;
719
+ } else {
720
+ $err = 'Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])';
721
+ last;
722
+ }
723
+ if ($tz) {
724
+ $time = Time::Local::timegm($sec,$min,$hr,$day,$mon-1,$year-1900);
725
+ # use timezone from date/time value
726
+ if ($tz ne 'Z') {
727
+ my $tzmin = $t1 * 60 + $t2;
728
+ $time -= ($t0 eq '-' ? -$tzmin : $tzmin) * 60;
729
+ }
730
+ } else {
731
+ # assume local timezone
732
+ $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$year-1900);
733
+ }
734
+ # add fractional seconds
735
+ $time += $fs if $fs and $fs ne '.';
736
+
737
+ # bring UTC time back to Jan. 1 if no date is given
738
+ $time %= $secPerDay if $noDate;
739
+
740
+ # apply time synchronization if available
741
+ my $sync = ApplySyncCorr($exifTool, $time);
742
+
743
+ # save fractional seconds string
744
+ $fsec = ($time =~ /(\.\d+)$/) ? $1 : '';
745
+
746
+ if ($exifTool->Options('Verbose') > 1 and not $secondTry) {
747
+ my $out = $exifTool->Options('TextOut');
748
+ my $str = "$fsec UTC";
749
+ $str .= sprintf(" (incl. Geosync offset of %+.3f sec)", $sync) if defined $sync;
750
+ unless ($tz) {
751
+ my $tzs = Image::ExifTool::TimeZoneString([$sec,$min,$hr,$day,$mon-1,$year-1900],$time);
752
+ $str .= " (local timezone is $tzs)";
753
+ }
754
+ print $out ' Geotime value: ' . Image::ExifTool::ConvertUnixTime(int $time) . "$str\n";
755
+ }
756
+ # interpolate GPS track at $time
757
+ if ($time < $$times[0]) {
758
+ if ($time < $$times[0] - $geoMaxExtSecs) {
759
+ $err or $err = 'Time is too far before track';
760
+ } else {
761
+ $fix = $$points{$$times[0]};
762
+ $iExt = 0; $iDir = 1;
763
+ $exifTool->VPrint(2, " Taking pos from fix:\n",
764
+ PrintFix($points, $$times[0])) if $verbose > 2;
765
+ }
766
+ } elsif ($time > $$times[-1]) {
767
+ if ($time > $$times[-1] + $geoMaxExtSecs) {
768
+ $err or $err = 'Time is too far beyond track';
769
+ } else {
770
+ $fix = $$points{$$times[-1]};
771
+ $iExt = $#$times; $iDir = -1;
772
+ $exifTool->VPrint(2, " Taking pos from fix:\n",
773
+ PrintFix($points, $$times[-1])) if $verbose > 2;
774
+ }
775
+ } else {
776
+ # find nearest 2 points in time
777
+ my ($i0, $i1) = (0, scalar(@$times) - 1);
778
+ while ($i1 > $i0 + 1) {
779
+ my $pt = int(($i0 + $i1) / 2);
780
+ if ($time < $$times[$pt]) {
781
+ $i1 = $pt;
782
+ } else {
783
+ $i0 = $pt;
784
+ }
785
+ }
786
+ # do linear interpolation for position
787
+ my $t0 = $$times[$i0];
788
+ my $t1 = $$times[$i1];
789
+ my $p1 = $$points{$t1};
790
+ # check to see if we are extrapolating before the first entry in a track
791
+ my $maxSecs = ($$p1{first} and $geoMaxIntSecs) ? $geoMaxExtSecs : $geoMaxIntSecs;
792
+ # don't interpolate if fixes are too far apart
793
+ if ($t1 - $t0 > $maxSecs) {
794
+ # treat as an extrapolation -- use nearest fix if close enough
795
+ my $tn;
796
+ if ($time - $t0 < $t1 - $time) {
797
+ $tn = $t0;
798
+ $iExt = $i0;
799
+ } else {
800
+ $tn = $t1;
801
+ $iExt = $i1;
802
+ }
803
+ if (abs($time - $tn) > $geoMaxExtSecs) {
804
+ $err or $err = 'Time is too far from nearest GPS fix';
805
+ } else {
806
+ $fix = $$points{$tn};
807
+ $exifTool->VPrint(2, " Taking pos from fix:\n",
808
+ PrintFix($points, $tn)) if $verbose > 2;
809
+ }
810
+ } else {
811
+ my $f0 = $t1 == $t0 ? 0 : ($time - $t0) / ($t1 - $t0);
812
+ my $p0 = $$points{$t0};
813
+ $exifTool->VPrint(2, " Interpolating pos between fixes (f=$f0):\n",
814
+ PrintFix($points, $t0, $t1)) if $verbose > 2;
815
+ $fix = { };
816
+ # loop through available fix information categories
817
+ # (pos, track, alt, orient)
818
+ my ($category, $key);
819
+ Category: foreach $category (qw{pos track alt orient}) {
820
+ next unless $$has{$category};
821
+ my ($f, $p0b, $p1b, $f0b);
822
+ # loop through specific fix information keys
823
+ # (lat, lon, alt, track, speed, dir, pitch, roll)
824
+ foreach $key (@{$fixInfoKeys{$category}}) {
825
+ my $v0 = $$p0{$key};
826
+ my $v1 = $$p1{$key};
827
+ if (defined $v0 and defined $v1) {
828
+ $f = $f0;
829
+ } elsif (defined $f0b) {
830
+ $v0 = $$p0b{$key};
831
+ $v1 = $$p1b{$key};
832
+ next unless defined $v0 and defined $v1;
833
+ $f = $f0b;
834
+ } else {
835
+ # scan outwards looking for fixes with the required information
836
+ # (NOTE: SHOULD EVENTUALLY DO THIS FOR EXTRAPOLATION TOO!)
837
+ my ($t0b, $t1b);
838
+ if (defined $v0) {
839
+ $t0b = $t0; $p0b = $p0;
840
+ } else {
841
+ ($t0b,$p0b,$v0) = ScanOutwards($key,$times,$points,$i0,-1,$maxSecs);
842
+ next Category unless defined $t0b;
843
+ }
844
+ if (defined $v1) {
845
+ $t1b = $t1; $p1b = $p1;
846
+ } else {
847
+ ($t1b,$p1b,$v1) = ScanOutwards($key,$times,$points,$i1,1,$maxSecs);
848
+ next Category unless defined $t1b;
849
+ }
850
+ # re-calculate the interpolation factor
851
+ $f = $f0b = $t1b == $t0b ? 0 : ($time - $t0b) / ($t1b - $t0b);
852
+ $exifTool->VPrint(2, " Interpolating $category between fixes (f=$f):\n",
853
+ PrintFix($points, $t0b, $t1b)) if $verbose > 2;
854
+ }
855
+ # must interpolate cyclical values differently
856
+ if ($cyclical{$key} and abs($v1 - $v0) > 180) {
857
+ # the acute angle spans the discontinuity, so add
858
+ # 360 degrees to the smaller angle before interpolating
859
+ $v0 < $v1 ? $v0 += 360 : $v1 += 360;
860
+ $$fix{$key} = $v1 * $f + $v0 * (1 - $f);
861
+ # longitude and roll ranges are -180 to 180, others are 0 to 360
862
+ my $max = ($key eq 'lon' or $key eq 'roll') ? 180 : 360;
863
+ $$fix{$key} -= 360 if $$fix{$key} >= $max;
864
+ } else {
865
+ # simple linear interpolation
866
+ $$fix{$key} = $v1 * $f + $v0 * (1 - $f);
867
+ }
868
+ }
869
+ }
870
+ }
871
+ }
872
+ if ($fix) {
873
+ $err = ''; # success!
874
+ } elsif ($$geotag{NoDate} and not $noDate and $val =~ s/^\S+\s+//) {
875
+ # try again with no date since some of our track points are date-less
876
+ $secondTry = 1;
877
+ next;
878
+ }
879
+ last;
880
+ }
881
+ if ($fix) {
882
+ my ($gpsDate, $gpsAlt, $gpsAltRef);
883
+ my @t = gmtime(int $time);
884
+ my $gpsTime = sprintf('%.2d:%.2d:%.2d', $t[2], $t[1], $t[0]) . $fsec;
885
+ # write GPSDateStamp if date included in track log, otherwise delete it
886
+ $gpsDate = sprintf('%.2d:%.2d:%.2d', $t[5]+1900, $t[4]+1, $t[3]) unless $noDate;
887
+ # write GPSAltitude tags if altitude included in track log, otherwise delete them
888
+ if (defined $$fix{alt}) {
889
+ $gpsAlt = abs $$fix{alt};
890
+ $gpsAltRef = ($$fix{alt} < 0 ? 1 : 0);
891
+ } elsif ($$has{alt} and defined $iExt) {
892
+ my $tFix = FindFix($exifTool,'alt',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
893
+ if ($tFix) {
894
+ $gpsAlt = abs $$tFix{alt};
895
+ $gpsAltRef = ($$tFix{alt} < 0 ? 1 : 0);
896
+ }
897
+ }
898
+ # set new GPS tag values (EXIF, or XMP if write group is 'xmp')
899
+ my ($xmp, $exif, @r);
900
+ my %opts = ( Type => 'ValueConv' ); # write ValueConv values
901
+ if ($writeGroup) {
902
+ $opts{Group} = $writeGroup;
903
+ $xmp = ($writeGroup =~ /xmp/i);
904
+ $exif = ($writeGroup =~ /^(exif|gps)$/i);
905
+ }
906
+ # (capture error messages by calling SetNewValue in list context)
907
+ @r = $exifTool->SetNewValue(GPSLatitude => $$fix{lat}, %opts);
908
+ @r = $exifTool->SetNewValue(GPSLongitude => $$fix{lon}, %opts);
909
+ @r = $exifTool->SetNewValue(GPSAltitude => $gpsAlt, %opts);
910
+ @r = $exifTool->SetNewValue(GPSAltitudeRef => $gpsAltRef, %opts);
911
+ if ($$has{track}) {
912
+ my $tFix = $fix;
913
+ if (not defined $$fix{track} and defined $iExt) {
914
+ my $p = FindFix($exifTool,'track',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
915
+ $tFix = $p if $p;
916
+ }
917
+ @r = $exifTool->SetNewValue(GPSTrack => $$tFix{track}, %opts);
918
+ @r = $exifTool->SetNewValue(GPSTrackRef => (defined $$tFix{track} ? 'T' : undef), %opts);
919
+ @r = $exifTool->SetNewValue(GPSSpeed => $$tFix{speed}, %opts);
920
+ @r = $exifTool->SetNewValue(GPSSpeedRef => (defined $$tFix{speed} ? 'N' : undef), %opts);
921
+ }
922
+ if ($$has{orient}) {
923
+ my $tFix = $fix;
924
+ if (not defined $$fix{dir} and defined $iExt) {
925
+ my $p = FindFix($exifTool,'dir',$times,$points,$iExt,$iDir,$geoMaxExtSecs);
926
+ $tFix = $p if $p;
927
+ }
928
+ @r = $exifTool->SetNewValue(GPSImgDirection => $$tFix{dir}, %opts);
929
+ @r = $exifTool->SetNewValue(GPSImgDirectionRef => (defined $$tFix{dir} ? 'T' : undef), %opts);
930
+ # Note: GPSPitch and GPSRoll are non-standard, and must be user-defined
931
+ @r = $exifTool->SetNewValue(GPSPitch => $$tFix{pitch}, %opts);
932
+ @r = $exifTool->SetNewValue(GPSRoll => $$tFix{roll}, %opts);
933
+ }
934
+ unless ($xmp) {
935
+ @r = $exifTool->SetNewValue(GPSLatitudeRef => ($$fix{lat} > 0 ? 'N' : 'S'), %opts);
936
+ @r = $exifTool->SetNewValue(GPSLongitudeRef => ($$fix{lon} > 0 ? 'E' : 'W'), %opts);
937
+ @r = $exifTool->SetNewValue(GPSDateStamp => $gpsDate, %opts);
938
+ @r = $exifTool->SetNewValue(GPSTimeStamp => $gpsTime, %opts);
939
+ # set options to edit XMP:GPSDateTime only if it already exists
940
+ $opts{EditOnly} = 1;
941
+ $opts{Group} = 'XMP';
942
+ }
943
+ unless ($exif) {
944
+ @r = $exifTool->SetNewValue(GPSDateTime => "$gpsDate $gpsTime", %opts);
945
+ }
946
+ } else {
947
+ my %opts;
948
+ $opts{Replace} = 2 if defined $val; # remove existing new values
949
+ $opts{Group} = $writeGroup if $writeGroup;
950
+
951
+ # reset any GPS values we might have already set
952
+ foreach (qw(GPSLatitude GPSLatitudeRef GPSLongitude GPSLongitudeRef
953
+ GPSAltitude GPSAltitudeRef GPSDateStamp GPSTimeStamp GPSDateTime
954
+ GPSTrack GPSTrackRef GPSSpeed GPSSpeedRef
955
+ GPSImgDirection GPSImgDirectionRef GPSPitch GPSRoll))
956
+ {
957
+ my @r = $exifTool->SetNewValue($_, undef, %opts);
958
+ }
959
+ }
960
+ return $err;
961
+ }
962
+
963
+ #------------------------------------------------------------------------------
964
+ # Convert Geotagging time synchronization value
965
+ # Inputs: 0) exiftool object ref,
966
+ # 1) time difference string ("[+-]DD MM:HH:SS.ss"), geosync'd file name,
967
+ # "GPSTIME@IMAGETIME", or "GPSTIME@FILENAME"
968
+ # Returns: geosync hash
969
+ # Notes: calling this routine with more than one geosync'd file causes time drift
970
+ # correction to be implemented
971
+ sub ConvertGeosync($$)
972
+ {
973
+ my ($exifTool, $val) = @_;
974
+ my $sync = $exifTool->GetNewValues('Geosync') || { };
975
+ my ($syncFile, $gpsTime, $imgTime);
976
+
977
+ if ($val =~ /(.*?)\@(.*)/) {
978
+ $gpsTime = $1;
979
+ if (-f $2) {
980
+ $syncFile = $2;
981
+ } else {
982
+ $imgTime = $2;
983
+ }
984
+ # (take care because "-f '1:30'" crashes ActivePerl 5.10)
985
+ } elsif ($val !~ /^\d/ or $val !~ /:/) {
986
+ $syncFile = $val if -f $val;
987
+ }
988
+ if ($gpsTime or defined $syncFile) {
989
+ # (this is a time synchronization vector)
990
+ if (defined $syncFile) {
991
+ # check the following tags in order to obtain the image timestamp
992
+ my @timeTags = qw(SubSecDateTimeOriginal SubSecCreateDate SubSecModifyDate
993
+ DateTimeOriginal CreateDate ModifyDate FileModifyDate);
994
+ my $info = ImageInfo($syncFile, { PrintConv => 0 }, @timeTags,
995
+ 'GPSDateTime', 'GPSTimeStamp');
996
+ $$info{Error} and warn("$$info{Err}\n"), return undef;
997
+ $gpsTime or $gpsTime = $$info{GPSDateTime} || $$info{GPSTimeStamp};
998
+ my $tag;
999
+ foreach $tag (@timeTags) {
1000
+ if ($$info{$tag}) {
1001
+ $imgTime = $$info{$tag};
1002
+ $exifTool->VPrint(2, "Geosyncing with $tag from '$syncFile'\n");
1003
+ last;
1004
+ }
1005
+ }
1006
+ $gpsTime or warn("No GPSTimeStamp in '$syncFile\n"), return undef;
1007
+ $imgTime or warn("No image timestamp in '$syncFile'\n"), return undef;
1008
+ }
1009
+ # add date to date-less timestamps
1010
+ my ($imgDateTime, $gpsDateTime, $noDate);
1011
+ if ($imgTime =~ /^(\d+:\d+:\d+)\s+\d+/) {
1012
+ $imgDateTime = $imgTime;
1013
+ my $date = $1;
1014
+ if ($gpsTime =~ /^\d+:\d+:\d+\s+\d+/) {
1015
+ $gpsDateTime = $gpsTime;
1016
+ } else {
1017
+ $gpsDateTime = "$date $gpsTime";
1018
+ }
1019
+ } elsif ($gpsTime =~ /^(\d+:\d+:\d+)\s+\d+/) {
1020
+ $imgDateTime = "$1 $imgTime";
1021
+ $gpsDateTime = $gpsTime;
1022
+ } else {
1023
+ # use a today's date (so hopefully the DST setting will be intuitive)
1024
+ my @tm = localtime;
1025
+ my $date = sprintf('%.4d:%.2d:%.2d', $tm[5]+1900, $tm[4]+1, $tm[3]);
1026
+ $gpsDateTime = "$date $gpsTime";
1027
+ $imgDateTime = "$date $imgTime";
1028
+ $noDate = 1;
1029
+ }
1030
+ # calculate Unix seconds since the epoch
1031
+ my $imgSecs = Image::ExifTool::GetUnixTime($imgDateTime, 1);
1032
+ defined $imgSecs or warn("Invalid image time '$imgTime'\n"), return undef;
1033
+ my $gpsSecs = Image::ExifTool::GetUnixTime($gpsDateTime, 1);
1034
+ defined $gpsSecs or warn("Invalid GPS time '$gpsTime'\n"), return undef;
1035
+ # add fractional seconds
1036
+ $gpsSecs += $1 if $gpsTime =~ /(\.\d+)/;
1037
+ $imgSecs += $1 if $imgTime =~ /(\.\d+)/;
1038
+ # shift dates within 12 hours of each other if either timestamp was date-less
1039
+ if ($gpsDateTime ne $gpsTime or $imgDateTime ne $imgTime) {
1040
+ my $diff = ($imgSecs - $gpsSecs) % (24 * 3600);
1041
+ $diff -= 24 * 3600 if $diff > 12 * 3600;
1042
+ $diff += 24 * 3600 if $diff < -12 * 3600;
1043
+ if ($gpsDateTime ne $gpsTime) {
1044
+ $gpsSecs = $imgSecs - $diff;
1045
+ } else {
1046
+ $imgSecs = $gpsSecs + $diff;
1047
+ }
1048
+ }
1049
+ # save the synchronization offset
1050
+ $$sync{Offset} = $gpsSecs - $imgSecs;
1051
+ # save this synchronization point if either timestamp had a date
1052
+ unless ($noDate) {
1053
+ $$sync{Points} or $$sync{Points} = { };
1054
+ $$sync{Points}{$imgSecs} = $$sync{Offset};
1055
+ # print verbose output
1056
+ if ($exifTool->Options('Verbose') > 1) {
1057
+ # print GPS and image timestamps in UTC
1058
+ my $gps = Image::ExifTool::ConvertUnixTime($gpsSecs);
1059
+ my $img = Image::ExifTool::ConvertUnixTime($imgSecs);
1060
+ $gps .= $1 if $gpsTime =~ /(\.\d+)/;
1061
+ $img .= $1 if $imgTime =~ /(\.\d+)/;
1062
+ $exifTool->VPrint(1, "Added Geosync point:\n",
1063
+ " GPS time stamp: $gps UTC\n",
1064
+ " Image date/time: $img UTC\n");
1065
+ }
1066
+ # save sorted list of image sync times if we have more than one
1067
+ my @times = keys %{$$sync{Points}};
1068
+ if (@times > 1) {
1069
+ @times = sort { $a <=> $b } @times;
1070
+ $$sync{Times} = \@times;
1071
+ }
1072
+ }
1073
+ } else {
1074
+ # (this is a simple time difference)
1075
+ my @vals = $val =~ /(?=\d|\.\d)\d*(?:\.\d*)?/g; # (allow decimal values too)
1076
+ @vals or warn("Invalid value (please refer to geotag documentation)\n"), return undef;
1077
+ my $secs = 0;
1078
+ my $mult;
1079
+ foreach $mult (1, 60, 3600, $secPerDay) {
1080
+ $secs += $mult * pop(@vals);
1081
+ last unless @vals;
1082
+ }
1083
+ # set constant sync offset
1084
+ $$sync{Offset} = $val =~ /^\s*-/ ? -$secs : $secs;
1085
+ }
1086
+ return $sync;
1087
+ }
1088
+
1089
+ #------------------------------------------------------------------------------
1090
+ # Print fix information
1091
+ # Inputs: 0) lookup for all fix points, 1-n) list of fix times
1092
+ # Returns: fix string (including leading indent and trailing newline)
1093
+ sub PrintFix($@)
1094
+ {
1095
+ local $_;
1096
+ my $points = shift;
1097
+ my $str = '';
1098
+ while (@_) {
1099
+ my $time = shift;
1100
+ $str .= ' ' . Image::ExifTool::ConvertUnixTime($time) . ' UTC -';
1101
+ my $fix = $$points{$time};
1102
+ if ($fix) {
1103
+ foreach (sort keys %$fix) {
1104
+ $str .= " $_=$$fix{$_}" unless $_ eq 'time';
1105
+ }
1106
+ }
1107
+ $str .= "\n";
1108
+ }
1109
+ return $str;
1110
+ }
1111
+
1112
+ #------------------------------------------------------------------------------
1113
+ 1; # end
1114
+
1115
+ __END__
1116
+
1117
+ =head1 NAME
1118
+
1119
+ Image::ExifTool::Geotag - Geotagging utility routines
1120
+
1121
+ =head1 SYNOPSIS
1122
+
1123
+ This module is used by Image::ExifTool
1124
+
1125
+ =head1 DESCRIPTION
1126
+
1127
+ This module loads GPS track logs, interpolates to determine position based
1128
+ on time, and sets new GPS values for geotagging images. Currently supported
1129
+ formats are GPX, NMEA RMC/GGA/GLL, KML, IGC, Garmin XML and TCX, Magellan
1130
+ PMGNTRK, Honeywell PTNTHPR, and Winplus Beacon text files.
1131
+
1132
+ Methods in this module should not be called directly. Instead, the Geotag
1133
+ feature is accessed by writing the values of the ExifTool Geotag, Geosync
1134
+ and Geotime tags (see the L<Extra Tags|Image::ExifTool::TagNames/Extra Tags>
1135
+ in the tag name documentation).
1136
+
1137
+ =head1 NOTES
1138
+
1139
+ To take advantage of attitude information in the PTNTHPR NMEA sentence, two
1140
+ user-defined tags, GPSPitch and GPSRoll, must be active.
1141
+
1142
+ =head1 AUTHOR
1143
+
1144
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
1145
+
1146
+ This library is free software; you can redistribute it and/or modify it
1147
+ under the same terms as Perl itself.
1148
+
1149
+ =head1 REFERENCES
1150
+
1151
+ =over 4
1152
+
1153
+ =item L<http://www.topografix.com/GPX/1/1/>
1154
+
1155
+ =item L<http://www.gpsinformation.org/dale/nmea.htm#GSA>
1156
+
1157
+ =item L<http://code.google.com/apis/kml/documentation/kmlreference.html>
1158
+
1159
+ =item L<http://www.fai.org/gliding/system/files/tech_spec_gnss.pdf>
1160
+
1161
+ =back
1162
+
1163
+ =head1 ACKNOWLEDGEMENTS
1164
+
1165
+ Thanks to Lionel Genet for the ability to read IGC format track logs.
1166
+
1167
+ =head1 SEE ALSO
1168
+
1169
+ L<Image::ExifTool::TagNames/Extra Tags>,
1170
+ L<Image::ExifTool(3pm)|Image::ExifTool>
1171
+
1172
+ =cut
1173
+