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,1882 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: FlashPix.pm
3
+ #
4
+ # Description: Read FlashPix meta information
5
+ #
6
+ # Revisions: 05/29/2006 - P. Harvey Created
7
+ #
8
+ # References: 1) http://www.exif.org/Exif2-2.PDF
9
+ # 2) http://www.graphcomp.com/info/specs/livepicture/fpx.pdf
10
+ # 3) http://search.cpan.org/~jdb/libwin32/
11
+ # 4) http://msdn.microsoft.com/en-us/library/aa380374.aspx
12
+ #------------------------------------------------------------------------------
13
+
14
+ package Image::ExifTool::FlashPix;
15
+
16
+ use strict;
17
+ use vars qw($VERSION);
18
+ use Image::ExifTool qw(:DataAccess :Utils);
19
+ use Image::ExifTool::Exif;
20
+ use Image::ExifTool::ASF; # for GetGUID()
21
+
22
+ $VERSION = '1.21';
23
+
24
+ sub ProcessFPX($$);
25
+ sub ProcessFPXR($$$);
26
+ sub ProcessProperties($$$);
27
+ sub ReadFPXValue($$$$$;$$);
28
+ sub ProcessHyperlinks($$);
29
+ sub ProcessContents($$$);
30
+ sub SetDocNum($$;$$$);
31
+
32
+ # sector type constants
33
+ sub HDR_SIZE () { 512; }
34
+ sub DIF_SECT () { 0xfffffffc; }
35
+ sub FAT_SECT () { 0xfffffffd; }
36
+ sub END_OF_CHAIN () { 0xfffffffe; }
37
+ sub FREE_SECT () { 0xffffffff; }
38
+
39
+ # format flags
40
+ sub VT_VECTOR () { 0x1000; }
41
+ sub VT_ARRAY () { 0x2000; }
42
+ sub VT_BYREF () { 0x4000; }
43
+ sub VT_RESERVED () { 0x8000; }
44
+
45
+ # other constants
46
+ sub VT_VARIANT () { 12; }
47
+ sub VT_LPSTR () { 30; }
48
+
49
+ # list of OLE format codes (unsupported codes commented out)
50
+ my %oleFormat = (
51
+ 0 => undef, # VT_EMPTY
52
+ 1 => undef, # VT_NULL
53
+ 2 => 'int16s', # VT_I2
54
+ 3 => 'int32s', # VT_I4
55
+ 4 => 'float', # VT_R4
56
+ 5 => 'double', # VT_R8
57
+ 6 => undef, # VT_CY
58
+ 7 => 'VT_DATE', # VT_DATE (double, number of days since Dec 30, 1899)
59
+ 8 => 'VT_BSTR', # VT_BSTR (int32u count, followed by binary string)
60
+ # 9 => 'VT_DISPATCH',
61
+ 10 => 'int32s', # VT_ERROR
62
+ 11 => 'int16s', # VT_BOOL
63
+ 12 => 'VT_VARIANT', # VT_VARIANT
64
+ # 13 => 'VT_UNKNOWN',
65
+ # 14 => 'VT_DECIMAL',
66
+ 16 => 'int8s', # VT_I1
67
+ 17 => 'int8u', # VT_UI1
68
+ 18 => 'int16u', # VT_UI2
69
+ 19 => 'int32u', # VT_UI4
70
+ 20 => 'int64s', # VT_I8
71
+ 21 => 'int64u', # VT_UI8
72
+ # 22 => 'VT_INT',
73
+ # 23 => 'VT_UINT',
74
+ # 24 => 'VT_VOID',
75
+ # 25 => 'VT_HRESULT',
76
+ # 26 => 'VT_PTR',
77
+ # 27 => 'VT_SAFEARRAY',
78
+ # 28 => 'VT_CARRAY',
79
+ # 29 => 'VT_USERDEFINED',
80
+ 30 => 'VT_LPSTR', # VT_LPSTR (int32u count, followed by string)
81
+ 31 => 'VT_LPWSTR', # VT_LPWSTR (int32u word count, followed by Unicode string)
82
+ 64 => 'VT_FILETIME',# VT_FILETIME (int64u, number of nanoseconds since Jan 1, 1601)
83
+ 65 => 'VT_BLOB', # VT_BLOB
84
+ # 66 => 'VT_STREAM',
85
+ # 67 => 'VT_STORAGE',
86
+ # 68 => 'VT_STREAMED_OBJECT',
87
+ # 69 => 'VT_STORED_OBJECT',
88
+ # 70 => 'VT_BLOB_OBJECT',
89
+ 71 => 'VT_CF', # VT_CF
90
+ 72 => 'VT_CLSID', # VT_CLSID
91
+ );
92
+
93
+ # OLE flag codes (high nibble of property type)
94
+ my %oleFlags = (
95
+ 0x1000 => 'VT_VECTOR',
96
+ 0x2000 => 'VT_ARRAY', # not yet supported
97
+ 0x4000 => 'VT_BYREF', # ditto
98
+ 0x8000 => 'VT_RESERVED',
99
+ );
100
+
101
+ # byte sizes for supported VT_* format and flag types
102
+ my %oleFormatSize = (
103
+ VT_DATE => 8,
104
+ VT_BSTR => 4, # (+ string length)
105
+ VT_VARIANT => 4, # (+ data length)
106
+ VT_LPSTR => 4, # (+ string length)
107
+ VT_LPWSTR => 4, # (+ string character length)
108
+ VT_FILETIME => 8,
109
+ VT_BLOB => 4, # (+ data length)
110
+ VT_CF => 4, # (+ data length)
111
+ VT_CLSID => 16,
112
+ VT_VECTOR => 4, # (+ vector elements)
113
+ );
114
+
115
+ # names for each type of directory entry
116
+ my @dirEntryType = qw(INVALID STORAGE STREAM LOCKBYTES PROPERTY ROOT);
117
+
118
+ # list of code pages used by Microsoft
119
+ # (ref http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx)
120
+ my %codePage = (
121
+ 037 => 'IBM EBCDIC US-Canada',
122
+ 437 => 'DOS United States',
123
+ 500 => 'IBM EBCDIC International',
124
+ 708 => 'Arabic (ASMO 708)',
125
+ 709 => 'Arabic (ASMO-449+, BCON V4)',
126
+ 710 => 'Arabic - Transparent Arabic',
127
+ 720 => 'DOS Arabic (Transparent ASMO)',
128
+ 737 => 'DOS Greek (formerly 437G)',
129
+ 775 => 'DOS Baltic',
130
+ 850 => 'DOS Latin 1 (Western European)',
131
+ 852 => 'DOS Latin 2 (Central European)',
132
+ 855 => 'DOS Cyrillic (primarily Russian)',
133
+ 857 => 'DOS Turkish',
134
+ 858 => 'DOS Multilingual Latin 1 with Euro',
135
+ 860 => 'DOS Portuguese',
136
+ 861 => 'DOS Icelandic',
137
+ 862 => 'DOS Hebrew',
138
+ 863 => 'DOS French Canadian',
139
+ 864 => 'DOS Arabic',
140
+ 865 => 'DOS Nordic',
141
+ 866 => 'DOS Russian (Cyrillic)',
142
+ 869 => 'DOS Modern Greek',
143
+ 870 => 'IBM EBCDIC Multilingual/ROECE (Latin 2)',
144
+ 874 => 'Windows Thai (same as 28605, ISO 8859-15)',
145
+ 875 => 'IBM EBCDIC Greek Modern',
146
+ 932 => 'Windows Japanese (Shift-JIS)',
147
+ 936 => 'Windows Simplified Chinese (PRC, Singapore)',
148
+ 949 => 'Windows Korean (Unified Hangul Code)',
149
+ 950 => 'Windows Traditional Chinese (Taiwan)',
150
+ 1026 => 'IBM EBCDIC Turkish (Latin 5)',
151
+ 1047 => 'IBM EBCDIC Latin 1/Open System',
152
+ 1140 => 'IBM EBCDIC US-Canada with Euro',
153
+ 1141 => 'IBM EBCDIC Germany with Euro',
154
+ 1142 => 'IBM EBCDIC Denmark-Norway with Euro',
155
+ 1143 => 'IBM EBCDIC Finland-Sweden with Euro',
156
+ 1144 => 'IBM EBCDIC Italy with Euro',
157
+ 1145 => 'IBM EBCDIC Latin America-Spain with Euro',
158
+ 1146 => 'IBM EBCDIC United Kingdom with Euro',
159
+ 1147 => 'IBM EBCDIC France with Euro',
160
+ 1148 => 'IBM EBCDIC International with Euro',
161
+ 1149 => 'IBM EBCDIC Icelandic with Euro',
162
+ 1200 => 'Unicode UTF-16, little endian',
163
+ 1201 => 'Unicode UTF-16, big endian',
164
+ 1250 => 'Windows Latin 2 (Central European)',
165
+ 1251 => 'Windows Cyrillic',
166
+ 1252 => 'Windows Latin 1 (Western European)',
167
+ 1253 => 'Windows Greek',
168
+ 1254 => 'Windows Turkish',
169
+ 1255 => 'Windows Hebrew',
170
+ 1256 => 'Windows Arabic',
171
+ 1257 => 'Windows Baltic',
172
+ 1258 => 'Windows Vietnamese',
173
+ 1361 => 'Korean (Johab)',
174
+ 10000 => 'Mac Roman (Western European)',
175
+ 10001 => 'Mac Japanese',
176
+ 10002 => 'Mac Traditional Chinese',
177
+ 10003 => 'Mac Korean',
178
+ 10004 => 'Mac Arabic',
179
+ 10005 => 'Mac Hebrew',
180
+ 10006 => 'Mac Greek',
181
+ 10007 => 'Mac Cyrillic',
182
+ 10008 => 'Mac Simplified Chinese',
183
+ 10010 => 'Mac Romanian',
184
+ 10017 => 'Mac Ukrainian',
185
+ 10021 => 'Mac Thai',
186
+ 10029 => 'Mac Latin 2 (Central European)',
187
+ 10079 => 'Mac Icelandic',
188
+ 10081 => 'Mac Turkish',
189
+ 10082 => 'Mac Croatian',
190
+ 12000 => 'Unicode UTF-32, little endian',
191
+ 12001 => 'Unicode UTF-32, big endian',
192
+ 20000 => 'CNS Taiwan',
193
+ 20001 => 'TCA Taiwan',
194
+ 20002 => 'Eten Taiwan',
195
+ 20003 => 'IBM5550 Taiwan',
196
+ 20004 => 'TeleText Taiwan',
197
+ 20005 => 'Wang Taiwan',
198
+ 20105 => 'IA5 (IRV International Alphabet No. 5, 7-bit)',
199
+ 20106 => 'IA5 German (7-bit)',
200
+ 20107 => 'IA5 Swedish (7-bit)',
201
+ 20108 => 'IA5 Norwegian (7-bit)',
202
+ 20127 => 'US-ASCII (7-bit)',
203
+ 20261 => 'T.61',
204
+ 20269 => 'ISO 6937 Non-Spacing Accent',
205
+ 20273 => 'IBM EBCDIC Germany',
206
+ 20277 => 'IBM EBCDIC Denmark-Norway',
207
+ 20278 => 'IBM EBCDIC Finland-Sweden',
208
+ 20280 => 'IBM EBCDIC Italy',
209
+ 20284 => 'IBM EBCDIC Latin America-Spain',
210
+ 20285 => 'IBM EBCDIC United Kingdom',
211
+ 20290 => 'IBM EBCDIC Japanese Katakana Extended',
212
+ 20297 => 'IBM EBCDIC France',
213
+ 20420 => 'IBM EBCDIC Arabic',
214
+ 20423 => 'IBM EBCDIC Greek',
215
+ 20424 => 'IBM EBCDIC Hebrew',
216
+ 20833 => 'IBM EBCDIC Korean Extended',
217
+ 20838 => 'IBM EBCDIC Thai',
218
+ 20866 => 'Russian/Cyrillic (KOI8-R)',
219
+ 20871 => 'IBM EBCDIC Icelandic',
220
+ 20880 => 'IBM EBCDIC Cyrillic Russian',
221
+ 20905 => 'IBM EBCDIC Turkish',
222
+ 20924 => 'IBM EBCDIC Latin 1/Open System with Euro',
223
+ 20932 => 'Japanese (JIS 0208-1990 and 0121-1990)',
224
+ 20936 => 'Simplified Chinese (GB2312)',
225
+ 20949 => 'Korean Wansung',
226
+ 21025 => 'IBM EBCDIC Cyrillic Serbian-Bulgarian',
227
+ 21027 => 'Extended Alpha Lowercase (deprecated)',
228
+ 21866 => 'Ukrainian/Cyrillic (KOI8-U)',
229
+ 28591 => 'ISO 8859-1 Latin 1 (Western European)',
230
+ 28592 => 'ISO 8859-2 (Central European)',
231
+ 28593 => 'ISO 8859-3 Latin 3',
232
+ 28594 => 'ISO 8859-4 Baltic',
233
+ 28595 => 'ISO 8859-5 Cyrillic',
234
+ 28596 => 'ISO 8859-6 Arabic',
235
+ 28597 => 'ISO 8859-7 Greek',
236
+ 28598 => 'ISO 8859-8 Hebrew (Visual)',
237
+ 28599 => 'ISO 8859-9 Turkish',
238
+ 28603 => 'ISO 8859-13 Estonian',
239
+ 28605 => 'ISO 8859-15 Latin 9',
240
+ 29001 => 'Europa 3',
241
+ 38598 => 'ISO 8859-8 Hebrew (Logical)',
242
+ 50220 => 'ISO 2022 Japanese with no halfwidth Katakana (JIS)',
243
+ 50221 => 'ISO 2022 Japanese with halfwidth Katakana (JIS-Allow 1 byte Kana)',
244
+ 50222 => 'ISO 2022 Japanese JIS X 0201-1989 (JIS-Allow 1 byte Kana - SO/SI)',
245
+ 50225 => 'ISO 2022 Korean',
246
+ 50227 => 'ISO 2022 Simplified Chinese',
247
+ 50229 => 'ISO 2022 Traditional Chinese',
248
+ 50930 => 'EBCDIC Japanese (Katakana) Extended',
249
+ 50931 => 'EBCDIC US-Canada and Japanese',
250
+ 50933 => 'EBCDIC Korean Extended and Korean',
251
+ 50935 => 'EBCDIC Simplified Chinese Extended and Simplified Chinese',
252
+ 50936 => 'EBCDIC Simplified Chinese',
253
+ 50937 => 'EBCDIC US-Canada and Traditional Chinese',
254
+ 50939 => 'EBCDIC Japanese (Latin) Extended and Japanese',
255
+ 51932 => 'EUC Japanese',
256
+ 51936 => 'EUC Simplified Chinese',
257
+ 51949 => 'EUC Korean',
258
+ 51950 => 'EUC Traditional Chinese',
259
+ 52936 => 'HZ-GB2312 Simplified Chinese',
260
+ 54936 => 'Windows XP and later: GB18030 Simplified Chinese (4 byte)',
261
+ 57002 => 'ISCII Devanagari',
262
+ 57003 => 'ISCII Bengali',
263
+ 57004 => 'ISCII Tamil',
264
+ 57005 => 'ISCII Telugu',
265
+ 57006 => 'ISCII Assamese',
266
+ 57007 => 'ISCII Oriya',
267
+ 57008 => 'ISCII Kannada',
268
+ 57009 => 'ISCII Malayalam',
269
+ 57010 => 'ISCII Gujarati',
270
+ 57011 => 'ISCII Punjabi',
271
+ 65000 => 'Unicode (UTF-7)',
272
+ 65001 => 'Unicode (UTF-8)',
273
+ );
274
+
275
+ # test for file extensions which may be variants of the FPX format
276
+ # (have seen one password-protected DOCX file that is FPX-like, so assume
277
+ # that all the rest could be as well)
278
+ my %fpxFileType = (
279
+ DOC => 1, DOCX => 1, DOCM => 1,
280
+ DOT => 1, DOTX => 1, DOTM => 1,
281
+ POT => 1, POTX => 1, POTM => 1,
282
+ PPS => 1, PPSX => 1, PPSM => 1,
283
+ PPT => 1, PPTX => 1, PPTM => 1, THMX => 1,
284
+ XLA => 1, XLAM => 1,
285
+ XLS => 1, XLSX => 1, XLSM => 1, XLSB => 1,
286
+ XLT => 1, XLTX => 1, XLTM => 1,
287
+ # non MSOffice types
288
+ FLA => 1, VSD => 1,
289
+ );
290
+
291
+ %Image::ExifTool::FlashPix::Main = (
292
+ PROCESS_PROC => \&ProcessFPXR,
293
+ GROUPS => { 2 => 'Image' },
294
+ NOTES => q{
295
+ The FlashPix file format, introduced in 1996, was developed by Kodak,
296
+ Hewlett-Packard and Microsoft. Internally the FPX file structure mimics
297
+ that of an old DOS disk with fixed-sized "sectors" (usually 512 bytes) and a
298
+ "file allocation table" (FAT). No wonder this image format never became
299
+ popular. However, some of the structures used in FlashPix streams are part
300
+ of the EXIF specification, and are still being used in the APP2 FPXR segment
301
+ of JPEG images by some Kodak and Hewlett-Packard digital cameras.
302
+
303
+ ExifTool extracts FlashPix information from both FPX images and the APP2
304
+ FPXR segment of JPEG images. As well, FlashPix information is extracted
305
+ from DOC, PPT, XLS (Microsoft Word, PowerPoint and Excel) documents, VSD
306
+ (Microsoft Visio) drawings, and FLA (Macromedia/Adobe Flash project) files
307
+ since these are based on the same file format as FlashPix (the Windows
308
+ Compound Binary File format). See
309
+ L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix
310
+ specification.
311
+ },
312
+ "\x05SummaryInformation" => {
313
+ Name => 'SummaryInfo',
314
+ SubDirectory => {
315
+ TagTable => 'Image::ExifTool::FlashPix::SummaryInfo',
316
+ },
317
+ },
318
+ "\x05DocumentSummaryInformation" => {
319
+ Name => 'DocumentInfo',
320
+ Multi => 1, # flag to process UserDefined information after this
321
+ SubDirectory => {
322
+ TagTable => 'Image::ExifTool::FlashPix::DocumentInfo',
323
+ },
324
+ },
325
+ "\x01CompObj" => {
326
+ Name => 'CompObj',
327
+ SubDirectory => {
328
+ TagTable => 'Image::ExifTool::FlashPix::CompObj',
329
+ DirStart => 0x1c, # skip stream header
330
+ },
331
+ },
332
+ "\x05Image Info" => {
333
+ Name => 'ImageInfo',
334
+ SubDirectory => {
335
+ TagTable => 'Image::ExifTool::FlashPix::ImageInfo',
336
+ },
337
+ },
338
+ "\x05Image Contents" => {
339
+ Name => 'Image',
340
+ SubDirectory => {
341
+ TagTable => 'Image::ExifTool::FlashPix::Image',
342
+ },
343
+ },
344
+ "Contents" => {
345
+ Name => 'Contents',
346
+ Notes => 'found in FLA files; may contain XMP',
347
+ SubDirectory => {
348
+ TagTable => 'Image::ExifTool::XMP::Main',
349
+ ProcessProc => \&ProcessContents,
350
+ },
351
+ },
352
+ "ICC Profile 0001" => {
353
+ Name => 'ICC_Profile',
354
+ SubDirectory => {
355
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
356
+ DirStart => 0x1c, # skip stream header
357
+ },
358
+ },
359
+ "\x05Extension List" => {
360
+ Name => 'Extensions',
361
+ SubDirectory => {
362
+ TagTable => 'Image::ExifTool::FlashPix::Extensions',
363
+ },
364
+ },
365
+ 'Subimage 0000 Header' => {
366
+ Name => 'SubimageHdr',
367
+ SubDirectory => {
368
+ TagTable => 'Image::ExifTool::FlashPix::SubimageHdr',
369
+ DirStart => 0x1c, # skip stream header
370
+ },
371
+ },
372
+ # 'Subimage 0000 Data'
373
+ "\x05Data Object" => { # plus instance number (ie. " 000000")
374
+ Name => 'DataObject',
375
+ SubDirectory => {
376
+ TagTable => 'Image::ExifTool::FlashPix::DataObject',
377
+ },
378
+ },
379
+ # "\x05Data Object Store" => { # plus instance number (ie. " 000000")
380
+ "\x05Transform" => { # plus instance number (ie. " 000000")
381
+ Name => 'Transform',
382
+ SubDirectory => {
383
+ TagTable => 'Image::ExifTool::FlashPix::Transform',
384
+ },
385
+ },
386
+ "\x05Operation" => { # plus instance number (ie. " 000000")
387
+ Name => 'Operation',
388
+ SubDirectory => {
389
+ TagTable => 'Image::ExifTool::FlashPix::Operation',
390
+ },
391
+ },
392
+ "\x05Global Info" => {
393
+ Name => 'GlobalInfo',
394
+ SubDirectory => {
395
+ TagTable => 'Image::ExifTool::FlashPix::GlobalInfo',
396
+ },
397
+ },
398
+ "\x05Screen Nail" => { # plus class ID (ie. "_bd0100609719a180")
399
+ Name => 'ScreenNail',
400
+ Groups => { 2 => 'Other' },
401
+ # strip off stream header
402
+ ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val',
403
+ },
404
+ "\x05Audio Info" => {
405
+ Name => 'AudioInfo',
406
+ SubDirectory => {
407
+ TagTable => 'Image::ExifTool::FlashPix::AudioInfo',
408
+ },
409
+ },
410
+ 'Audio Stream' => { # plus instance number (ie. " 000000")
411
+ Name => 'AudioStream',
412
+ Groups => { 2 => 'Audio' },
413
+ # strip off stream header
414
+ ValueConv => 'length($val) > 0x1c and $val = substr($val, 0x1c); \$val',
415
+ },
416
+ 'Current User' => { #PH
417
+ Name => 'CurrentUser',
418
+ # not sure what the rest of this data is, but extract ASCII name from it - PH
419
+ ValueConv => q{
420
+ return undef if length $val < 12;
421
+ my ($size,$pos) = unpack('x4VV', $val);
422
+ my $len = $size - $pos - 4;
423
+ return undef if $len < 0 or length $val < $size + 8;
424
+ return substr($val, 8 + $pos, $len);
425
+ },
426
+ },
427
+ );
428
+
429
+ # Summary Information properties
430
+ %Image::ExifTool::FlashPix::SummaryInfo = (
431
+ PROCESS_PROC => \&ProcessProperties,
432
+ GROUPS => { 2 => 'Document' },
433
+ NOTES => q{
434
+ The Dictionary, CodePage and LocalIndicator tags are common to all FlashPix
435
+ property tables, even though they are only listed in the SummaryInfo table.
436
+ },
437
+ 0x00 => { Name => 'Dictionary', Groups => { 2 => 'Other' }, Binary => 1 },
438
+ 0x01 => {
439
+ Name => 'CodePage',
440
+ Groups => { 2 => 'Other' },
441
+ PrintConv => \%codePage,
442
+ },
443
+ 0x02 => 'Title',
444
+ 0x03 => 'Subject',
445
+ 0x04 => { Name => 'Author', Groups => { 2 => 'Author' } },
446
+ 0x05 => 'Keywords',
447
+ 0x06 => 'Comments',
448
+ 0x07 => 'Template',
449
+ 0x08 => { Name => 'LastModifiedBy', Groups => { 2 => 'Author' } },
450
+ 0x09 => 'RevisionNumber',
451
+ 0x0a => { Name => 'TotalEditTime', PrintConv => 'ConvertTimeSpan($val)' }, # (in sec)
452
+ 0x0b => { Name => 'LastPrinted', Groups => { 2 => 'Time' } },
453
+ 0x0c => {
454
+ Name => 'CreateDate',
455
+ Groups => { 2 => 'Time' },
456
+ PrintConv => '$self->ConvertDateTime($val)',
457
+ },
458
+ 0x0d => {
459
+ Name => 'ModifyDate',
460
+ Groups => { 2 => 'Time' },
461
+ PrintConv => '$self->ConvertDateTime($val)',
462
+ },
463
+ 0x0e => 'Pages',
464
+ 0x0f => 'Words',
465
+ 0x10 => 'Characters',
466
+ 0x11 => { Name => 'ThumbnailClip', Binary => 1 },
467
+ 0x12 => {
468
+ Name => 'Software',
469
+ RawConv => '$$self{Software} = $val', # (use to determine file type)
470
+ },
471
+ 0x13 => {
472
+ Name => 'Security',
473
+ # see http://msdn.microsoft.com/en-us/library/aa379255(VS.85).aspx
474
+ PrintConv => {
475
+ 0 => 'None',
476
+ 1 => 'Password protected',
477
+ 2 => 'Read-only recommended',
478
+ 4 => 'Read-only enforced',
479
+ 8 => 'Locked for annotations',
480
+ },
481
+ },
482
+ 0x80000000 => { Name => 'LocaleIndicator', Groups => { 2 => 'Other' } },
483
+ );
484
+
485
+ # Document Summary Information properties (ref 4)
486
+ %Image::ExifTool::FlashPix::DocumentInfo = (
487
+ PROCESS_PROC => \&ProcessProperties,
488
+ GROUPS => { 2 => 'Document' },
489
+ NOTES => q{
490
+ The DocumentSummaryInformation property set includes a UserDefined property
491
+ set for which only the Hyperlinks and HyperlinkBase tags are pre-defined.
492
+ However, ExifTool will also extract any other information found in the
493
+ UserDefined properties.
494
+ },
495
+ 0x02 => 'Category',
496
+ 0x03 => 'PresentationTarget',
497
+ 0x04 => 'Bytes',
498
+ 0x05 => 'Lines',
499
+ 0x06 => 'Paragraphs',
500
+ 0x07 => 'Slides',
501
+ 0x08 => 'Notes',
502
+ 0x09 => 'HiddenSlides',
503
+ 0x0a => 'MMClips',
504
+ 0x0b => {
505
+ Name => 'ScaleCrop',
506
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
507
+ },
508
+ 0x0c => 'HeadingPairs',
509
+ 0x0d => 'TitleOfParts',
510
+ 0x0e => 'Manager',
511
+ 0x0f => 'Company',
512
+ 0x10 => {
513
+ Name => 'LinksUpToDate',
514
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
515
+ },
516
+ 0x11 => 'CharCountWithSpaces',
517
+ # 0x12 ?
518
+ 0x13 => { #PH (unconfirmed)
519
+ Name => 'SharedDoc',
520
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
521
+ },
522
+ # 0x14 ?
523
+ # 0x15 ?
524
+ 0x16 => {
525
+ Name => 'HyperlinksChanged',
526
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
527
+ },
528
+ 0x17 => { #PH (unconfirmed handling of lower 16 bits)
529
+ Name => 'AppVersion',
530
+ ValueConv => 'sprintf("%d.%.4d",$val >> 16, $val & 0xffff)',
531
+ },
532
+ '_PID_LINKBASE' => {
533
+ Name => 'HyperlinkBase',
534
+ ValueConv => '$self->Decode($val, "UCS2","II")',
535
+ },
536
+ '_PID_HLINKS' => {
537
+ Name => 'Hyperlinks',
538
+ RawConv => \&ProcessHyperlinks,
539
+ },
540
+ );
541
+
542
+ # Image Information properties
543
+ %Image::ExifTool::FlashPix::ImageInfo = (
544
+ PROCESS_PROC => \&ProcessProperties,
545
+ GROUPS => { 2 => 'Image' },
546
+ 0x21000000 => {
547
+ Name => 'FileSource',
548
+ PrintConv => {
549
+ 1 => 'Film Scanner',
550
+ 2 => 'Reflection Print Scanner',
551
+ 3 => 'Digital Camera',
552
+ 4 => 'Video Capture',
553
+ 5 => 'Computer Graphics',
554
+ },
555
+ },
556
+ 0x21000001 => {
557
+ Name => 'SceneType',
558
+ PrintConv => {
559
+ 1 => 'Original Scene',
560
+ 2 => 'Second Generation Scene',
561
+ 3 => 'Digital Scene Generation',
562
+ },
563
+ },
564
+ 0x21000002 => 'CreationPathVector',
565
+ 0x21000003 => 'SoftwareRelease',
566
+ 0x21000004 => 'UserDefinedID',
567
+ 0x21000005 => 'SharpnessApproximation',
568
+ 0x22000000 => { Name => 'Copyright', Groups => { 2 => 'Author' } },
569
+ 0x22000001 => { Name => 'OriginalImageBroker', Groups => { 2 => 'Author' } },
570
+ 0x22000002 => { Name => 'DigitalImageBroker', Groups => { 2 => 'Author' } },
571
+ 0x22000003 => { Name => 'Authorship', Groups => { 2 => 'Author' } },
572
+ 0x22000004 => { Name => 'IntellectualPropertyNotes', Groups => { 2 => 'Author' } },
573
+ 0x23000000 => {
574
+ Name => 'TestTarget',
575
+ PrintConv => {
576
+ 1 => 'Color Chart',
577
+ 2 => 'Gray Card',
578
+ 3 => 'Grayscale',
579
+ 4 => 'Resolution Chart',
580
+ 5 => 'Inch Scale',
581
+ 6 => 'Centimeter Scale',
582
+ 7 => 'Millimeter Scale',
583
+ 8 => 'Micrometer Scale',
584
+ },
585
+ },
586
+ 0x23000002 => 'GroupCaption',
587
+ 0x23000003 => 'CaptionText',
588
+ 0x23000004 => 'People',
589
+ 0x23000007 => 'Things',
590
+ 0x2300000A => {
591
+ Name => 'DateTimeOriginal',
592
+ Description => 'Date/Time Original',
593
+ Groups => { 2 => 'Time' },
594
+ PrintConv => '$self->ConvertDateTime($val)',
595
+ },
596
+ 0x2300000B => 'Events',
597
+ 0x2300000C => 'Places',
598
+ 0x2300000F => 'ContentDescriptionNotes',
599
+ 0x24000000 => { Name => 'Make', Groups => { 2 => 'Camera' } },
600
+ 0x24000001 => {
601
+ Name => 'Model',
602
+ Description => 'Camera Model Name',
603
+ Groups => { 2 => 'Camera' },
604
+ },
605
+ 0x24000002 => { Name => 'SerialNumber', Groups => { 2 => 'Camera' } },
606
+ 0x25000000 => {
607
+ Name => 'CreateDate',
608
+ Groups => { 2 => 'Time' },
609
+ PrintConv => '$self->ConvertDateTime($val)',
610
+ },
611
+ 0x25000001 => {
612
+ Name => 'ExposureTime',
613
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
614
+ },
615
+ 0x25000002 => {
616
+ Name => 'FNumber',
617
+ PrintConv => 'sprintf("%.1f",$val)',
618
+ },
619
+ 0x25000003 => {
620
+ Name => 'ExposureProgram',
621
+ Groups => { 2 => 'Camera' },
622
+ # use PrintConv of corresponding EXIF tag
623
+ PrintConv => $Image::ExifTool::Exif::Main{0x8822}->{PrintConv},
624
+ },
625
+ 0x25000004 => 'BrightnessValue',
626
+ 0x25000005 => 'ExposureCompensation',
627
+ 0x25000006 => {
628
+ Name => 'SubjectDistance',
629
+ Groups => { 2 => 'Camera' },
630
+ PrintConv => 'sprintf("%.3f m", $val)',
631
+ },
632
+ 0x25000007 => {
633
+ Name => 'MeteringMode',
634
+ Groups => { 2 => 'Camera' },
635
+ PrintConv => $Image::ExifTool::Exif::Main{0x9207}->{PrintConv},
636
+ },
637
+ 0x25000008 => {
638
+ Name => 'LightSource',
639
+ Groups => { 2 => 'Camera' },
640
+ PrintConv => $Image::ExifTool::Exif::Main{0x9208}->{PrintConv},
641
+ },
642
+ 0x25000009 => {
643
+ Name => 'FocalLength',
644
+ Groups => { 2 => 'Camera' },
645
+ PrintConv => 'sprintf("%.1f mm",$val)',
646
+ },
647
+ 0x2500000A => {
648
+ Name => 'MaxApertureValue',
649
+ Groups => { 2 => 'Camera' },
650
+ ValueConv => '2 ** ($val / 2)',
651
+ PrintConv => 'sprintf("%.1f",$val)',
652
+ },
653
+ 0x2500000B => {
654
+ Name => 'Flash',
655
+ Groups => { 2 => 'Camera' },
656
+ PrintConv => {
657
+ 1 => 'No Flash',
658
+ 2 => 'Flash Fired',
659
+ },
660
+ },
661
+ 0x2500000C => {
662
+ Name => 'FlashEnergy',
663
+ Groups => { 2 => 'Camera' },
664
+ },
665
+ 0x2500000D => {
666
+ Name => 'FlashReturn',
667
+ Groups => { 2 => 'Camera' },
668
+ PrintConv => {
669
+ 1 => 'Subject Outside Flash Range',
670
+ 2 => 'Subject Inside Flash Range',
671
+ },
672
+ },
673
+ 0x2500000E => {
674
+ Name => 'BackLight',
675
+ PrintConv => {
676
+ 1 => 'Front Lit',
677
+ 2 => 'Back Lit 1',
678
+ 3 => 'Back Lit 2',
679
+ },
680
+ },
681
+ 0x2500000F => { Name => 'SubjectLocation', Groups => { 2 => 'Camera' } },
682
+ 0x25000010 => 'ExposureIndex',
683
+ 0x25000011 => {
684
+ Name => 'SpecialEffectsOpticalFilter',
685
+ PrintConv => {
686
+ 1 => 'None',
687
+ 2 => 'Colored',
688
+ 3 => 'Diffusion',
689
+ 4 => 'Multi-image',
690
+ 5 => 'Polarizing',
691
+ 6 => 'Split-field',
692
+ 7 => 'Star',
693
+ },
694
+ },
695
+ 0x25000012 => 'PerPictureNotes',
696
+ 0x26000000 => {
697
+ Name => 'SensingMethod',
698
+ Groups => { 2 => 'Camera' },
699
+ PrintConv => $Image::ExifTool::Exif::Main{0x9217}->{PrintConv},
700
+ },
701
+ 0x26000001 => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } },
702
+ 0x26000002 => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } },
703
+ 0x26000003 => {
704
+ Name => 'FocalPlaneResolutionUnit',
705
+ Groups => { 2 => 'Camera' },
706
+ PrintConv => $Image::ExifTool::Exif::Main{0xa210}->{PrintConv},
707
+ },
708
+ 0x26000004 => 'SpatialFrequencyResponse',
709
+ 0x26000005 => 'CFAPattern',
710
+ 0x27000001 => {
711
+ Name => 'FilmCategory',
712
+ PrintConv => {
713
+ 1 => 'Negative B&W',
714
+ 2 => 'Negative Color',
715
+ 3 => 'Reversal B&W',
716
+ 4 => 'Reversal Color',
717
+ 5 => 'Chromagenic',
718
+ 6 => 'Internegative B&W',
719
+ 7 => 'Internegative Color',
720
+ },
721
+ },
722
+ 0x26000007 => 'ISO',
723
+ 0x26000008 => 'Opto-ElectricConvFactor',
724
+ 0x27000000 => 'FilmBrand',
725
+ 0x27000001 => 'FilmCategory',
726
+ 0x27000002 => 'FilmSize',
727
+ 0x27000003 => 'FilmRollNumber',
728
+ 0x27000004 => 'FilmFrameNumber',
729
+ 0x29000000 => 'OriginalScannedImageSize',
730
+ 0x29000001 => 'OriginalDocumentSize',
731
+ 0x29000002 => {
732
+ Name => 'OriginalMedium',
733
+ PrintConv => {
734
+ 1 => 'Continuous Tone Image',
735
+ 2 => 'Halftone Image',
736
+ 3 => 'Line Art',
737
+ },
738
+ },
739
+ 0x29000003 => {
740
+ Name => 'TypeOfOriginal',
741
+ PrintConv => {
742
+ 1 => 'B&W Print',
743
+ 2 => 'Color Print',
744
+ 3 => 'B&W Document',
745
+ 4 => 'Color Document',
746
+ },
747
+ },
748
+ 0x28000000 => 'ScannerMake',
749
+ 0x28000001 => 'ScannerModel',
750
+ 0x28000002 => 'ScannerSerialNumber',
751
+ 0x28000003 => 'ScanSoftware',
752
+ 0x28000004 => { Name => 'ScanSoftwareRevisionDate', Groups => { 2 => 'Time' } },
753
+ 0x28000005 => 'ServiceOrganizationName',
754
+ 0x28000006 => 'ScanOperatorID',
755
+ 0x28000008 => {
756
+ Name => 'ScanDate',
757
+ Groups => { 2 => 'Time' },
758
+ PrintConv => '$self->ConvertDateTime($val)',
759
+ },
760
+ 0x28000009 => {
761
+ Name => 'ModifyDate',
762
+ Groups => { 2 => 'Time' },
763
+ PrintConv => '$self->ConvertDateTime($val)',
764
+ },
765
+ 0x2800000A => 'ScannerPixelSize',
766
+ );
767
+
768
+ # Image Contents properties
769
+ %Image::ExifTool::FlashPix::Image = (
770
+ PROCESS_PROC => \&ProcessProperties,
771
+ GROUPS => { 2 => 'Image' },
772
+ # VARS storage is used as a hash lookup for tagID's which aren't constant.
773
+ # The key is a mask for significant bits of the tagID, and the value
774
+ # is a lookup for tagID's for which this mask is valid.
775
+ VARS => {
776
+ # ID's are different for each subimage
777
+ 0xff00ffff => {
778
+ 0x02000000=>1, 0x02000001=>1, 0x02000002=>1, 0x02000003=>1,
779
+ 0x02000004=>1, 0x02000005=>1, 0x02000006=>1, 0x02000007=>1,
780
+ 0x03000001=>1,
781
+ },
782
+ },
783
+ 0x01000000 => 'NumberOfResolutions',
784
+ 0x01000002 => 'ImageWidth', # width of highest resolution image
785
+ 0x01000003 => 'ImageHeight',
786
+ 0x01000004 => 'DefaultDisplayHeight',
787
+ 0x01000005 => 'DefaultDisplayWidth',
788
+ 0x01000006 => {
789
+ Name => 'DisplayUnits',
790
+ PrintConv => {
791
+ 0 => 'inches',
792
+ 1 => 'meters',
793
+ 2 => 'cm',
794
+ 3 => 'mm',
795
+ },
796
+ },
797
+ 0x02000000 => 'SubimageWidth',
798
+ 0x02000001 => 'SubimageHeight',
799
+ 0x02000002 => {
800
+ Name => 'SubimageColor',
801
+ # decode only component count and color space of first component
802
+ ValueConv => 'sprintf("%.2x %.4x", unpack("x4vx4v",$val))',
803
+ PrintConv => {
804
+ '01 0000' => 'Opacity Only',
805
+ '01 8000' => 'Opacity Only (uncalibrated)',
806
+ '01 0001' => 'Monochrome',
807
+ '01 8001' => 'Monochrome (uncalibrated)',
808
+ '03 0002' => 'YCbCr',
809
+ '03 8002' => 'YCbCr (uncalibrated)',
810
+ '03 0003' => 'RGB',
811
+ '03 8003' => 'RGB (uncalibrated)',
812
+ '04 0002' => 'YCbCr with Opacity',
813
+ '04 8002' => 'YCbCr with Opacity (uncalibrated)',
814
+ '04 0003' => 'RGB with Opacity',
815
+ '04 8003' => 'RGB with Opacity (uncalibrated)',
816
+ },
817
+ },
818
+ 0x02000003 => {
819
+ Name => 'SubimageNumericalFormat',
820
+ PrintConv => {
821
+ 17 => '8-bit, Unsigned',
822
+ 18 => '16-bit, Unsigned',
823
+ 19 => '32-bit, Unsigned',
824
+ },
825
+ },
826
+ 0x02000004 => {
827
+ Name => 'DecimationMethod',
828
+ PrintConv => {
829
+ 0 => 'None (Full-sized Image)',
830
+ 8 => '8-point Prefilter',
831
+ },
832
+ },
833
+ 0x02000005 => 'DecimationPrefilterWidth',
834
+ 0x02000007 => 'SubimageICC_Profile',
835
+ 0x03000001 => { Name => 'JPEGTables', Binary => 1 },
836
+ 0x03000002 => 'MaxJPEGTableIndex',
837
+ );
838
+
839
+ # Extension List properties
840
+ %Image::ExifTool::FlashPix::Extensions = (
841
+ PROCESS_PROC => \&ProcessProperties,
842
+ GROUPS => { 2 => 'Other' },
843
+ VARS => {
844
+ # ID's are different for each extension type
845
+ 0x0000ffff => {
846
+ 0x0001=>1, 0x0002=>1, 0x0003=>1, 0x0004=>1,
847
+ 0x0005=>1, 0x0006=>1, 0x0007=>1, 0x1000=>1,
848
+ 0x2000=>1, 0x2001=>1, 0x3000=>1, 0x4000=>1,
849
+ },
850
+ 0x0000f00f => { 0x3001=>1, 0x3002=>1 },
851
+ },
852
+ 0x10000000 => 'UsedExtensionNumbers',
853
+ 0x0001 => 'ExtensionName',
854
+ 0x0002 => 'ExtensionClassID',
855
+ 0x0003 => {
856
+ Name => 'ExtensionPersistence',
857
+ PrintConv => {
858
+ 0 => 'Always Valid',
859
+ 1 => 'Invalidated By Modification',
860
+ 2 => 'Potentially Invalidated By Modification',
861
+ },
862
+ },
863
+ 0x0004 => { Name => 'ExtensionCreateDate', Groups => { 2 => 'Time' } },
864
+ 0x0005 => { Name => 'ExtensionModifyDate', Groups => { 2 => 'Time' } },
865
+ 0x0006 => 'CreatingApplication',
866
+ 0x0007 => 'ExtensionDescription',
867
+ 0x1000 => 'Storage-StreamPathname',
868
+ 0x2000 => 'FlashPixStreamPathname',
869
+ 0x2001 => 'FlashPixStreamFieldOffset',
870
+ 0x3000 => 'PropertySetPathname',
871
+ 0x3001 => 'PropertySetIDCodes',
872
+ 0x3002 => 'PropertyVectorElements',
873
+ 0x4000 => 'SubimageResolutions',
874
+ );
875
+
876
+ # Subimage Header tags
877
+ %Image::ExifTool::FlashPix::SubimageHdr = (
878
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
879
+ FORMAT => 'int32u',
880
+ # 0 => 'HeaderLength',
881
+ 1 => 'SubimageWidth',
882
+ 2 => 'SubimageHeight',
883
+ 3 => 'SubimageTileCount',
884
+ 4 => 'SubimageTileWidth',
885
+ 5 => 'SubimageTileHeight',
886
+ 6 => 'NumChannels',
887
+ # 7 => 'TileHeaderOffset',
888
+ # 8 => 'TileHeaderLength',
889
+ # ... followed by tile header table
890
+ );
891
+
892
+ # Data Object properties
893
+ %Image::ExifTool::FlashPix::DataObject = (
894
+ PROCESS_PROC => \&ProcessProperties,
895
+ GROUPS => { 2 => 'Other' },
896
+ 0x00010000 => 'DataObjectID',
897
+ 0x00010002 => 'LockedPropertyList',
898
+ 0x00010003 => 'DataObjectTitle',
899
+ 0x00010004 => 'LastModifier',
900
+ 0x00010005 => 'RevisionNumber',
901
+ 0x00010006 => { Name => 'DataCreateDate', Groups => { 2 => 'Time' } },
902
+ 0x00010007 => { Name => 'DataModifyDate', Groups => { 2 => 'Time' } },
903
+ 0x00010008 => 'CreatingApplication',
904
+ 0x00010100 => {
905
+ Name => 'DataObjectStatus',
906
+ PrintConv => q{
907
+ ($val & 0x0000ffff ? 'Exists' : 'Does Not Exist') .
908
+ ', ' . ($val & 0xffff0000 ? 'Not ' : '') . 'Purgeable'
909
+ },
910
+ },
911
+ 0x00010101 => {
912
+ Name => 'CreatingTransform',
913
+ PrintConv => '$val ? $val : "Source Image"',
914
+ },
915
+ 0x00010102 => 'UsingTransforms',
916
+ 0x10000000 => 'CachedImageHeight',
917
+ 0x10000001 => 'CachedImageWidth',
918
+ );
919
+
920
+ # Transform properties
921
+ %Image::ExifTool::FlashPix::Transform = (
922
+ PROCESS_PROC => \&ProcessProperties,
923
+ GROUPS => { 2 => 'Other' },
924
+ 0x00010000 => 'TransformNodeID',
925
+ 0x00010001 => 'OperationClassID',
926
+ 0x00010002 => 'LockedPropertyList',
927
+ 0x00010003 => 'TransformTitle',
928
+ 0x00010004 => 'LastModifier',
929
+ 0x00010005 => 'RevisionNumber',
930
+ 0x00010006 => { Name => 'TransformCreateDate', Groups => { 2 => 'Time' } },
931
+ 0x00010007 => { Name => 'TransformModifyDate', Groups => { 2 => 'Time' } },
932
+ 0x00010008 => 'CreatingApplication',
933
+ 0x00010100 => 'InputDataObjectList',
934
+ 0x00010101 => 'OutputDataObjectList',
935
+ 0x00010102 => 'OperationNumber',
936
+ 0x10000000 => 'ResultAspectRatio',
937
+ 0x10000001 => 'RectangleOfInterest',
938
+ 0x10000002 => 'Filtering',
939
+ 0x10000003 => 'SpatialOrientation',
940
+ 0x10000004 => 'ColorTwistMatrix',
941
+ 0x10000005 => 'ContrastAdjustment',
942
+ );
943
+
944
+ # Operation properties
945
+ %Image::ExifTool::FlashPix::Operation = (
946
+ PROCESS_PROC => \&ProcessProperties,
947
+ 0x00010000 => 'OperationID',
948
+ );
949
+
950
+ # Global Info properties
951
+ %Image::ExifTool::FlashPix::GlobalInfo = (
952
+ PROCESS_PROC => \&ProcessProperties,
953
+ 0x00010002 => 'LockedPropertyList',
954
+ 0x00010003 => 'TransformedImageTitle',
955
+ 0x00010004 => 'LastModifier',
956
+ 0x00010100 => 'VisibleOutputs',
957
+ 0x00010101 => 'MaximumImageIndex',
958
+ 0x00010102 => 'MaximumTransformIndex',
959
+ 0x00010103 => 'MaximumOperationIndex',
960
+ );
961
+
962
+ # Audio Info properties
963
+ %Image::ExifTool::FlashPix::AudioInfo = (
964
+ PROCESS_PROC => \&ProcessProperties,
965
+ GROUPS => { 2 => 'Audio' },
966
+ );
967
+
968
+ # MacroMedia flash contents
969
+ %Image::ExifTool::FlashPix::Contents = (
970
+ PROCESS_PROC => \&ProcessProperties,
971
+ GROUPS => { 2 => 'Image' },
972
+ );
973
+
974
+ # CompObj tags
975
+ %Image::ExifTool::FlashPix::CompObj = (
976
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
977
+ GROUPS => { 2 => 'Other' },
978
+ FORMAT => 'int32u',
979
+ 0 => { Name => 'CompObjUserTypeLen' },
980
+ 1 => {
981
+ Name => 'CompObjUserType',
982
+ Format => 'string[$val{0}]',
983
+ RawConv => '$$self{CompObjUserType} = $val', # (use to determine file type)
984
+ },
985
+ );
986
+
987
+ # composite FlashPix tags
988
+ %Image::ExifTool::FlashPix::Composite = (
989
+ GROUPS => { 2 => 'Image' },
990
+ PreviewImage => {
991
+ # extract JPEG preview from ScreenNail if possible
992
+ Require => {
993
+ 0 => 'ScreenNail',
994
+ },
995
+ Binary => 1,
996
+ RawConv => q{
997
+ return undef unless $val[0] =~ /\xff\xd8\xff/g;
998
+ return substr($val[0], pos($val[0])-3);
999
+ },
1000
+ },
1001
+ );
1002
+
1003
+ # add our composite tags
1004
+ Image::ExifTool::AddCompositeTags('Image::ExifTool::FlashPix');
1005
+
1006
+ #------------------------------------------------------------------------------
1007
+ # Process hyperlinks from PID_HYPERLINKS array
1008
+ # (ref http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnaro97ta/html/msdn_hyper97.asp)
1009
+ # Inputs: 0) value, 1) ExifTool ref
1010
+ # Returns: list of hyperlinks
1011
+ sub ProcessHyperlinks($$)
1012
+ {
1013
+ my ($val, $exifTool) = @_;
1014
+
1015
+ # process as an array of VT_VARIANT's
1016
+ my $dirEnd = length $val;
1017
+ return undef if $dirEnd < 4;
1018
+ my $num = Get32u(\$val, 0);
1019
+ my $valPos = 4;
1020
+ my ($i, @vals);
1021
+ for ($i=0; $i<$num; ++$i) {
1022
+ # read VT_BLOB entries as an array of VT_VARIANT's
1023
+ my $value = ReadFPXValue($exifTool, \$val, $valPos, VT_VARIANT, $dirEnd);
1024
+ last unless defined $value;
1025
+ push @vals, $value;
1026
+ }
1027
+ # filter values to extract only the links
1028
+ my @links;
1029
+ for ($i=0; $i<@vals; $i+=6) {
1030
+ push @links, $vals[$i+4]; # get address
1031
+ $links[-1] .= '#' . $vals[$i+5] if length $vals[$i+5]; # add subaddress
1032
+ }
1033
+ return \@links;
1034
+ }
1035
+
1036
+ #------------------------------------------------------------------------------
1037
+ # Read FlashPix value
1038
+ # Inputs: 0) ExifTool ref, 1) data ref, 2) value offset, 3) FPX format number,
1039
+ # 4) end offset, 5) flag for no padding, 6) code page
1040
+ # Returns: converted value (or list of values in list context) and updates
1041
+ # value offset to end of value if successful, or returns undef on error
1042
+ sub ReadFPXValue($$$$$;$$)
1043
+ {
1044
+ my ($exifTool, $dataPt, $valPos, $type, $dirEnd, $noPad, $codePage) = @_;
1045
+ my @vals;
1046
+
1047
+ my $format = $oleFormat{$type & 0x0fff};
1048
+ while ($format) {
1049
+ my $count = 1;
1050
+ # handle VT_VECTOR types
1051
+ my $flags = $type & 0xf000;
1052
+ if ($flags) {
1053
+ if ($flags == VT_VECTOR) {
1054
+ $noPad = 1; # values don't seem to be padded inside vectors
1055
+ my $size = $oleFormatSize{VT_VECTOR};
1056
+ last if $valPos + $size > $dirEnd;
1057
+ $count = Get32u($dataPt, $valPos);
1058
+ push @vals, '' if $count == 0; # allow zero-element vector
1059
+ $valPos += 4;
1060
+ } else {
1061
+ # can't yet handle this property flag
1062
+ last;
1063
+ }
1064
+ }
1065
+ unless ($format =~ /^VT_/) {
1066
+ my $size = Image::ExifTool::FormatSize($format) * $count;
1067
+ last if $valPos + $size > $dirEnd;
1068
+ @vals = ReadValue($dataPt, $valPos, $format, $count, $size);
1069
+ # update position to end of value plus padding
1070
+ $valPos += ($count * $size + 3) & 0xfffffffc;
1071
+ last;
1072
+ }
1073
+ my $size = $oleFormatSize{$format};
1074
+ my ($item, $val);
1075
+ for ($item=0; $item<$count; ++$item) {
1076
+ last if $valPos + $size > $dirEnd;
1077
+ if ($format eq 'VT_VARIANT') {
1078
+ my $subType = Get32u($dataPt, $valPos);
1079
+ $valPos += $size;
1080
+ $val = ReadFPXValue($exifTool, $dataPt, $valPos, $subType, $dirEnd, $noPad, $codePage);
1081
+ last unless defined $val;
1082
+ push @vals, $val;
1083
+ next; # avoid adding $size to $valPos again
1084
+ } elsif ($format eq 'VT_FILETIME') {
1085
+ # convert from time in 100 ns increments to time in seconds
1086
+ $val = 1e-7 * Image::ExifTool::Get64u($dataPt, $valPos);
1087
+ # print as date/time if value is greater than one year (PH hack)
1088
+ if ($val > 365 * 24 * 3600) {
1089
+ # shift from Jan 1, 1601 to Jan 1, 1970
1090
+ $val -= 134774 * 24 * 3600;
1091
+ $val = Image::ExifTool::ConvertUnixTime($val);
1092
+ }
1093
+ } elsif ($format eq 'VT_DATE') {
1094
+ $val = Image::ExifTool::GetDouble($dataPt, $valPos);
1095
+ # shift zero from Dec 30, 1899 to Jan 1, 1970 and convert to secs
1096
+ $val = ($val - 25569) * 24 * 3600 if $val != 0;
1097
+ $val = Image::ExifTool::ConvertUnixTime($val);
1098
+ } elsif ($format =~ /STR$/) {
1099
+ my $len = Get32u($dataPt, $valPos);
1100
+ $len *= 2 if $format eq 'VT_LPWSTR'; # convert to byte count
1101
+ last if $valPos + $len + 4 > $dirEnd;
1102
+ $val = substr($$dataPt, $valPos + 4, $len);
1103
+ if ($format eq 'VT_LPWSTR') {
1104
+ # convert wide string from Unicode
1105
+ $val = $exifTool->Decode($val, 'UCS2');
1106
+ } elsif ($codePage) {
1107
+ my $charset = $Image::ExifTool::charsetName{"cp$codePage"};
1108
+ if ($charset) {
1109
+ $val = $exifTool->Decode($val, $charset);
1110
+ } elsif ($codePage eq 1200) { # UTF-16, little endian
1111
+ $val = $exifTool->Decode(undef, 'UCS2', 'II');
1112
+ }
1113
+ }
1114
+ $val =~ s/\0.*//s; # truncate at null terminator
1115
+ # update position for string length
1116
+ # (the spec states that strings should be padded to align
1117
+ # on even 32-bit boundaries, but this isn't always the case)
1118
+ $valPos += $noPad ? $len : ($len + 3) & 0xfffffffc;
1119
+ } elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') {
1120
+ my $len = Get32u($dataPt, $valPos);
1121
+ last if $valPos + $len + 4 > $dirEnd;
1122
+ $val = substr($$dataPt, $valPos + 4, $len);
1123
+ # update position for data length plus padding
1124
+ # (does this padding disappear in arrays too?)
1125
+ $valPos += ($len + 3) & 0xfffffffc;
1126
+ } elsif ($format eq 'VT_CLSID') {
1127
+ $val = Image::ExifTool::ASF::GetGUID(substr($$dataPt, $valPos, $size));
1128
+ }
1129
+ $valPos += $size; # update value pointer to end of value
1130
+ push @vals, $val;
1131
+ }
1132
+ # join VT_ values with commas unless we want an array
1133
+ @vals = ( join $exifTool->Options('ListSep'), @vals ) if @vals > 1 and not wantarray;
1134
+ last; # didn't really want to loop
1135
+ }
1136
+ $_[2] = $valPos; # return updated value position
1137
+
1138
+ if (wantarray) {
1139
+ return @vals;
1140
+ } elsif (@vals > 1) {
1141
+ return join(' ', @vals);
1142
+ } else {
1143
+ return $vals[0];
1144
+ }
1145
+ }
1146
+
1147
+ #------------------------------------------------------------------------------
1148
+ # Scan for XMP in FLA Contents (ref PH)
1149
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
1150
+ # Returns: 1 on success
1151
+ # Notes: FLA format is proprietary and I couldn't find any documentation,
1152
+ # so this routine is entirely based on observations from sample files
1153
+ sub ProcessContents($$$)
1154
+ {
1155
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
1156
+ my $dataPt = $$dirInfo{DataPt};
1157
+ my $isFLA;
1158
+
1159
+ # all of my FLA samples contain "Contents" data, an no other FPX-like samples have
1160
+ # this, but check the data for a familiar pattern to be sure this is FLA: the
1161
+ # Contents of all of my FLA samples start with two bytes (0x29,0x38,0x3f,0x43 or 0x47,
1162
+ # then 0x01) followed by a number of zero bytes (from 0x18 to 0x26 of them, related
1163
+ # somehow to the value of the first byte), followed by the string "DocumentPage"
1164
+ $isFLA = 1 if $$dataPt =~ /^..\0+\xff\xff\x01\0\x0d\0CDocumentPage/s;
1165
+
1166
+ # do a brute-force scan of the "Contents" for UTF-16 XMP
1167
+ # (this may always be little-endian, but allow for either endianness)
1168
+ if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0b\0e\0g\0i\0n\0=\0['"](\0\xff\xfe|\xfe\xff)/g) {
1169
+ $$dirInfo{DirStart} = pos($$dataPt) - 36;
1170
+ if ($$dataPt =~ /<\0\?\0x\0p\0a\0c\0k\0e\0t\0 \0e\0n\0d\0=\0['"]\0[wr]\0['"]\0\?\0>\0?/g) {
1171
+ $$dirInfo{DirLen} = pos($$dataPt) - $$dirInfo{DirStart};
1172
+ Image::ExifTool::XMP::ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
1173
+ # override format if not already FLA but XMP-dc:Format indicates it is
1174
+ $isFLA = 1 if $$exifTool{FILE_TYPE} ne 'FLA' and $$exifTool{VALUE}{Format} and
1175
+ $$exifTool{VALUE}{Format} eq 'application/vnd.adobe.fla';
1176
+ }
1177
+ }
1178
+ $exifTool->OverrideFileType('FLA') if $isFLA;
1179
+ return 1;
1180
+ }
1181
+
1182
+ #------------------------------------------------------------------------------
1183
+ # Check FPX byte order mark (BOM) and set byte order appropriately
1184
+ # Inputs: 0) data ref, 1) offset to BOM
1185
+ # Returns: true on success
1186
+ sub CheckBOM($$)
1187
+ {
1188
+ my ($dataPt, $pos) = @_;
1189
+ my $bom = Get16u($dataPt, $pos);
1190
+ return 1 if $bom == 0xfffe;
1191
+ return 0 unless $bom == 0xfeff;
1192
+ ToggleByteOrder();
1193
+ return 1;
1194
+ }
1195
+
1196
+ #------------------------------------------------------------------------------
1197
+ # Process FlashPix properties
1198
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
1199
+ # Returns: 1 on success
1200
+ sub ProcessProperties($$$)
1201
+ {
1202
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
1203
+ my $dataPt = $$dirInfo{DataPt};
1204
+ my $pos = $$dirInfo{DirStart} || 0;
1205
+ my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $pos;
1206
+ my $dirEnd = $pos + $dirLen;
1207
+ my $verbose = $exifTool->Options('Verbose');
1208
+ my $n;
1209
+
1210
+ if ($dirLen < 48) {
1211
+ $exifTool->Warn('Truncated FPX properties');
1212
+ return 0;
1213
+ }
1214
+ # check and set our byte order if necessary
1215
+ unless (CheckBOM($dataPt, $pos)) {
1216
+ $exifTool->Warn('Bad FPX property byte order mark');
1217
+ return 0;
1218
+ }
1219
+ # get position of start of section
1220
+ $pos = Get32u($dataPt, $pos + 44);
1221
+ if ($pos < 48) {
1222
+ $exifTool->Warn('Bad FPX property section offset');
1223
+ return 0;
1224
+ }
1225
+ for ($n=0; $n<2; ++$n) {
1226
+ my %dictionary; # dictionary to translate user-defined properties
1227
+ my $codePage;
1228
+ last if $pos + 8 > $dirEnd;
1229
+ # read property section header
1230
+ my $size = Get32u($dataPt, $pos);
1231
+ last unless $size;
1232
+ my $numEntries = Get32u($dataPt, $pos + 4);
1233
+ $verbose and $exifTool->VerboseDir('Property Info', $numEntries, $size);
1234
+ if ($pos + 8 + 8 * $numEntries > $dirEnd) {
1235
+ $exifTool->Warn('Truncated property list');
1236
+ last;
1237
+ }
1238
+ my $index;
1239
+ for ($index=0; $index<$numEntries; ++$index) {
1240
+ my $entry = $pos + 8 + 8 * $index;
1241
+ my $tag = Get32u($dataPt, $entry);
1242
+ my $offset = Get32u($dataPt, $entry + 4);
1243
+ my $valStart = $pos + 4 + $offset;
1244
+ last if $valStart >= $dirEnd;
1245
+ my $valPos = $valStart;
1246
+ my $type = Get32u($dataPt, $pos + $offset);
1247
+ if ($tag == 0) {
1248
+ # read dictionary to get tag name lookup for this property set
1249
+ my $i;
1250
+ for ($i=0; $i<$type; ++$i) {
1251
+ last if $valPos + 8 > $dirEnd;
1252
+ $tag = Get32u($dataPt, $valPos);
1253
+ my $len = Get32u($dataPt, $valPos + 4);
1254
+ $valPos += 8 + $len;
1255
+ last if $valPos > $dirEnd;
1256
+ my $name = substr($$dataPt, $valPos - $len, $len);
1257
+ $name =~ s/\0.*//s;
1258
+ next unless length $name;
1259
+ $dictionary{$tag} = $name;
1260
+ next if $$tagTablePtr{$name};
1261
+ $tag = $name;
1262
+ $name =~ s/(^| )([a-z])/\U$2/g; # start with uppercase
1263
+ $name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
1264
+ next unless length $name;
1265
+ $exifTool->VPrint(0, "$$exifTool{INDENT}\[adding $name]\n") if $verbose;
1266
+ AddTagToTable($tagTablePtr, $tag, { Name => $name });
1267
+ }
1268
+ next;
1269
+ }
1270
+ # use tag name from dictionary if available
1271
+ my ($custom, $val);
1272
+ if (defined $dictionary{$tag}) {
1273
+ $tag = $dictionary{$tag};
1274
+ $custom = 1;
1275
+ }
1276
+ my @vals = ReadFPXValue($exifTool, $dataPt, $valPos, $type, $dirEnd, undef, $codePage);
1277
+ @vals or $exifTool->Warn('Error reading property value');
1278
+ $val = @vals > 1 ? \@vals : $vals[0];
1279
+ my $format = $type & 0x0fff;
1280
+ my $flags = $type & 0xf000;
1281
+ my $formStr = $oleFormat{$format} || "Type $format";
1282
+ $formStr .= '|' . ($oleFlags{$flags} || sprintf("0x%x",$flags)) if $flags;
1283
+ my $tagInfo;
1284
+ # check for common tag ID's: Dictionary, CodePage and LocaleIndicator
1285
+ # (must be done before masking because masked tags may overlap these ID's)
1286
+ if (not $custom and ($tag == 1 or $tag == 0x80000000)) {
1287
+ # get tagInfo from SummaryInfo table
1288
+ my $summaryTable = GetTagTable('Image::ExifTool::FlashPix::SummaryInfo');
1289
+ $tagInfo = $exifTool->GetTagInfo($summaryTable, $tag);
1290
+ if ($tag == 1) {
1291
+ $val += 0x10000 if $val < 0; # (may be incorrectly stored as int16s)
1292
+ $codePage = $val; # save code page for translating values
1293
+ }
1294
+ } elsif ($$tagTablePtr{$tag}) {
1295
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
1296
+ } elsif ($$tagTablePtr{VARS} and not $custom) {
1297
+ # mask off insignificant bits of tag ID if necessary
1298
+ my $masked = $$tagTablePtr{VARS};
1299
+ my $mask;
1300
+ foreach $mask (keys %$masked) {
1301
+ if ($masked->{$mask}->{$tag & $mask}) {
1302
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag & $mask);
1303
+ last;
1304
+ }
1305
+ }
1306
+ }
1307
+ $exifTool->HandleTag($tagTablePtr, $tag, $val,
1308
+ DataPt => $dataPt,
1309
+ Start => $valStart,
1310
+ Size => $valPos - $valStart,
1311
+ Format => $formStr,
1312
+ Index => $index,
1313
+ TagInfo => $tagInfo,
1314
+ Extra => ", type=$type",
1315
+ );
1316
+ }
1317
+ # issue warning if we hit end of property section prematurely
1318
+ $exifTool->Warn('Truncated property data') if $index < $numEntries;
1319
+ last unless $$dirInfo{Multi};
1320
+ $pos += $size;
1321
+ }
1322
+
1323
+ return 1;
1324
+ }
1325
+
1326
+ #------------------------------------------------------------------------------
1327
+ # Load chain of sectors from file
1328
+ # Inputs: 0) RAF ref, 1) first sector number, 2) FAT ref, 3) sector size, 4) header size
1329
+ sub LoadChain($$$$$)
1330
+ {
1331
+ my ($raf, $sect, $fatPt, $sectSize, $hdrSize) = @_;
1332
+ return undef unless $raf;
1333
+ my $chain = '';
1334
+ my ($buff, %loadedSect);
1335
+ for (;;) {
1336
+ last if $sect >= END_OF_CHAIN;
1337
+ return undef if $loadedSect{$sect}; # avoid infinite loop
1338
+ $loadedSect{$sect} = 1;
1339
+ my $offset = $sect * $sectSize + $hdrSize;
1340
+ return undef unless ($offset <= 0x7fffffff or $$raf{LargeFileSupport}) and
1341
+ $raf->Seek($offset, 0) and
1342
+ $raf->Read($buff, $sectSize) == $sectSize;
1343
+ $chain .= $buff;
1344
+ # step to next sector in chain
1345
+ return undef if $sect * 4 > length($$fatPt) - 4;
1346
+ $sect = Get32u($fatPt, $sect * 4);
1347
+ }
1348
+ return $chain;
1349
+ }
1350
+
1351
+ #------------------------------------------------------------------------------
1352
+ # Extract information from a JPEG APP2 FPXR segment
1353
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
1354
+ # Returns: 1 on success
1355
+ sub ProcessFPXR($$$)
1356
+ {
1357
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
1358
+ my $dataPt = $$dirInfo{DataPt};
1359
+ my $dirStart = $$dirInfo{DirStart};
1360
+ my $dirLen = $$dirInfo{DirLen};
1361
+ my $verbose = $exifTool->Options('Verbose');
1362
+
1363
+ if ($dirLen < 13) {
1364
+ $exifTool->Warn('FPXR segment to small');
1365
+ return 0;
1366
+ }
1367
+
1368
+ # get version and segment type (version is 0 in all my samples)
1369
+ my ($vers, $type) = unpack('x5C2', $$dataPt);
1370
+
1371
+ if ($type == 1) { # a "Contents List" segment
1372
+
1373
+ $vers != 0 and $exifTool->Warn("Untested FPXR version $vers");
1374
+ if ($$exifTool{FPXR}) {
1375
+ $exifTool->Warn('Multiple FPXR contents lists');
1376
+ delete $$exifTool{FPXR};
1377
+ }
1378
+ my $numEntries = unpack('x7n', $$dataPt);
1379
+ my @contents;
1380
+ $verbose and $exifTool->VerboseDir('Contents List', $numEntries);
1381
+ my $pos = 9;
1382
+ my $entry;
1383
+ for ($entry = 0; $entry < $numEntries; ++$entry) {
1384
+ if ($pos + 4 > $dirLen) {
1385
+ $exifTool->Warn('Truncated FPXR contents');
1386
+ return 0;
1387
+ }
1388
+ my ($size, $default) = unpack("x${pos}Na", $$dataPt);
1389
+ pos($$dataPt) = $pos + 5;
1390
+ # according to the spec, this string is little-endian
1391
+ # (very odd, since the size word is big-endian),
1392
+ # and the first char must be '/'
1393
+ unless ($$dataPt =~ m{\G(/\0(..)*?)\0\0}sg) {
1394
+ $exifTool->Warn('Invalid FPXR stream name');
1395
+ return 0;
1396
+ }
1397
+ # convert stream pathname to ascii
1398
+ my $name = Image::ExifTool::Decode(undef, $1, 'UCS2', 'II', 'Latin');
1399
+ if ($verbose) {
1400
+ my $psize = ($size == 0xffffffff) ? 'storage' : "$size bytes";
1401
+ $exifTool->VPrint(0," | $entry) Name: '$name' [$psize]\n");
1402
+ }
1403
+ # remove directory specification
1404
+ $name =~ s{.*/}{}s;
1405
+ # read storage class ID if necessary
1406
+ my $classID;
1407
+ if ($size == 0xffffffff) {
1408
+ unless ($$dataPt =~ m{(.{16})}sg) {
1409
+ $exifTool->Warn('Truncated FPXR storage class ID');
1410
+ return 0;
1411
+ }
1412
+ # unpack class ID in case we want to use it sometime
1413
+ $classID = Image::ExifTool::ASF::GetGUID($1);
1414
+ }
1415
+ # update position in list
1416
+ $pos = pos($$dataPt);
1417
+ # add to our contents list
1418
+ push @contents, {
1419
+ Name => $name,
1420
+ Size => $size,
1421
+ Default => $default,
1422
+ ClassID => $classID,
1423
+ };
1424
+ }
1425
+ # save contents list as $exifTool member variable
1426
+ # (must do this last so we don't save list on error)
1427
+ $$exifTool{FPXR} = \@contents;
1428
+
1429
+ } elsif ($type == 2) { # a "Stream Data" segment
1430
+
1431
+ # get the contents list index and stream data offset
1432
+ my ($index, $offset) = unpack('x7nN', $$dataPt);
1433
+ my $fpxr = $$exifTool{FPXR};
1434
+ if ($fpxr and $$fpxr[$index]) {
1435
+ my $obj = $$fpxr[$index];
1436
+ # extract stream data (after 13-byte header)
1437
+ if (not defined $$obj{Stream}) {
1438
+ # ignore offset for first segment of this type
1439
+ # (in my sample images, this isn't always zero as one would expect)
1440
+ $$obj{Stream} = substr($$dataPt, $dirStart+13);
1441
+ } else {
1442
+ # add data to the stream at the proper offset
1443
+ my $pad = $offset - length($$obj{Stream});
1444
+ if ($pad >= 0) {
1445
+ if ($pad) {
1446
+ if ($pad > 0x10000) {
1447
+ $exifTool->Warn("Bad FPXR stream offset ($offset)");
1448
+ } else {
1449
+ # pad with default value to specified offset
1450
+ $exifTool->Warn("Padding FPXR stream with $pad default bytes",1);
1451
+ $$obj{Stream} .= ($$obj{Default} x $pad);
1452
+ }
1453
+ }
1454
+ # concatenate data with this stream
1455
+ $$obj{Stream} .= substr($$dataPt, $dirStart+13);
1456
+ } else {
1457
+ $exifTool->Warn("Duplicate FPXR stream data at offset $offset");
1458
+ substr($$obj{Stream}, $offset, -$pad) = substr($$dataPt, $dirStart+13);
1459
+ }
1460
+ }
1461
+ # save value for this tag if stream is complete
1462
+ my $len = length $$obj{Stream};
1463
+ if ($len >= $$obj{Size}) {
1464
+ if ($verbose) {
1465
+ $exifTool->VPrint(0, " + [FPXR stream, Contents index $index, $len bytes]\n");
1466
+ }
1467
+ if ($len > $$obj{Size}) {
1468
+ $exifTool->Warn('Extra data in FPXR segment (truncated)');
1469
+ $$obj{Stream} = substr($$obj{Stream}, 0, $$obj{Size});
1470
+ }
1471
+ my $tag = $$obj{Name};
1472
+ my $tagInfo;
1473
+ unless ($$tagTablePtr{$tag}) {
1474
+ # remove instance number or class ID from tag if necessary
1475
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
1476
+ ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
1477
+ ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
1478
+ }
1479
+ # save the data for this tag
1480
+ $exifTool->HandleTag($tagTablePtr, $tag, $$obj{Stream},
1481
+ DataPt => \$$obj{Stream},
1482
+ TagInfo => $tagInfo,
1483
+ );
1484
+ delete $$obj{Stream}; # done with this stream
1485
+ }
1486
+ # hack for improperly stored FujiFilm PreviewImage (stored with no contents list)
1487
+ } elsif ($index == 512 and $dirLen > 60 and ($$exifTool{FujiPreview} or
1488
+ ($dirLen > 64 and substr($$dataPt, $dirStart+60, 4) eq "\xff\xd8\xff\xdb")))
1489
+ {
1490
+ # recombine PreviewImage, skipping unknown 60 byte header
1491
+ if ($$exifTool{FujiPreview}) {
1492
+ $$exifTool{FujiPreview} .= substr($$dataPt, $dirStart+60);
1493
+ } else {
1494
+ $$exifTool{FujiPreview} = substr($$dataPt, $dirStart+60);
1495
+ }
1496
+ } else {
1497
+ # (Kodak uses index 255 for a free segment in images from some cameras)
1498
+ $exifTool->Warn("Unlisted FPXR segment (index $index)") if $index != 255;
1499
+ }
1500
+
1501
+ } elsif ($type ne 3) { # not a "Reserved" segment
1502
+
1503
+ $exifTool->Warn("Unknown FPXR segment (type $type)");
1504
+
1505
+ }
1506
+
1507
+ # clean up if this was the last FPXR segment
1508
+ if ($$dirInfo{LastFPXR}) {
1509
+ if ($$exifTool{FPXR}) {
1510
+ my $obj;
1511
+ my $i = 0;
1512
+ foreach $obj (@{$$exifTool{FPXR}}) {
1513
+ $exifTool->Warn("Missing stream for FPXR object $i") if defined $$obj{Stream};
1514
+ ++$i;
1515
+ }
1516
+ delete $$exifTool{FPXR}; # delete our temporary variables
1517
+ }
1518
+ if ($$exifTool{FujiPreview}) {
1519
+ $exifTool->FoundTag('PreviewImage', $$exifTool{FujiPreview});
1520
+ delete $$exifTool{FujiPreview};
1521
+ }
1522
+ }
1523
+ return 1;
1524
+ }
1525
+
1526
+ #------------------------------------------------------------------------------
1527
+ # Set document number for objects
1528
+ # Inputs: 0) object hierarchy hash ref, 1) object index, 2) doc number list ref,
1529
+ # 3) doc numbers used at each level, 4) flag set for metadata levels
1530
+ sub SetDocNum($$;$$$)
1531
+ {
1532
+ my ($hier, $index, $doc, $used, $meta) = @_;
1533
+ my $obj = $$hier{$index} or return;
1534
+ return if exists $$obj{DocNum};
1535
+ $$obj{DocNum} = $doc;
1536
+ SetDocNum($hier, $$obj{Left}, $doc, $used, $meta) if $$obj{Left};
1537
+ SetDocNum($hier, $$obj{Right}, $doc, $used, $meta) if $$obj{Right};
1538
+ if (defined $$obj{Child}) {
1539
+ $used or $used = [ ];
1540
+ my @subDoc;
1541
+ push @subDoc, @$doc if $doc;
1542
+ # we must dive down 2 levels for each sub-document, so use the
1543
+ # $meta flag to add a sub-document level only for every 2nd generation
1544
+ if ($meta) {
1545
+ my $subNum = ($$used[scalar @subDoc] || 0);
1546
+ $$used[scalar @subDoc] = $subNum;
1547
+ push @subDoc, $subNum;
1548
+ } elsif (@subDoc) {
1549
+ $subDoc[-1] = ++$$used[$#subDoc];
1550
+ }
1551
+ SetDocNum($hier, $$obj{Child}, \@subDoc, $used, not $meta)
1552
+ }
1553
+ }
1554
+
1555
+ #------------------------------------------------------------------------------
1556
+ # Extract information from a FlashPix (FPX) file
1557
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref
1558
+ # Returns: 1 on success, 0 if this wasn't a valid FPX-format file
1559
+ sub ProcessFPX($$)
1560
+ {
1561
+ my ($exifTool, $dirInfo) = @_;
1562
+ my $raf = $$dirInfo{RAF};
1563
+ my ($buff, $out, %dumpParms, $oldIndent, $miniStreamBuff);
1564
+ my ($tag, %hier, %objIndex);
1565
+
1566
+ # read header
1567
+ return 0 unless $raf->Read($buff,HDR_SIZE) == HDR_SIZE;
1568
+ # check signature
1569
+ return 0 unless $buff =~ /^\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1/;
1570
+
1571
+ # set FileType initially based on file extension (we may override this later)
1572
+ my $fileType = $exifTool->{FILE_EXT};
1573
+ $fileType = 'FPX' unless $fileType and $fpxFileType{$fileType};
1574
+ $exifTool->SetFileType($fileType);
1575
+ SetByteOrder(substr($buff, 0x1c, 2) eq "\xff\xfe" ? 'MM' : 'II');
1576
+ my $tagTablePtr = GetTagTable('Image::ExifTool::FlashPix::Main');
1577
+ my $verbose = $exifTool->Options('Verbose');
1578
+ # copy LargeFileSupport option to RAF for use in LoadChain
1579
+ $$raf{LargeFileSupport} = $exifTool->Options('LargeFileSupport');
1580
+
1581
+ my $sectSize = 1 << Get16u(\$buff, 0x1e);
1582
+ my $miniSize = 1 << Get16u(\$buff, 0x20);
1583
+ my $fatCount = Get32u(\$buff, 0x2c); # number of FAT sectors
1584
+ my $dirStart = Get32u(\$buff, 0x30); # first directory sector
1585
+ my $miniCutoff = Get32u(\$buff, 0x38); # minimum size for big-FAT streams
1586
+ my $miniStart = Get32u(\$buff, 0x3c); # first sector of mini-FAT
1587
+ my $miniCount = Get32u(\$buff, 0x40); # number of mini-FAT sectors
1588
+ my $difStart = Get32u(\$buff, 0x44); # first sector of DIF chain
1589
+ my $difCount = Get32u(\$buff, 0x48); # number of DIF sectors
1590
+
1591
+ if ($verbose) {
1592
+ $out = $exifTool->Options('TextOut');
1593
+ $dumpParms{Out} = $out;
1594
+ $dumpParms{MaxLen} = 96 if $verbose == 3;
1595
+ print $out " Sector size=$sectSize\n FAT: Count=$fatCount\n";
1596
+ print $out " DIR: Start=$dirStart\n";
1597
+ print $out " MiniFAT: Mini-sector size=$miniSize Start=$miniStart Count=$miniCount Cutoff=$miniCutoff\n";
1598
+ print $out " DIF FAT: Start=$difStart Count=$difCount\n";
1599
+ }
1600
+ #
1601
+ # load the FAT
1602
+ #
1603
+ my $pos = 0x4c;
1604
+ my $endPos = length($buff);
1605
+ my $fat = '';
1606
+ my $fatCountCheck = 0;
1607
+ for (;;) {
1608
+ while ($pos <= $endPos - 4) {
1609
+ my $sect = Get32u(\$buff, $pos);
1610
+ $pos += 4;
1611
+ next if $sect == FREE_SECT;
1612
+ my $offset = $sect * $sectSize + HDR_SIZE;
1613
+ my $fatSect;
1614
+ unless ($raf->Seek($offset, 0) and
1615
+ $raf->Read($fatSect, $sectSize) == $sectSize)
1616
+ {
1617
+ $exifTool->Error("Error reading FAT from sector $sect");
1618
+ return 1;
1619
+ }
1620
+ $fat .= $fatSect;
1621
+ ++$fatCountCheck;
1622
+ }
1623
+ last if $difStart >= END_OF_CHAIN;
1624
+ # read next DIF (Dual Indirect FAT) sector
1625
+ my $offset = $difStart * $sectSize + HDR_SIZE;
1626
+ unless ($raf->Seek($offset, 0) and $raf->Read($buff, $sectSize) == $sectSize) {
1627
+ $exifTool->Error("Error reading DIF sector $difStart");
1628
+ return 1;
1629
+ }
1630
+ # set end of sector information in this DIF
1631
+ $pos = 0;
1632
+ $endPos = $sectSize - 4;
1633
+ # next time around we want to read next DIF in chain
1634
+ $difStart = Get32u(\$buff, $endPos);
1635
+ }
1636
+ if ($fatCountCheck != $fatCount) {
1637
+ $exifTool->Warn("Bad number of FAT sectors (expected $fatCount but found $fatCountCheck)");
1638
+ }
1639
+ #
1640
+ # load the mini-FAT and the directory
1641
+ #
1642
+ my $miniFat = LoadChain($raf, $miniStart, \$fat, $sectSize, HDR_SIZE);
1643
+ my $dir = LoadChain($raf, $dirStart, \$fat, $sectSize, HDR_SIZE);
1644
+ unless (defined $miniFat and defined $dir) {
1645
+ $exifTool->Error('Error reading mini-FAT or directory stream');
1646
+ return 1;
1647
+ }
1648
+ if ($verbose) {
1649
+ print $out " FAT [",length($fat)," bytes]:\n";
1650
+ Image::ExifTool::HexDump(\$fat, undef, %dumpParms) if $verbose > 2;
1651
+ print $out " Mini-FAT [",length($miniFat)," bytes]:\n";
1652
+ Image::ExifTool::HexDump(\$miniFat, undef, %dumpParms) if $verbose > 2;
1653
+ print $out " Directory [",length($dir)," bytes]:\n";
1654
+ Image::ExifTool::HexDump(\$dir, undef, %dumpParms) if $verbose > 2;
1655
+ }
1656
+ #
1657
+ # process the directory
1658
+ #
1659
+ if ($verbose) {
1660
+ $oldIndent = $exifTool->{INDENT};
1661
+ $exifTool->{INDENT} .= '| ';
1662
+ $exifTool->VerboseDir('FPX', undef, length $dir);
1663
+ }
1664
+ my $miniStream;
1665
+ $endPos = length($dir);
1666
+ my $index = 0;
1667
+
1668
+ for ($pos=0; $pos<=$endPos-128; $pos+=128, ++$index) {
1669
+
1670
+ # get directory entry type
1671
+ # (0=invalid, 1=storage, 2=stream, 3=lockbytes, 4=property, 5=root)
1672
+ my $type = Get8u(\$dir, $pos + 0x42);
1673
+ next if $type == 0; # skip invalid entries
1674
+ if ($type > 5) {
1675
+ $exifTool->Warn("Invalid directory entry type $type");
1676
+ last; # rest of directory is probably garbage
1677
+ }
1678
+ # get entry name (note: this is supposed to be length in 2-byte
1679
+ # characters but this isn't what is done in my sample FPX file, so
1680
+ # be very tolerant of this count -- it's null terminated anyway)
1681
+ my $len = Get16u(\$dir, $pos + 0x40);
1682
+ $len > 32 and $len = 32;
1683
+ $tag = Image::ExifTool::Decode(undef, substr($dir,$pos,$len*2), 'UCS2', 'II', 'Latin');
1684
+ $tag =~ s/\0.*//s; # truncate at null (in case length was wrong)
1685
+
1686
+ my $sect = Get32u(\$dir, $pos + 0x74); # start sector number
1687
+ my $size = Get32u(\$dir, $pos + 0x78); # stream length
1688
+
1689
+ # load Ministream (referenced from first directory entry)
1690
+ unless ($miniStream) {
1691
+ $miniStreamBuff = LoadChain($raf, $sect, \$fat, $sectSize, HDR_SIZE);
1692
+ unless (defined $miniStreamBuff) {
1693
+ $exifTool->Warn('Error loading Mini-FAT stream');
1694
+ last;
1695
+ }
1696
+ $miniStream = new File::RandomAccess(\$miniStreamBuff);
1697
+ }
1698
+
1699
+ my $tagInfo;
1700
+ if ($$tagTablePtr{$tag}) {
1701
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
1702
+ } else {
1703
+ # remove instance number or class ID from tag if necessary
1704
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $1) if
1705
+ ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
1706
+ ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
1707
+ }
1708
+
1709
+ my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling
1710
+ my $rSib = Get32u(\$dir, $pos + 0x48); # right sibling
1711
+ my $chld = Get32u(\$dir, $pos + 0x4c); # child directory
1712
+
1713
+ # save information about object hierachy
1714
+ my ($obj, $sub);
1715
+ $obj = $hier{$index} or $obj = $hier{$index} = { };
1716
+ $$obj{Left} = $lSib unless $lSib == FREE_SECT;
1717
+ $$obj{Right} = $rSib unless $rSib == FREE_SECT;
1718
+ unless ($chld == FREE_SECT) {
1719
+ $$obj{Child} = $chld;
1720
+ $sub = $hier{$chld} or $sub = $hier{$chld} = { };
1721
+ $$sub{Parent} = $index;
1722
+ }
1723
+
1724
+ next unless $tagInfo or $verbose;
1725
+
1726
+ # load the data for stream types
1727
+ my $extra = '';
1728
+ my $typeStr = $dirEntryType[$type] || $type;
1729
+ if ($typeStr eq 'STREAM') {
1730
+ if ($size >= $miniCutoff) {
1731
+ # stream is in the main FAT
1732
+ $buff = LoadChain($raf, $sect, \$fat, $sectSize, HDR_SIZE);
1733
+ } elsif ($size) {
1734
+ # stream is in the mini-FAT
1735
+ $buff = LoadChain($miniStream, $sect, \$miniFat, $miniSize, 0);
1736
+ } else {
1737
+ $buff = ''; # an empty stream
1738
+ }
1739
+ unless (defined $buff) {
1740
+ my $name = $tagInfo ? $$tagInfo{Name} : 'unknown';
1741
+ $exifTool->Warn("Error reading $name stream");
1742
+ $buff = '';
1743
+ }
1744
+ } elsif ($typeStr eq 'ROOT') {
1745
+ $buff = $miniStreamBuff;
1746
+ $extra .= ' (Ministream)';
1747
+ } else {
1748
+ $buff = '';
1749
+ undef $size;
1750
+ }
1751
+ if ($verbose) {
1752
+ my $flags = Get8u(\$dir, $pos + 0x43); # 0=red, 1=black
1753
+ my $col = { 0 => 'Red', 1 => 'Black' }->{$flags} || $flags;
1754
+ $extra .= " Type=$typeStr Flags=$col";
1755
+ $extra .= " Left=$lSib" unless $lSib == FREE_SECT;
1756
+ $extra .= " Right=$rSib" unless $rSib == FREE_SECT;
1757
+ $extra .= " Child=$chld" unless $chld == FREE_SECT;
1758
+ $exifTool->VerboseInfo($tag, $tagInfo,
1759
+ Index => $index,
1760
+ Value => $buff,
1761
+ DataPt => \$buff,
1762
+ Extra => $extra,
1763
+ Size => $size,
1764
+ );
1765
+ }
1766
+ if ($tagInfo and $buff) {
1767
+ my $num = $$exifTool{NUM_FOUND};
1768
+ my $subdir = $$tagInfo{SubDirectory};
1769
+ if ($subdir) {
1770
+ my %dirInfo = (
1771
+ DataPt => \$buff,
1772
+ DirStart => $$subdir{DirStart},
1773
+ DirLen => length $buff,
1774
+ Multi => $$tagInfo{Multi},
1775
+ );
1776
+ my $subTablePtr = GetTagTable($$subdir{TagTable});
1777
+ $exifTool->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
1778
+ } else {
1779
+ $exifTool->FoundTag($tagInfo, $buff);
1780
+ }
1781
+ # save object index number for all found tags
1782
+ my $num2 = $$exifTool{NUM_FOUND};
1783
+ $objIndex{++$num} = $index while $num < $num2;
1784
+ }
1785
+ }
1786
+ # set document numbers for tags extracted from embedded documents
1787
+ unless ($$exifTool{DOC_NUM}) {
1788
+ # initialize document number for all objects, beginning at root (index 0)
1789
+ SetDocNum(\%hier, 0);
1790
+ # set family 3 group name for all tags in embedded documents
1791
+ my $order = $$exifTool{FILE_ORDER};
1792
+ my (@pri, $copy, $member);
1793
+ foreach $tag (keys %$order) {
1794
+ my $num = $$order{$tag};
1795
+ next unless defined $num and $objIndex{$num};
1796
+ my $obj = $hier{$objIndex{$num}} or next;
1797
+ my $docNums = $$obj{DocNum};
1798
+ next unless $docNums and @$docNums;
1799
+ $$exifTool{TAG_EXTRA}{$tag}{G3} = join '-', @$docNums;
1800
+ push @pri, $tag unless $tag =~ / /; # save keys for priority sub-doc tags
1801
+ }
1802
+ # swap priority sub-document tags with main document tags if they exist
1803
+ foreach $tag (@pri) {
1804
+ for ($copy=1; ;++$copy) {
1805
+ my $key = "$tag ($copy)";
1806
+ last unless defined $$exifTool{VALUE}{$key};
1807
+ my $extra = $$exifTool{TAG_EXTRA}{$key};
1808
+ next if $extra and $$extra{G3}; # not Main if family 3 group is set
1809
+ foreach $member ('PRIORITY','VALUE','FILE_ORDER','TAG_INFO','TAG_EXTRA') {
1810
+ my $pHash = $$exifTool{$member};
1811
+ my $t = $$pHash{$tag};
1812
+ $$pHash{$tag} = $$pHash{$key};
1813
+ $$pHash{$key} = $t;
1814
+ }
1815
+ last;
1816
+ }
1817
+ }
1818
+ }
1819
+ $exifTool->{INDENT} = $oldIndent if $verbose;
1820
+ # try to better identify the file type
1821
+ if ($$exifTool{VALUE}{FileType} eq 'FPX') {
1822
+ my $val = $$exifTool{CompObjUserType} || $$exifTool{Software};
1823
+ if ($val) {
1824
+ my %type = ( Word => 'DOC', PowerPoint => 'PPT', Excel => 'XLS' );
1825
+ my $pat;
1826
+ foreach $pat (sort keys %type) {
1827
+ next unless $val =~ /$pat/;
1828
+ $exifTool->OverrideFileType($type{$pat});
1829
+ last;
1830
+ }
1831
+ }
1832
+ }
1833
+ return 1;
1834
+ }
1835
+
1836
+ 1; # end
1837
+
1838
+ __END__
1839
+
1840
+ =head1 NAME
1841
+
1842
+ Image::ExifTool::FlashPix - Read FlashPix meta information
1843
+
1844
+ =head1 SYNOPSIS
1845
+
1846
+ This module is used by Image::ExifTool
1847
+
1848
+ =head1 DESCRIPTION
1849
+
1850
+ This module contains routines required by Image::ExifTool to extract
1851
+ FlashPix meta information from FPX images, and from the APP2 FPXR segment of
1852
+ JPEG images.
1853
+
1854
+ =head1 AUTHOR
1855
+
1856
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
1857
+
1858
+ This library is free software; you can redistribute it and/or modify it
1859
+ under the same terms as Perl itself.
1860
+
1861
+ =head1 REFERENCES
1862
+
1863
+ =over 4
1864
+
1865
+ =item L<http://www.exif.org/Exif2-2.PDF>
1866
+
1867
+ =item L<http://www.graphcomp.com/info/specs/livepicture/fpx.pdf>
1868
+
1869
+ =item L<http://search.cpan.org/~jdb/libwin32/>
1870
+
1871
+ =item L<http://msdn.microsoft.com/en-us/library/aa380374.aspx>
1872
+
1873
+ =back
1874
+
1875
+ =head1 SEE ALSO
1876
+
1877
+ L<Image::ExifTool::TagNames/FlashPix Tags>,
1878
+ L<Image::ExifTool::TagNames/OOXML Tags>,
1879
+ L<Image::ExifTool(3pm)|Image::ExifTool>
1880
+
1881
+ =cut
1882
+