mini_exiftool_vendored 8.9.7.v2 → 9.2.7.v1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1023) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mini_exiftool_vendored.rb +1 -1
  3. data/lib/mini_exiftool_vendored/version.rb +2 -2
  4. data/mini_exiftool_vendored.gemspec +1 -1
  5. data/vendor/Image-ExifTool-9.27/Changes +6162 -0
  6. data/vendor/Image-ExifTool-9.27/MANIFEST +858 -0
  7. data/vendor/Image-ExifTool-9.27/META.yml +26 -0
  8. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/Makefile.PL +0 -0
  9. data/vendor/Image-ExifTool-9.27/README +227 -0
  10. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/exif2iptc.args +0 -0
  11. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/exif2xmp.args +0 -0
  12. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/gps2xmp.args +0 -0
  13. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/iptc2exif.args +0 -0
  14. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/iptc2xmp.args +0 -0
  15. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/iptcCore.args +0 -0
  16. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/pdf2xmp.args +0 -0
  17. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/xmp2exif.args +0 -0
  18. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/xmp2gps.args +0 -0
  19. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/xmp2iptc.args +0 -0
  20. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/arg_files}/xmp2pdf.args +0 -0
  21. data/vendor/Image-ExifTool-9.27/config_files/ExifTool_config +299 -0
  22. data/vendor/Image-ExifTool-9.27/config_files/convert_regions.config +81 -0
  23. data/vendor/Image-ExifTool-9.27/exiftool +5655 -0
  24. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/fmt_files}/gpx.fmt +0 -0
  25. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27/fmt_files}/gpx_wpt.fmt +0 -0
  26. data/vendor/Image-ExifTool-9.27/fmt_files/kml.fmt +53 -0
  27. data/vendor/Image-ExifTool-9.27/html/ExifTool.html +1951 -0
  28. data/vendor/Image-ExifTool-9.27/html/MIE1.1-20070121.pdf +0 -0
  29. data/vendor/Image-ExifTool-9.27/html/Shift.html +173 -0
  30. data/vendor/Image-ExifTool-9.27/html/TagNames/AFCP.html +49 -0
  31. data/vendor/Image-ExifTool-9.27/html/TagNames/AIFF.html +146 -0
  32. data/vendor/Image-ExifTool-9.27/html/TagNames/APE.html +149 -0
  33. data/vendor/Image-ExifTool-9.27/html/TagNames/APP12.html +188 -0
  34. data/vendor/Image-ExifTool-9.27/html/TagNames/ASF.html +1075 -0
  35. data/vendor/Image-ExifTool-9.27/html/TagNames/BMP.html +110 -0
  36. data/vendor/Image-ExifTool-9.27/html/TagNames/Canon.html +8021 -0
  37. data/vendor/Image-ExifTool-9.27/html/TagNames/CanonCustom.html +2044 -0
  38. data/vendor/Image-ExifTool-9.27/html/TagNames/CanonRaw.html +561 -0
  39. data/vendor/Image-ExifTool-9.27/html/TagNames/CanonVRD.html +1222 -0
  40. data/vendor/Image-ExifTool-9.27/html/TagNames/Casio.html +1569 -0
  41. data/vendor/Image-ExifTool-9.27/html/TagNames/Composite.html +659 -0
  42. data/vendor/Image-ExifTool-9.27/html/TagNames/DICOM.html +15762 -0
  43. data/vendor/Image-ExifTool-9.27/html/TagNames/DNG.html +273 -0
  44. data/vendor/Image-ExifTool-9.27/html/TagNames/DV.html +75 -0
  45. data/vendor/Image-ExifTool-9.27/html/TagNames/DarwinCore.html +1445 -0
  46. data/vendor/Image-ExifTool-9.27/html/TagNames/DjVu.html +312 -0
  47. data/vendor/Image-ExifTool-9.27/html/TagNames/EXE.html +697 -0
  48. data/vendor/Image-ExifTool-9.27/html/TagNames/EXIF.html +3244 -0
  49. data/vendor/Image-ExifTool-9.27/html/TagNames/Extra.html +300 -0
  50. data/vendor/Image-ExifTool-9.27/html/TagNames/FLAC.html +183 -0
  51. data/vendor/Image-ExifTool-9.27/html/TagNames/FLIR.html +615 -0
  52. data/vendor/Image-ExifTool-9.27/html/TagNames/Flash.html +419 -0
  53. data/vendor/Image-ExifTool-9.27/html/TagNames/FlashPix.html +1435 -0
  54. data/vendor/Image-ExifTool-9.27/html/TagNames/Font.html +485 -0
  55. data/vendor/Image-ExifTool-9.27/html/TagNames/FotoStation.html +103 -0
  56. data/vendor/Image-ExifTool-9.27/html/TagNames/FujiFilm.html +636 -0
  57. data/vendor/Image-ExifTool-9.27/html/TagNames/GE.html +40 -0
  58. data/vendor/Image-ExifTool-9.27/html/TagNames/GIF.html +116 -0
  59. data/vendor/Image-ExifTool-9.27/html/TagNames/GIMP.html +140 -0
  60. data/vendor/Image-ExifTool-9.27/html/TagNames/GPS.html +221 -0
  61. data/vendor/Image-ExifTool-9.27/html/TagNames/GeoTiff.html +2177 -0
  62. data/vendor/Image-ExifTool-9.27/html/TagNames/H264.html +387 -0
  63. data/vendor/Image-ExifTool-9.27/html/TagNames/HP.html +155 -0
  64. data/vendor/Image-ExifTool-9.27/html/TagNames/HTML.html +666 -0
  65. data/vendor/Image-ExifTool-9.27/html/TagNames/ICC_Profile.html +710 -0
  66. data/vendor/Image-ExifTool-9.27/html/TagNames/ID3.html +1429 -0
  67. data/vendor/Image-ExifTool-9.27/html/TagNames/IPTC.html +895 -0
  68. data/vendor/Image-ExifTool-9.27/html/TagNames/ITC.html +90 -0
  69. data/vendor/Image-ExifTool-9.27/html/TagNames/JFIF.html +61 -0
  70. data/vendor/Image-ExifTool-9.27/html/TagNames/JPEG.html +523 -0
  71. data/vendor/Image-ExifTool-9.27/html/TagNames/JVC.html +56 -0
  72. data/vendor/Image-ExifTool-9.27/html/TagNames/Jpeg2000.html +464 -0
  73. data/vendor/Image-ExifTool-9.27/html/TagNames/Kodak.html +1759 -0
  74. data/vendor/Image-ExifTool-9.27/html/TagNames/KyoceraRaw.html +92 -0
  75. data/vendor/Image-ExifTool-9.27/html/TagNames/LNK.html +478 -0
  76. data/vendor/Image-ExifTool-9.27/html/TagNames/Leaf.html +870 -0
  77. data/vendor/Image-ExifTool-9.27/html/TagNames/M2TS.html +133 -0
  78. data/vendor/Image-ExifTool-9.27/html/TagNames/MIE.html +1026 -0
  79. data/vendor/Image-ExifTool-9.27/html/TagNames/MIFF.html +196 -0
  80. data/vendor/Image-ExifTool-9.27/html/TagNames/MNG.html +847 -0
  81. data/vendor/Image-ExifTool-9.27/html/TagNames/MPC.html +97 -0
  82. data/vendor/Image-ExifTool-9.27/html/TagNames/MPEG.html +249 -0
  83. data/vendor/Image-ExifTool-9.27/html/TagNames/MPF.html +199 -0
  84. data/vendor/Image-ExifTool-9.27/html/TagNames/MWG.html +519 -0
  85. data/vendor/Image-ExifTool-9.27/html/TagNames/MXF.html +6673 -0
  86. data/vendor/Image-ExifTool-9.27/html/TagNames/Matroska.html +1069 -0
  87. data/vendor/Image-ExifTool-9.27/html/TagNames/Microsoft.html +2066 -0
  88. data/vendor/Image-ExifTool-9.27/html/TagNames/Minolta.html +2550 -0
  89. data/vendor/Image-ExifTool-9.27/html/TagNames/MinoltaRaw.html +326 -0
  90. data/vendor/Image-ExifTool-9.27/html/TagNames/Nikon.html +4453 -0
  91. data/vendor/Image-ExifTool-9.27/html/TagNames/NikonCapture.html +776 -0
  92. data/vendor/Image-ExifTool-9.27/html/TagNames/NikonCustom.html +3835 -0
  93. data/vendor/Image-ExifTool-9.27/html/TagNames/OOXML.html +280 -0
  94. data/vendor/Image-ExifTool-9.27/html/TagNames/Ogg.html +44 -0
  95. data/vendor/Image-ExifTool-9.27/html/TagNames/Olympus.html +3331 -0
  96. data/vendor/Image-ExifTool-9.27/html/TagNames/OpenEXR.html +222 -0
  97. data/vendor/Image-ExifTool-9.27/html/TagNames/PDF.html +745 -0
  98. data/vendor/Image-ExifTool-9.27/html/TagNames/PGF.html +80 -0
  99. data/vendor/Image-ExifTool-9.27/html/TagNames/PICT.html +753 -0
  100. data/vendor/Image-ExifTool-9.27/html/TagNames/PLIST.html +86 -0
  101. data/vendor/Image-ExifTool-9.27/html/TagNames/PNG.html +515 -0
  102. data/vendor/Image-ExifTool-9.27/html/TagNames/PSP.html +160 -0
  103. data/vendor/Image-ExifTool-9.27/html/TagNames/Panasonic.html +1359 -0
  104. data/vendor/Image-ExifTool-9.27/html/TagNames/PanasonicRaw.html +214 -0
  105. data/vendor/Image-ExifTool-9.27/html/TagNames/Pentax.html +4329 -0
  106. data/vendor/Image-ExifTool-9.27/html/TagNames/PhaseOne.html +258 -0
  107. data/vendor/Image-ExifTool-9.27/html/TagNames/PhotoCD.html +402 -0
  108. data/vendor/Image-ExifTool-9.27/html/TagNames/PhotoMechanic.html +196 -0
  109. data/vendor/Image-ExifTool-9.27/html/TagNames/Photoshop.html +460 -0
  110. data/vendor/Image-ExifTool-9.27/html/TagNames/PostScript.html +125 -0
  111. data/vendor/Image-ExifTool-9.27/html/TagNames/PrintIM.html +31 -0
  112. data/vendor/Image-ExifTool-9.27/html/TagNames/Qualcomm.html +4778 -0
  113. data/vendor/Image-ExifTool-9.27/html/TagNames/QuickTime.html +2967 -0
  114. data/vendor/Image-ExifTool-9.27/html/TagNames/RIFF.html +1164 -0
  115. data/vendor/Image-ExifTool-9.27/html/TagNames/RSRC.html +74 -0
  116. data/vendor/Image-ExifTool-9.27/html/TagNames/RTF.html +150 -0
  117. data/vendor/Image-ExifTool-9.27/html/TagNames/Radiance.html +87 -0
  118. data/vendor/Image-ExifTool-9.27/html/TagNames/Rawzor.html +45 -0
  119. data/vendor/Image-ExifTool-9.27/html/TagNames/Real.html +780 -0
  120. data/vendor/Image-ExifTool-9.27/html/TagNames/Reconyx.html +132 -0
  121. data/vendor/Image-ExifTool-9.27/html/TagNames/Ricoh.html +456 -0
  122. data/vendor/Image-ExifTool-9.27/html/TagNames/Samsung.html +377 -0
  123. data/vendor/Image-ExifTool-9.27/html/TagNames/Sanyo.html +366 -0
  124. data/vendor/Image-ExifTool-9.27/html/TagNames/Shortcuts.html +237 -0
  125. data/vendor/Image-ExifTool-9.27/html/TagNames/Sigma.html +372 -0
  126. data/vendor/Image-ExifTool-9.27/html/TagNames/SigmaRaw.html +403 -0
  127. data/vendor/Image-ExifTool-9.27/html/TagNames/Sony.html +4052 -0
  128. data/vendor/Image-ExifTool-9.27/html/TagNames/SonyIDC.html +267 -0
  129. data/vendor/Image-ExifTool-9.27/html/TagNames/Stim.html +200 -0
  130. data/vendor/Image-ExifTool-9.27/html/TagNames/Theora.html +102 -0
  131. data/vendor/Image-ExifTool-9.27/html/TagNames/Unknown.html +31 -0
  132. data/vendor/Image-ExifTool-9.27/html/TagNames/Vorbis.html +228 -0
  133. data/vendor/Image-ExifTool-9.27/html/TagNames/XMP.html +7188 -0
  134. data/vendor/Image-ExifTool-9.27/html/TagNames/ZIP.html +204 -0
  135. data/vendor/Image-ExifTool-9.27/html/TagNames/iWork.html +49 -0
  136. data/vendor/Image-ExifTool-9.27/html/TagNames/index.html +192 -0
  137. data/vendor/Image-ExifTool-9.27/html/TagNames/style.css +31 -0
  138. data/vendor/Image-ExifTool-9.27/html/ancient_history.html +6564 -0
  139. data/vendor/Image-ExifTool-9.27/html/canon_raw.html +366 -0
  140. data/vendor/Image-ExifTool-9.27/html/commentary.html +319 -0
  141. data/vendor/Image-ExifTool-9.27/html/config.html +312 -0
  142. data/vendor/Image-ExifTool-9.27/html/data_members.html +264 -0
  143. data/vendor/Image-ExifTool-9.27/html/exiftool_pod.html +2325 -0
  144. data/vendor/Image-ExifTool-9.27/html/faq.html +1427 -0
  145. data/vendor/Image-ExifTool-9.27/html/filename.html +281 -0
  146. data/vendor/Image-ExifTool-9.27/html/geotag.html +642 -0
  147. data/vendor/Image-ExifTool-9.27/html/history.html +433 -0
  148. data/vendor/Image-ExifTool-9.27/html/htmldump.html +732 -0
  149. data/vendor/Image-ExifTool-9.27/html/idiosyncracies.html +251 -0
  150. data/vendor/Image-ExifTool-9.27/html/index.html +1266 -0
  151. data/vendor/Image-ExifTool-9.27/html/install.html +239 -0
  152. data/vendor/Image-ExifTool-9.27/html/metafiles.html +266 -0
  153. data/vendor/Image-ExifTool-9.27/html/overview.png +0 -0
  154. data/vendor/Image-ExifTool-9.27/html/standards.html +277 -0
  155. data/vendor/Image-ExifTool-9.27/html/struct.html +342 -0
  156. data/vendor/Image-ExifTool-9.27/html/style.css +31 -0
  157. data/vendor/Image-ExifTool-9.27/html/under.html +120 -0
  158. data/vendor/Image-ExifTool-9.27/html/verbose.html +195 -0
  159. data/vendor/Image-ExifTool-9.27/html/writing.html +239 -0
  160. data/vendor/Image-ExifTool-9.27/lib/File/RandomAccess.pm +378 -0
  161. data/vendor/Image-ExifTool-9.27/lib/File/RandomAccess.pod +231 -0
  162. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool.pm +6811 -0
  163. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool.pod +2353 -0
  164. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/AES.pm +501 -0
  165. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/AFCP.pm +280 -0
  166. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/AIFF.pm +271 -0
  167. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/APE.pm +262 -0
  168. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/APP12.pm +322 -0
  169. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/ASF.pm +871 -0
  170. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/BMP.pm +179 -0
  171. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/BZZ.pm +472 -0
  172. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/BigTIFF.pm +282 -0
  173. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/BuildTagLookup.pm +2391 -0
  174. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Canon.pm +7736 -0
  175. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  176. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/CanonRaw.pm +931 -0
  177. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  178. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/CaptureOne.pm +235 -0
  179. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Casio.pm +2013 -0
  180. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Charset.pm +396 -0
  181. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
  182. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
  183. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
  184. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
  185. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
  186. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
  187. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
  188. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
  189. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
  190. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
  191. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
  192. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
  193. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
  194. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
  195. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
  196. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
  197. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
  198. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
  199. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
  200. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
  201. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
  202. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
  203. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
  204. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
  205. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
  206. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
  207. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
  208. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
  209. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
  210. data/vendor/{Image-ExifTool-8.97 → Image-ExifTool-9.27}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
  211. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/DICOM.pm +3835 -0
  212. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/DNG.pm +835 -0
  213. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/DV.pm +319 -0
  214. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/DarwinCore.pm +317 -0
  215. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/DjVu.pm +373 -0
  216. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/EXE.pm +1228 -0
  217. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Exif.pm +4526 -0
  218. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/FLAC.pm +296 -0
  219. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/FLIR.pm +672 -0
  220. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Fixup.pm +354 -0
  221. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Flash.pm +755 -0
  222. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/FlashPix.pm +1882 -0
  223. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Font.pm +643 -0
  224. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/FotoStation.pm +258 -0
  225. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/FujiFilm.pm +1019 -0
  226. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/GE.pm +80 -0
  227. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/GIF.pm +542 -0
  228. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/GIMP.pm +258 -0
  229. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/GPS.pm +511 -0
  230. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  231. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Geotag.pm +1173 -0
  232. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/H264.pm +1097 -0
  233. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/HP.pm +262 -0
  234. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/HTML.pm +576 -0
  235. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/HtmlDump.pm +895 -0
  236. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  237. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/ID3.pm +1486 -0
  238. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/IPTC.pm +1244 -0
  239. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/ITC.pm +215 -0
  240. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Import.pm +308 -0
  241. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/InDesign.pm +277 -0
  242. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/JPEG.pm +588 -0
  243. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  244. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/JVC.pm +130 -0
  245. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  246. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Kodak.pm +2014 -0
  247. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  248. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/LNK.pm +723 -0
  249. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  250. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/de.pm +7356 -0
  251. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  252. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  253. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/es.pm +4016 -0
  254. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  255. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  256. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/it.pm +7917 -0
  257. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  258. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  259. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  260. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  261. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/ru.pm +769 -0
  262. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/sv.pm +639 -0
  263. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/tr.pm +544 -0
  264. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  265. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  266. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Leaf.pm +515 -0
  267. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/M2TS.pm +729 -0
  268. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MIE.pm +2561 -0
  269. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MIEUnits.pod +377 -0
  270. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MIFF.pm +279 -0
  271. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MNG.pm +684 -0
  272. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MPC.pm +156 -0
  273. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MPEG.pm +736 -0
  274. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MPF.pm +289 -0
  275. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MWG.pm +736 -0
  276. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MXF.pm +3032 -0
  277. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MakerNotes.pm +1569 -0
  278. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Matroska.pm +891 -0
  279. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Microsoft.pm +879 -0
  280. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Minolta.pm +2823 -0
  281. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  282. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Nikon.pm +6105 -0
  283. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/NikonCapture.pm +911 -0
  284. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  285. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/OOXML.pm +409 -0
  286. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Ogg.pm +237 -0
  287. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Olympus.pm +3540 -0
  288. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/OpenEXR.pm +324 -0
  289. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PDF.pm +2327 -0
  290. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PGF.pm +143 -0
  291. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PICT.pm +1260 -0
  292. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PLIST.pm +449 -0
  293. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PNG.pm +1100 -0
  294. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PPM.pm +169 -0
  295. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PSP.pm +305 -0
  296. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Panasonic.pm +1921 -0
  297. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  298. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Pentax.pm +5486 -0
  299. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PhaseOne.pm +557 -0
  300. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PhotoCD.pm +507 -0
  301. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  302. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Photoshop.pm +597 -0
  303. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PostScript.pm +693 -0
  304. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/PrintIM.pm +125 -0
  305. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  306. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/QuickTime.pm +3316 -0
  307. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/README +943 -0
  308. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/RIFF.pm +1322 -0
  309. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/RSRC.pm +241 -0
  310. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/RTF.pm +383 -0
  311. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Radiance.pm +144 -0
  312. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Rawzor.pm +190 -0
  313. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Real.pm +736 -0
  314. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Reconyx.pm +190 -0
  315. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Ricoh.pm +740 -0
  316. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Samsung.pm +769 -0
  317. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Sanyo.pm +439 -0
  318. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Shift.pl +594 -0
  319. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Shortcuts.pm +291 -0
  320. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Sigma.pm +574 -0
  321. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  322. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Sony.pm +5388 -0
  323. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/SonyIDC.pm +330 -0
  324. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Stim.pm +196 -0
  325. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  326. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/TagLookup.pm +7911 -0
  327. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/TagNames.pod +25645 -0
  328. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Theora.pm +145 -0
  329. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Unknown.pm +66 -0
  330. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Vorbis.pm +237 -0
  331. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  332. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WriteExif.pl +3674 -0
  333. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  334. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WritePDF.pl +759 -0
  335. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WritePNG.pl +330 -0
  336. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  337. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WritePostScript.pl +777 -0
  338. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  339. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/Writer.pl +5755 -0
  340. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/XMP.pm +3535 -0
  341. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/XMP2.pl +1298 -0
  342. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/XMPStruct.pl +813 -0
  343. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/ZIP.pm +623 -0
  344. data/vendor/Image-ExifTool-9.27/lib/Image/ExifTool/iWork.pm +223 -0
  345. data/vendor/Image-ExifTool-9.27/perl-Image-ExifTool.spec +104 -0
  346. data/vendor/Image-ExifTool-9.27/t/AFCP.t +44 -0
  347. data/vendor/Image-ExifTool-9.27/t/AFCP_2.out +37 -0
  348. data/vendor/Image-ExifTool-9.27/t/AFCP_3.out +20 -0
  349. data/vendor/Image-ExifTool-9.27/t/AIFF.t +28 -0
  350. data/vendor/Image-ExifTool-9.27/t/AIFF_2.out +31 -0
  351. data/vendor/Image-ExifTool-9.27/t/APE.t +38 -0
  352. data/vendor/Image-ExifTool-9.27/t/APE_2.out +28 -0
  353. data/vendor/Image-ExifTool-9.27/t/APE_3.out +57 -0
  354. data/vendor/Image-ExifTool-9.27/t/ASF.t +28 -0
  355. data/vendor/Image-ExifTool-9.27/t/ASF_2.out +48 -0
  356. data/vendor/Image-ExifTool-9.27/t/BMP.t +28 -0
  357. data/vendor/Image-ExifTool-9.27/t/BMP_2.out +21 -0
  358. data/vendor/Image-ExifTool-9.27/t/BigTIFF.t +28 -0
  359. data/vendor/Image-ExifTool-9.27/t/BigTIFF_2.out +19 -0
  360. data/vendor/Image-ExifTool-9.27/t/Canon.t +41 -0
  361. data/vendor/Image-ExifTool-9.27/t/CanonRaw.t +126 -0
  362. data/vendor/Image-ExifTool-9.27/t/CanonRaw_2.out +165 -0
  363. data/vendor/Image-ExifTool-9.27/t/CanonRaw_4.out +214 -0
  364. data/vendor/Image-ExifTool-9.27/t/CanonRaw_5.out +207 -0
  365. data/vendor/Image-ExifTool-9.27/t/CanonRaw_6.out +231 -0
  366. data/vendor/Image-ExifTool-9.27/t/CanonRaw_7.out +246 -0
  367. data/vendor/Image-ExifTool-9.27/t/CanonVRD.t +129 -0
  368. data/vendor/Image-ExifTool-9.27/t/CanonVRD_11.out +118 -0
  369. data/vendor/Image-ExifTool-9.27/t/CanonVRD_12.out +12 -0
  370. data/vendor/Image-ExifTool-9.27/t/CanonVRD_2.out +116 -0
  371. data/vendor/Image-ExifTool-9.27/t/CanonVRD_3.out +116 -0
  372. data/vendor/Image-ExifTool-9.27/t/CanonVRD_4.out +2 -0
  373. data/vendor/Image-ExifTool-9.27/t/CanonVRD_5.out +3 -0
  374. data/vendor/Image-ExifTool-9.27/t/CanonVRD_6.out +3 -0
  375. data/vendor/Image-ExifTool-9.27/t/CanonVRD_7.out +2 -0
  376. data/vendor/Image-ExifTool-9.27/t/CanonVRD_8.out +2 -0
  377. data/vendor/Image-ExifTool-9.27/t/CanonVRD_9.out +1 -0
  378. data/vendor/Image-ExifTool-9.27/t/Canon_2.out +350 -0
  379. data/vendor/Image-ExifTool-9.27/t/Canon_3.out +3 -0
  380. data/vendor/Image-ExifTool-9.27/t/Casio.t +54 -0
  381. data/vendor/Image-ExifTool-9.27/t/Casio_2.out +70 -0
  382. data/vendor/Image-ExifTool-9.27/t/Casio_3.out +100 -0
  383. data/vendor/Image-ExifTool-9.27/t/Casio_4.out +26 -0
  384. data/vendor/Image-ExifTool-9.27/t/Casio_5.out +78 -0
  385. data/vendor/Image-ExifTool-9.27/t/Casio_6.out +115 -0
  386. data/vendor/Image-ExifTool-9.27/t/DICOM.t +28 -0
  387. data/vendor/Image-ExifTool-9.27/t/DICOM_2.out +108 -0
  388. data/vendor/Image-ExifTool-9.27/t/DNG.t +39 -0
  389. data/vendor/Image-ExifTool-9.27/t/DNG_2.out +326 -0
  390. data/vendor/Image-ExifTool-9.27/t/DNG_3.out +4 -0
  391. data/vendor/Image-ExifTool-9.27/t/DV.t +27 -0
  392. data/vendor/Image-ExifTool-9.27/t/DV_2.out +24 -0
  393. data/vendor/Image-ExifTool-9.27/t/DjVu.t +28 -0
  394. data/vendor/Image-ExifTool-9.27/t/DjVu_2.out +44 -0
  395. data/vendor/Image-ExifTool-9.27/t/EXE.t +31 -0
  396. data/vendor/Image-ExifTool-9.27/t/EXE_2.out +40 -0
  397. data/vendor/Image-ExifTool-9.27/t/EXE_3.out +15 -0
  398. data/vendor/Image-ExifTool-9.27/t/EXE_4.out +14 -0
  399. data/vendor/Image-ExifTool-9.27/t/ExifTool.t +284 -0
  400. data/vendor/Image-ExifTool-9.27/t/ExifTool_16.out +180 -0
  401. data/vendor/Image-ExifTool-9.27/t/ExifTool_17.out +594 -0
  402. data/vendor/Image-ExifTool-9.27/t/ExifTool_2.out +399 -0
  403. data/vendor/Image-ExifTool-9.27/t/ExifTool_20.out +1 -0
  404. data/vendor/Image-ExifTool-9.27/t/ExifTool_21.out +1 -0
  405. data/vendor/Image-ExifTool-9.27/t/ExifTool_22.out +1 -0
  406. data/vendor/Image-ExifTool-9.27/t/ExifTool_23.out +6 -0
  407. data/vendor/Image-ExifTool-9.27/t/ExifTool_24.out +3 -0
  408. data/vendor/Image-ExifTool-9.27/t/ExifTool_25.out +13 -0
  409. data/vendor/Image-ExifTool-9.27/t/ExifTool_26.out +12 -0
  410. data/vendor/Image-ExifTool-9.27/t/ExifTool_3.out +87 -0
  411. data/vendor/Image-ExifTool-9.27/t/ExifTool_4.out +41 -0
  412. data/vendor/Image-ExifTool-9.27/t/ExifTool_5.out +6 -0
  413. data/vendor/Image-ExifTool-9.27/t/ExifTool_6.out +68 -0
  414. data/vendor/Image-ExifTool-9.27/t/ExifTool_7.out +125 -0
  415. data/vendor/Image-ExifTool-9.27/t/ExifTool_8.out +125 -0
  416. data/vendor/Image-ExifTool-9.27/t/ExifTool_9.out +33 -0
  417. data/vendor/Image-ExifTool-9.27/t/FLAC.t +37 -0
  418. data/vendor/Image-ExifTool-9.27/t/FLAC_2.out +25 -0
  419. data/vendor/Image-ExifTool-9.27/t/FLAC_3.out +19 -0
  420. data/vendor/Image-ExifTool-9.27/t/FLIR.t +30 -0
  421. data/vendor/Image-ExifTool-9.27/t/FLIR_2.out +93 -0
  422. data/vendor/Image-ExifTool-9.27/t/FLIR_3.out +47 -0
  423. data/vendor/Image-ExifTool-9.27/t/Flash.t +37 -0
  424. data/vendor/Image-ExifTool-9.27/t/FlashPix.t +30 -0
  425. data/vendor/Image-ExifTool-9.27/t/FlashPix_2.out +48 -0
  426. data/vendor/Image-ExifTool-9.27/t/Flash_2.out +20 -0
  427. data/vendor/Image-ExifTool-9.27/t/Flash_3.out +53 -0
  428. data/vendor/Image-ExifTool-9.27/t/Font.t +30 -0
  429. data/vendor/Image-ExifTool-9.27/t/Font_2.out +23 -0
  430. data/vendor/Image-ExifTool-9.27/t/Font_3.out +35 -0
  431. data/vendor/Image-ExifTool-9.27/t/Font_4.out +26 -0
  432. data/vendor/Image-ExifTool-9.27/t/Font_5.out +26 -0
  433. data/vendor/Image-ExifTool-9.27/t/Font_6.out +36 -0
  434. data/vendor/Image-ExifTool-9.27/t/Font_7.out +36 -0
  435. data/vendor/Image-ExifTool-9.27/t/FotoStation.t +38 -0
  436. data/vendor/Image-ExifTool-9.27/t/FotoStation_2.out +39 -0
  437. data/vendor/Image-ExifTool-9.27/t/FotoStation_3.out +3 -0
  438. data/vendor/Image-ExifTool-9.27/t/FujiFilm.t +78 -0
  439. data/vendor/Image-ExifTool-9.27/t/FujiFilm_2.out +87 -0
  440. data/vendor/Image-ExifTool-9.27/t/FujiFilm_3.out +88 -0
  441. data/vendor/Image-ExifTool-9.27/t/FujiFilm_4.out +117 -0
  442. data/vendor/Image-ExifTool-9.27/t/FujiFilm_5.out +1 -0
  443. data/vendor/Image-ExifTool-9.27/t/GE.t +46 -0
  444. data/vendor/Image-ExifTool-9.27/t/GE_2.out +84 -0
  445. data/vendor/Image-ExifTool-9.27/t/GE_3.out +84 -0
  446. data/vendor/Image-ExifTool-9.27/t/GIF.t +83 -0
  447. data/vendor/Image-ExifTool-9.27/t/GIF_2.out +40 -0
  448. data/vendor/Image-ExifTool-9.27/t/GIF_3.out +41 -0
  449. data/vendor/Image-ExifTool-9.27/t/GIF_4.out +16 -0
  450. data/vendor/Image-ExifTool-9.27/t/GIMP.t +27 -0
  451. data/vendor/Image-ExifTool-9.27/t/GIMP_2.out +63 -0
  452. data/vendor/Image-ExifTool-9.27/t/GPS.t +42 -0
  453. data/vendor/Image-ExifTool-9.27/t/GPS_2.out +94 -0
  454. data/vendor/Image-ExifTool-9.27/t/GPS_3.out +96 -0
  455. data/vendor/Image-ExifTool-9.27/t/GeoTiff.t +36 -0
  456. data/vendor/Image-ExifTool-9.27/t/GeoTiff_2.out +36 -0
  457. data/vendor/Image-ExifTool-9.27/t/GeoTiff_3.out +36 -0
  458. data/vendor/Image-ExifTool-9.27/t/Geotag.t +164 -0
  459. data/vendor/Image-ExifTool-9.27/t/Geotag_2.out +9 -0
  460. data/vendor/Image-ExifTool-9.27/t/Geotag_3.out +6 -0
  461. data/vendor/Image-ExifTool-9.27/t/Geotag_5.out +1 -0
  462. data/vendor/Image-ExifTool-9.27/t/Geotag_6.out +9 -0
  463. data/vendor/Image-ExifTool-9.27/t/Geotag_7.out +53 -0
  464. data/vendor/Image-ExifTool-9.27/t/Geotag_8.out +15 -0
  465. data/vendor/Image-ExifTool-9.27/t/HTML.t +28 -0
  466. data/vendor/Image-ExifTool-9.27/t/HTML_2.out +68 -0
  467. data/vendor/Image-ExifTool-9.27/t/IPTC.t +157 -0
  468. data/vendor/Image-ExifTool-9.27/t/IPTC_2.out +58 -0
  469. data/vendor/Image-ExifTool-9.27/t/IPTC_4.out +56 -0
  470. data/vendor/Image-ExifTool-9.27/t/IPTC_5.out +1 -0
  471. data/vendor/Image-ExifTool-9.27/t/IPTC_6.out +2 -0
  472. data/vendor/Image-ExifTool-9.27/t/IPTC_7.out +1 -0
  473. data/vendor/Image-ExifTool-9.27/t/IPTC_8.out +20 -0
  474. data/vendor/Image-ExifTool-9.27/t/ITC.t +28 -0
  475. data/vendor/Image-ExifTool-9.27/t/ITC_2.out +19 -0
  476. data/vendor/Image-ExifTool-9.27/t/InDesign.t +61 -0
  477. data/vendor/Image-ExifTool-9.27/t/InDesign_2.out +19 -0
  478. data/vendor/Image-ExifTool-9.27/t/InDesign_3.out +21 -0
  479. data/vendor/Image-ExifTool-9.27/t/InDesign_4.out +11 -0
  480. data/vendor/Image-ExifTool-9.27/t/JVC.t +36 -0
  481. data/vendor/Image-ExifTool-9.27/t/JVC_2.out +3 -0
  482. data/vendor/Image-ExifTool-9.27/t/JVC_3.out +3 -0
  483. data/vendor/Image-ExifTool-9.27/t/Jpeg2000.t +49 -0
  484. data/vendor/Image-ExifTool-9.27/t/Jpeg2000_2.out +63 -0
  485. data/vendor/Image-ExifTool-9.27/t/Jpeg2000_3.out +51 -0
  486. data/vendor/Image-ExifTool-9.27/t/Jpeg2000_4.out +15 -0
  487. data/vendor/Image-ExifTool-9.27/t/Kodak.t +40 -0
  488. data/vendor/Image-ExifTool-9.27/t/Kodak_2.out +109 -0
  489. data/vendor/Image-ExifTool-9.27/t/Kodak_3.out +119 -0
  490. data/vendor/Image-ExifTool-9.27/t/KyoceraRaw.t +28 -0
  491. data/vendor/Image-ExifTool-9.27/t/KyoceraRaw_2.out +27 -0
  492. data/vendor/Image-ExifTool-9.27/t/LNK.t +28 -0
  493. data/vendor/Image-ExifTool-9.27/t/LNK_2.out +45 -0
  494. data/vendor/Image-ExifTool-9.27/t/Lang.t +40 -0
  495. data/vendor/Image-ExifTool-9.27/t/Lang_1.out +1 -0
  496. data/vendor/Image-ExifTool-9.27/t/Lang_10.out +46 -0
  497. data/vendor/Image-ExifTool-9.27/t/Lang_11.out +46 -0
  498. data/vendor/Image-ExifTool-9.27/t/Lang_12.out +46 -0
  499. data/vendor/Image-ExifTool-9.27/t/Lang_13.out +46 -0
  500. data/vendor/Image-ExifTool-9.27/t/Lang_14.out +46 -0
  501. data/vendor/Image-ExifTool-9.27/t/Lang_15.out +46 -0
  502. data/vendor/Image-ExifTool-9.27/t/Lang_16.out +46 -0
  503. data/vendor/Image-ExifTool-9.27/t/Lang_17.out +46 -0
  504. data/vendor/Image-ExifTool-9.27/t/Lang_18.out +46 -0
  505. data/vendor/Image-ExifTool-9.27/t/Lang_2.out +46 -0
  506. data/vendor/Image-ExifTool-9.27/t/Lang_3.out +46 -0
  507. data/vendor/Image-ExifTool-9.27/t/Lang_4.out +46 -0
  508. data/vendor/Image-ExifTool-9.27/t/Lang_5.out +46 -0
  509. data/vendor/Image-ExifTool-9.27/t/Lang_6.out +46 -0
  510. data/vendor/Image-ExifTool-9.27/t/Lang_7.out +46 -0
  511. data/vendor/Image-ExifTool-9.27/t/Lang_8.out +46 -0
  512. data/vendor/Image-ExifTool-9.27/t/Lang_9.out +46 -0
  513. data/vendor/Image-ExifTool-9.27/t/M2TS.t +29 -0
  514. data/vendor/Image-ExifTool-9.27/t/M2TS_2.out +27 -0
  515. data/vendor/Image-ExifTool-9.27/t/MIE.t +82 -0
  516. data/vendor/Image-ExifTool-9.27/t/MIE_2.out +67 -0
  517. data/vendor/Image-ExifTool-9.27/t/MIE_3.out +134 -0
  518. data/vendor/Image-ExifTool-9.27/t/MIE_5.out +1 -0
  519. data/vendor/Image-ExifTool-9.27/t/MIE_6.out +1 -0
  520. data/vendor/Image-ExifTool-9.27/t/MIFF.t +28 -0
  521. data/vendor/Image-ExifTool-9.27/t/MIFF_2.out +108 -0
  522. data/vendor/Image-ExifTool-9.27/t/MP3.t +29 -0
  523. data/vendor/Image-ExifTool-9.27/t/MP3_2.out +45 -0
  524. data/vendor/Image-ExifTool-9.27/t/MWG.t +72 -0
  525. data/vendor/Image-ExifTool-9.27/t/MWG_2.out +13 -0
  526. data/vendor/Image-ExifTool-9.27/t/MWG_3.out +8 -0
  527. data/vendor/Image-ExifTool-9.27/t/MWG_4.out +5 -0
  528. data/vendor/Image-ExifTool-9.27/t/MWG_5.out +22 -0
  529. data/vendor/Image-ExifTool-9.27/t/MXF.t +27 -0
  530. data/vendor/Image-ExifTool-9.27/t/MXF_2.out +78 -0
  531. data/vendor/Image-ExifTool-9.27/t/Matroska.t +29 -0
  532. data/vendor/Image-ExifTool-9.27/t/Matroska_2.out +64 -0
  533. data/vendor/Image-ExifTool-9.27/t/Minolta.t +50 -0
  534. data/vendor/Image-ExifTool-9.27/t/Minolta_2.out +133 -0
  535. data/vendor/Image-ExifTool-9.27/t/Minolta_3.out +146 -0
  536. data/vendor/Image-ExifTool-9.27/t/Minolta_4.out +148 -0
  537. data/vendor/Image-ExifTool-9.27/t/Nikon.t +114 -0
  538. data/vendor/Image-ExifTool-9.27/t/Nikon_2.out +82 -0
  539. data/vendor/Image-ExifTool-9.27/t/Nikon_3.out +98 -0
  540. data/vendor/Image-ExifTool-9.27/t/Nikon_4.out +173 -0
  541. data/vendor/Image-ExifTool-9.27/t/Nikon_5.out +167 -0
  542. data/vendor/Image-ExifTool-9.27/t/Nikon_7.out +260 -0
  543. data/vendor/Image-ExifTool-9.27/t/Nikon_8.out +4 -0
  544. data/vendor/Image-ExifTool-9.27/t/Olympus.t +85 -0
  545. data/vendor/Image-ExifTool-9.27/t/Olympus_2.out +79 -0
  546. data/vendor/Image-ExifTool-9.27/t/Olympus_3.out +81 -0
  547. data/vendor/Image-ExifTool-9.27/t/Olympus_4.out +192 -0
  548. data/vendor/Image-ExifTool-9.27/t/Olympus_5.out +264 -0
  549. data/vendor/Image-ExifTool-9.27/t/Olympus_6.out +151 -0
  550. data/vendor/Image-ExifTool-9.27/t/Olympus_7.out +482 -0
  551. data/vendor/Image-ExifTool-9.27/t/OpenEXR.t +28 -0
  552. data/vendor/Image-ExifTool-9.27/t/OpenEXR_2.out +23 -0
  553. data/vendor/Image-ExifTool-9.27/t/PDF.t +295 -0
  554. data/vendor/Image-ExifTool-9.27/t/PDF_10.out +10 -0
  555. data/vendor/Image-ExifTool-9.27/t/PDF_11.out +10 -0
  556. data/vendor/Image-ExifTool-9.27/t/PDF_12.out +9 -0
  557. data/vendor/Image-ExifTool-9.27/t/PDF_14.out +5 -0
  558. data/vendor/Image-ExifTool-9.27/t/PDF_15.out +6 -0
  559. data/vendor/Image-ExifTool-9.27/t/PDF_16.out +4 -0
  560. data/vendor/Image-ExifTool-9.27/t/PDF_17.out +4 -0
  561. data/vendor/Image-ExifTool-9.27/t/PDF_18.out +5 -0
  562. data/vendor/Image-ExifTool-9.27/t/PDF_19.out +6 -0
  563. data/vendor/Image-ExifTool-9.27/t/PDF_2.out +117 -0
  564. data/vendor/Image-ExifTool-9.27/t/PDF_20.out +4 -0
  565. data/vendor/Image-ExifTool-9.27/t/PDF_22.out +3 -0
  566. data/vendor/Image-ExifTool-9.27/t/PDF_4.out +12 -0
  567. data/vendor/Image-ExifTool-9.27/t/PDF_5.out +8 -0
  568. data/vendor/Image-ExifTool-9.27/t/PDF_6.out +9 -0
  569. data/vendor/Image-ExifTool-9.27/t/PDF_7.out +11 -0
  570. data/vendor/Image-ExifTool-9.27/t/PDF_8.out +9 -0
  571. data/vendor/Image-ExifTool-9.27/t/PDF_9.out +9 -0
  572. data/vendor/Image-ExifTool-9.27/t/PGF.t +28 -0
  573. data/vendor/Image-ExifTool-9.27/t/PGF_2.out +32 -0
  574. data/vendor/Image-ExifTool-9.27/t/PICT.t +28 -0
  575. data/vendor/Image-ExifTool-9.27/t/PICT_2.out +15 -0
  576. data/vendor/Image-ExifTool-9.27/t/PLIST.t +31 -0
  577. data/vendor/Image-ExifTool-9.27/t/PLIST_2.out +20 -0
  578. data/vendor/Image-ExifTool-9.27/t/PLIST_3.out +20 -0
  579. data/vendor/Image-ExifTool-9.27/t/PNG.t +75 -0
  580. data/vendor/Image-ExifTool-9.27/t/PNG_2.out +22 -0
  581. data/vendor/Image-ExifTool-9.27/t/PNG_3.out +118 -0
  582. data/vendor/Image-ExifTool-9.27/t/PNG_4.out +12 -0
  583. data/vendor/Image-ExifTool-9.27/t/PPM.t +40 -0
  584. data/vendor/Image-ExifTool-9.27/t/PPM_2.out +15 -0
  585. data/vendor/Image-ExifTool-9.27/t/PPM_3.out +9 -0
  586. data/vendor/Image-ExifTool-9.27/t/PSP.t +28 -0
  587. data/vendor/Image-ExifTool-9.27/t/PSP_2.out +32 -0
  588. data/vendor/Image-ExifTool-9.27/t/Panasonic.t +60 -0
  589. data/vendor/Image-ExifTool-9.27/t/Panasonic_2.out +99 -0
  590. data/vendor/Image-ExifTool-9.27/t/Panasonic_3.out +119 -0
  591. data/vendor/Image-ExifTool-9.27/t/Panasonic_4.out +177 -0
  592. data/vendor/Image-ExifTool-9.27/t/Panasonic_5.out +228 -0
  593. data/vendor/Image-ExifTool-9.27/t/Pentax.t +50 -0
  594. data/vendor/Image-ExifTool-9.27/t/Pentax_2.out +219 -0
  595. data/vendor/Image-ExifTool-9.27/t/Pentax_3.out +262 -0
  596. data/vendor/Image-ExifTool-9.27/t/Pentax_4.out +123 -0
  597. data/vendor/Image-ExifTool-9.27/t/PhotoCD.t +28 -0
  598. data/vendor/Image-ExifTool-9.27/t/PhotoCD_2.out +35 -0
  599. data/vendor/Image-ExifTool-9.27/t/PhotoMechanic.t +38 -0
  600. data/vendor/Image-ExifTool-9.27/t/PhotoMechanic_2.out +81 -0
  601. data/vendor/Image-ExifTool-9.27/t/PhotoMechanic_3.out +2 -0
  602. data/vendor/Image-ExifTool-9.27/t/Photoshop.t +42 -0
  603. data/vendor/Image-ExifTool-9.27/t/Photoshop_2.out +96 -0
  604. data/vendor/Image-ExifTool-9.27/t/Photoshop_3.out +108 -0
  605. data/vendor/Image-ExifTool-9.27/t/PostScript.t +49 -0
  606. data/vendor/Image-ExifTool-9.27/t/PostScript_2.out +64 -0
  607. data/vendor/Image-ExifTool-9.27/t/PostScript_3.out +132 -0
  608. data/vendor/Image-ExifTool-9.27/t/QuickTime.t +31 -0
  609. data/vendor/Image-ExifTool-9.27/t/QuickTime_2.out +128 -0
  610. data/vendor/Image-ExifTool-9.27/t/QuickTime_3.out +69 -0
  611. data/vendor/Image-ExifTool-9.27/t/RIFF.t +31 -0
  612. data/vendor/Image-ExifTool-9.27/t/RIFF_2.out +24 -0
  613. data/vendor/Image-ExifTool-9.27/t/RIFF_3.out +52 -0
  614. data/vendor/Image-ExifTool-9.27/t/RIFF_4.out +16 -0
  615. data/vendor/Image-ExifTool-9.27/t/RTF.t +27 -0
  616. data/vendor/Image-ExifTool-9.27/t/RTF_2.out +20 -0
  617. data/vendor/Image-ExifTool-9.27/t/Radiance.t +28 -0
  618. data/vendor/Image-ExifTool-9.27/t/Radiance_2.out +22 -0
  619. data/vendor/Image-ExifTool-9.27/t/Real.t +46 -0
  620. data/vendor/Image-ExifTool-9.27/t/Real_2.out +68 -0
  621. data/vendor/Image-ExifTool-9.27/t/Real_3.out +18 -0
  622. data/vendor/Image-ExifTool-9.27/t/Real_4.out +11 -0
  623. data/vendor/Image-ExifTool-9.27/t/Ricoh.t +47 -0
  624. data/vendor/Image-ExifTool-9.27/t/Ricoh_2.out +70 -0
  625. data/vendor/Image-ExifTool-9.27/t/Ricoh_3.out +98 -0
  626. data/vendor/Image-ExifTool-9.27/t/Ricoh_4.out +112 -0
  627. data/vendor/Image-ExifTool-9.27/t/Sanyo.t +39 -0
  628. data/vendor/Image-ExifTool-9.27/t/Sanyo_2.out +101 -0
  629. data/vendor/Image-ExifTool-9.27/t/Sanyo_3.out +111 -0
  630. data/vendor/Image-ExifTool-9.27/t/Sigma.t +60 -0
  631. data/vendor/Image-ExifTool-9.27/t/Sigma_2.out +91 -0
  632. data/vendor/Image-ExifTool-9.27/t/Sigma_3.out +94 -0
  633. data/vendor/Image-ExifTool-9.27/t/Sigma_4.out +63 -0
  634. data/vendor/Image-ExifTool-9.27/t/Sigma_5.out +192 -0
  635. data/vendor/Image-ExifTool-9.27/t/Sony.t +62 -0
  636. data/vendor/Image-ExifTool-9.27/t/Sony_2.out +84 -0
  637. data/vendor/Image-ExifTool-9.27/t/Sony_3.out +85 -0
  638. data/vendor/Image-ExifTool-9.27/t/Sony_5.out +32 -0
  639. data/vendor/Image-ExifTool-9.27/t/TestLib.pm +417 -0
  640. data/vendor/Image-ExifTool-9.27/t/Unknown.t +36 -0
  641. data/vendor/Image-ExifTool-9.27/t/Unknown_2.out +90 -0
  642. data/vendor/Image-ExifTool-9.27/t/Unknown_3.out +90 -0
  643. data/vendor/Image-ExifTool-9.27/t/Vorbis.t +28 -0
  644. data/vendor/Image-ExifTool-9.27/t/Vorbis_2.out +28 -0
  645. data/vendor/Image-ExifTool-9.27/t/Writer.t +896 -0
  646. data/vendor/Image-ExifTool-9.27/t/Writer_10.out +239 -0
  647. data/vendor/Image-ExifTool-9.27/t/Writer_11.out +37 -0
  648. data/vendor/Image-ExifTool-9.27/t/Writer_13.out +160 -0
  649. data/vendor/Image-ExifTool-9.27/t/Writer_14.out +67 -0
  650. data/vendor/Image-ExifTool-9.27/t/Writer_15.out +171 -0
  651. data/vendor/Image-ExifTool-9.27/t/Writer_16.out +1 -0
  652. data/vendor/Image-ExifTool-9.27/t/Writer_17.out +1 -0
  653. data/vendor/Image-ExifTool-9.27/t/Writer_18.out +3 -0
  654. data/vendor/Image-ExifTool-9.27/t/Writer_19.out +34 -0
  655. data/vendor/Image-ExifTool-9.27/t/Writer_2.out +168 -0
  656. data/vendor/Image-ExifTool-9.27/t/Writer_22.out +4 -0
  657. data/vendor/Image-ExifTool-9.27/t/Writer_24.out +1 -0
  658. data/vendor/Image-ExifTool-9.27/t/Writer_25.out +38 -0
  659. data/vendor/Image-ExifTool-9.27/t/Writer_26.out +32 -0
  660. data/vendor/Image-ExifTool-9.27/t/Writer_27.out +14 -0
  661. data/vendor/Image-ExifTool-9.27/t/Writer_28.out +1 -0
  662. data/vendor/Image-ExifTool-9.27/t/Writer_29.out +2 -0
  663. data/vendor/Image-ExifTool-9.27/t/Writer_30.out +2 -0
  664. data/vendor/Image-ExifTool-9.27/t/Writer_31.out +97 -0
  665. data/vendor/Image-ExifTool-9.27/t/Writer_32.out +3 -0
  666. data/vendor/Image-ExifTool-9.27/t/Writer_33.out +3 -0
  667. data/vendor/Image-ExifTool-9.27/t/Writer_34.out +3 -0
  668. data/vendor/Image-ExifTool-9.27/t/Writer_35.out +187 -0
  669. data/vendor/Image-ExifTool-9.27/t/Writer_36.out +2 -0
  670. data/vendor/Image-ExifTool-9.27/t/Writer_37.out +2 -0
  671. data/vendor/Image-ExifTool-9.27/t/Writer_38.out +62 -0
  672. data/vendor/Image-ExifTool-9.27/t/Writer_39.out +4 -0
  673. data/vendor/Image-ExifTool-9.27/t/Writer_4.out +85 -0
  674. data/vendor/Image-ExifTool-9.27/t/Writer_40.out +4 -0
  675. data/vendor/Image-ExifTool-9.27/t/Writer_41.out +3 -0
  676. data/vendor/Image-ExifTool-9.27/t/Writer_42.out +5 -0
  677. data/vendor/Image-ExifTool-9.27/t/Writer_43.out +5 -0
  678. data/vendor/Image-ExifTool-9.27/t/Writer_44.out +2 -0
  679. data/vendor/Image-ExifTool-9.27/t/Writer_45.out +1 -0
  680. data/vendor/Image-ExifTool-9.27/t/Writer_46.out +77 -0
  681. data/vendor/Image-ExifTool-9.27/t/Writer_47.out +56 -0
  682. data/vendor/Image-ExifTool-9.27/t/Writer_48.out +29 -0
  683. data/vendor/Image-ExifTool-9.27/t/Writer_50.out +3 -0
  684. data/vendor/Image-ExifTool-9.27/t/Writer_6.out +182 -0
  685. data/vendor/Image-ExifTool-9.27/t/Writer_7.out +149 -0
  686. data/vendor/Image-ExifTool-9.27/t/Writer_9.out +236 -0
  687. data/vendor/Image-ExifTool-9.27/t/XMP.t +521 -0
  688. data/vendor/Image-ExifTool-9.27/t/XMP_10.out +33 -0
  689. data/vendor/Image-ExifTool-9.27/t/XMP_11.out +59 -0
  690. data/vendor/Image-ExifTool-9.27/t/XMP_12.out +4 -0
  691. data/vendor/Image-ExifTool-9.27/t/XMP_13.out +5 -0
  692. data/vendor/Image-ExifTool-9.27/t/XMP_14.out +3 -0
  693. data/vendor/Image-ExifTool-9.27/t/XMP_15.out +3 -0
  694. data/vendor/Image-ExifTool-9.27/t/XMP_16.out +5 -0
  695. data/vendor/Image-ExifTool-9.27/t/XMP_17.out +6 -0
  696. data/vendor/Image-ExifTool-9.27/t/XMP_18.out +10 -0
  697. data/vendor/Image-ExifTool-9.27/t/XMP_19.out +35 -0
  698. data/vendor/Image-ExifTool-9.27/t/XMP_2.out +138 -0
  699. data/vendor/Image-ExifTool-9.27/t/XMP_20.out +35 -0
  700. data/vendor/Image-ExifTool-9.27/t/XMP_21.out +37 -0
  701. data/vendor/Image-ExifTool-9.27/t/XMP_22.out +37 -0
  702. data/vendor/Image-ExifTool-9.27/t/XMP_23.out +9 -0
  703. data/vendor/Image-ExifTool-9.27/t/XMP_24.out +31 -0
  704. data/vendor/Image-ExifTool-9.27/t/XMP_25.out +28 -0
  705. data/vendor/Image-ExifTool-9.27/t/XMP_26.out +52 -0
  706. data/vendor/Image-ExifTool-9.27/t/XMP_27.out +93 -0
  707. data/vendor/Image-ExifTool-9.27/t/XMP_28.out +44 -0
  708. data/vendor/Image-ExifTool-9.27/t/XMP_29.out +24 -0
  709. data/vendor/Image-ExifTool-9.27/t/XMP_3.out +136 -0
  710. data/vendor/Image-ExifTool-9.27/t/XMP_30.out +90 -0
  711. data/vendor/Image-ExifTool-9.27/t/XMP_31.out +19 -0
  712. data/vendor/Image-ExifTool-9.27/t/XMP_32.out +2 -0
  713. data/vendor/Image-ExifTool-9.27/t/XMP_34.out +2 -0
  714. data/vendor/Image-ExifTool-9.27/t/XMP_36.out +18 -0
  715. data/vendor/Image-ExifTool-9.27/t/XMP_37.out +35 -0
  716. data/vendor/Image-ExifTool-9.27/t/XMP_39.out +44 -0
  717. data/vendor/Image-ExifTool-9.27/t/XMP_40.out +3 -0
  718. data/vendor/Image-ExifTool-9.27/t/XMP_41.out +175 -0
  719. data/vendor/Image-ExifTool-9.27/t/XMP_5.out +29 -0
  720. data/vendor/Image-ExifTool-9.27/t/XMP_6.out +87 -0
  721. data/vendor/Image-ExifTool-9.27/t/XMP_7.out +118 -0
  722. data/vendor/Image-ExifTool-9.27/t/XMP_8.out +17 -0
  723. data/vendor/Image-ExifTool-9.27/t/XMP_9.out +36 -0
  724. data/vendor/Image-ExifTool-9.27/t/ZIP.t +69 -0
  725. data/vendor/Image-ExifTool-9.27/t/ZIP_2.out +18 -0
  726. data/vendor/Image-ExifTool-9.27/t/ZIP_3.out +17 -0
  727. data/vendor/Image-ExifTool-9.27/t/ZIP_4.out +213 -0
  728. data/vendor/Image-ExifTool-9.27/t/ZIP_5.out +134 -0
  729. data/vendor/Image-ExifTool-9.27/t/ZIP_6.out +49 -0
  730. data/vendor/Image-ExifTool-9.27/t/ZIP_7.out +28 -0
  731. data/vendor/Image-ExifTool-9.27/t/images/AFCP.jpg +0 -0
  732. data/vendor/Image-ExifTool-9.27/t/images/AIFF.aif +0 -0
  733. data/vendor/Image-ExifTool-9.27/t/images/APE.ape +0 -0
  734. data/vendor/Image-ExifTool-9.27/t/images/APE.mpc +0 -0
  735. data/vendor/Image-ExifTool-9.27/t/images/ASF.wmv +0 -0
  736. data/vendor/Image-ExifTool-9.27/t/images/BMP.bmp +0 -0
  737. data/vendor/Image-ExifTool-9.27/t/images/BigTIFF.btf +0 -0
  738. data/vendor/Image-ExifTool-9.27/t/images/Canon.jpg +0 -0
  739. data/vendor/Image-ExifTool-9.27/t/images/Canon1DmkIII.jpg +0 -0
  740. data/vendor/Image-ExifTool-9.27/t/images/CanonRaw.cr2 +0 -0
  741. data/vendor/Image-ExifTool-9.27/t/images/CanonRaw.crw +0 -0
  742. data/vendor/Image-ExifTool-9.27/t/images/CanonVRD.vrd +0 -0
  743. data/vendor/Image-ExifTool-9.27/t/images/CaptureOne.eip +0 -0
  744. data/vendor/Image-ExifTool-9.27/t/images/Casio.jpg +0 -0
  745. data/vendor/Image-ExifTool-9.27/t/images/Casio2.jpg +0 -0
  746. data/vendor/Image-ExifTool-9.27/t/images/CasioQVCI.jpg +0 -0
  747. data/vendor/Image-ExifTool-9.27/t/images/DICOM.dcm +0 -0
  748. data/vendor/Image-ExifTool-9.27/t/images/DNG.dng +0 -0
  749. data/vendor/Image-ExifTool-9.27/t/images/DV.dv +0 -0
  750. data/vendor/Image-ExifTool-9.27/t/images/DjVu.djvu +0 -0
  751. data/vendor/Image-ExifTool-9.27/t/images/EXE.elf +0 -0
  752. data/vendor/Image-ExifTool-9.27/t/images/EXE.exe +0 -0
  753. data/vendor/Image-ExifTool-9.27/t/images/EXE.macho +0 -0
  754. data/vendor/Image-ExifTool-9.27/t/images/ExifTool.jpg +0 -0
  755. data/vendor/Image-ExifTool-9.27/t/images/ExifTool.tif +0 -0
  756. data/vendor/Image-ExifTool-9.27/t/images/ExtendedXMP.jpg +0 -0
  757. data/vendor/Image-ExifTool-9.27/t/images/FLAC.flac +0 -0
  758. data/vendor/Image-ExifTool-9.27/t/images/FLAC.ogg +0 -0
  759. data/vendor/Image-ExifTool-9.27/t/images/FLIR.fpf +0 -0
  760. data/vendor/Image-ExifTool-9.27/t/images/FLIR.jpg +0 -0
  761. data/vendor/Image-ExifTool-9.27/t/images/Flash.flv +0 -0
  762. data/vendor/Image-ExifTool-9.27/t/images/Flash.swf +0 -0
  763. data/vendor/Image-ExifTool-9.27/t/images/FlashPix.ppt +0 -0
  764. data/vendor/Image-ExifTool-9.27/t/images/Font.afm +28 -0
  765. data/vendor/Image-ExifTool-9.27/t/images/Font.dfont +0 -0
  766. data/vendor/Image-ExifTool-9.27/t/images/Font.pfa +38 -0
  767. data/vendor/Image-ExifTool-9.27/t/images/Font.pfb +0 -0
  768. data/vendor/Image-ExifTool-9.27/t/images/Font.pfm +0 -0
  769. data/vendor/Image-ExifTool-9.27/t/images/Font.ttf +0 -0
  770. data/vendor/Image-ExifTool-9.27/t/images/FotoStation.jpg +0 -0
  771. data/vendor/Image-ExifTool-9.27/t/images/FujiFilm.jpg +0 -0
  772. data/vendor/Image-ExifTool-9.27/t/images/FujiFilm.raf +0 -0
  773. data/vendor/Image-ExifTool-9.27/t/images/GE.jpg +0 -0
  774. data/vendor/Image-ExifTool-9.27/t/images/GIF.gif +0 -0
  775. data/vendor/Image-ExifTool-9.27/t/images/GIMP.xcf +0 -0
  776. data/vendor/Image-ExifTool-9.27/t/images/GPS.jpg +0 -0
  777. data/vendor/Image-ExifTool-9.27/t/images/GeoTiff.tif +0 -0
  778. data/vendor/Image-ExifTool-9.27/t/images/Geotag.gpx +23 -0
  779. data/vendor/Image-ExifTool-9.27/t/images/Geotag.igc +24 -0
  780. data/vendor/Image-ExifTool-9.27/t/images/Geotag.log +13 -0
  781. data/vendor/Image-ExifTool-9.27/t/images/Geotag.xml +23 -0
  782. data/vendor/Image-ExifTool-9.27/t/images/Geotag2.log +7 -0
  783. data/vendor/Image-ExifTool-9.27/t/images/HTML.html +77 -0
  784. data/vendor/Image-ExifTool-9.27/t/images/IPTC.jpg +0 -0
  785. data/vendor/Image-ExifTool-9.27/t/images/ITC.itc +0 -0
  786. data/vendor/Image-ExifTool-9.27/t/images/InDesign.indd +0 -0
  787. data/vendor/Image-ExifTool-9.27/t/images/JVC.jpg +0 -0
  788. data/vendor/Image-ExifTool-9.27/t/images/JVC2.jpg +0 -0
  789. data/vendor/Image-ExifTool-9.27/t/images/Jpeg2000.j2c +0 -0
  790. data/vendor/Image-ExifTool-9.27/t/images/Jpeg2000.jp2 +0 -0
  791. data/vendor/Image-ExifTool-9.27/t/images/Kodak.jpg +0 -0
  792. data/vendor/Image-ExifTool-9.27/t/images/KyoceraRaw.raw +0 -0
  793. data/vendor/Image-ExifTool-9.27/t/images/LNK.lnk +0 -0
  794. data/vendor/Image-ExifTool-9.27/t/images/M2TS.mts +0 -0
  795. data/vendor/Image-ExifTool-9.27/t/images/MIE.mie +0 -0
  796. data/vendor/Image-ExifTool-9.27/t/images/MIFF.miff +0 -0
  797. data/vendor/Image-ExifTool-9.27/t/images/MP3.mp3 +0 -0
  798. data/vendor/Image-ExifTool-9.27/t/images/MWG.jpg +0 -0
  799. data/vendor/Image-ExifTool-9.27/t/images/MXF.mxf +0 -0
  800. data/vendor/Image-ExifTool-9.27/t/images/Matroska.mkv +0 -0
  801. data/vendor/Image-ExifTool-9.27/t/images/Minolta.jpg +0 -0
  802. data/vendor/Image-ExifTool-9.27/t/images/Minolta.mrw +0 -0
  803. data/vendor/Image-ExifTool-9.27/t/images/Nikon.jpg +0 -0
  804. data/vendor/Image-ExifTool-9.27/t/images/Nikon.nef +0 -0
  805. data/vendor/Image-ExifTool-9.27/t/images/NikonD2Hs.jpg +0 -0
  806. data/vendor/Image-ExifTool-9.27/t/images/NikonD70.jpg +0 -0
  807. data/vendor/Image-ExifTool-9.27/t/images/OOXML.docx +0 -0
  808. data/vendor/Image-ExifTool-9.27/t/images/Olympus.jpg +0 -0
  809. data/vendor/Image-ExifTool-9.27/t/images/Olympus2.jpg +0 -0
  810. data/vendor/Image-ExifTool-9.27/t/images/OlympusE1.jpg +0 -0
  811. data/vendor/Image-ExifTool-9.27/t/images/OpenDoc.ods +0 -0
  812. data/vendor/Image-ExifTool-9.27/t/images/OpenEXR.exr +0 -0
  813. data/vendor/Image-ExifTool-9.27/t/images/PDF.pdf +0 -0
  814. data/vendor/Image-ExifTool-9.27/t/images/PDF2.pdf +0 -0
  815. data/vendor/Image-ExifTool-9.27/t/images/PGF.pgf +0 -0
  816. data/vendor/Image-ExifTool-9.27/t/images/PICT.pict +0 -0
  817. data/vendor/Image-ExifTool-9.27/t/images/PLIST-bin.plist +0 -0
  818. data/vendor/Image-ExifTool-9.27/t/images/PLIST-xml.plist +35 -0
  819. data/vendor/Image-ExifTool-9.27/t/images/PNG.png +0 -0
  820. data/vendor/Image-ExifTool-9.27/t/images/PPM.ppm +5 -0
  821. data/vendor/Image-ExifTool-9.27/t/images/PSP.psp +0 -0
  822. data/vendor/Image-ExifTool-9.27/t/images/Panasonic.jpg +0 -0
  823. data/vendor/Image-ExifTool-9.27/t/images/Panasonic.rw2 +0 -0
  824. data/vendor/Image-ExifTool-9.27/t/images/Pentax.avi +0 -0
  825. data/vendor/Image-ExifTool-9.27/t/images/Pentax.jpg +0 -0
  826. data/vendor/Image-ExifTool-9.27/t/images/PhotoCD.pcd +0 -0
  827. data/vendor/Image-ExifTool-9.27/t/images/PhotoMechanic.jpg +0 -0
  828. data/vendor/Image-ExifTool-9.27/t/images/Photoshop.psd +0 -0
  829. data/vendor/Image-ExifTool-9.27/t/images/PostScript.eps +108 -0
  830. data/vendor/Image-ExifTool-9.27/t/images/QuickTime.m4a +0 -0
  831. data/vendor/Image-ExifTool-9.27/t/images/QuickTime.mov +0 -0
  832. data/vendor/Image-ExifTool-9.27/t/images/RIFF.avi +0 -0
  833. data/vendor/Image-ExifTool-9.27/t/images/RIFF.wav +0 -0
  834. data/vendor/Image-ExifTool-9.27/t/images/RIFF.webp +0 -0
  835. data/vendor/Image-ExifTool-9.27/t/images/RTF.rtf +25 -0
  836. data/vendor/Image-ExifTool-9.27/t/images/Radiance.hdr +0 -0
  837. data/vendor/Image-ExifTool-9.27/t/images/Real.ra +0 -0
  838. data/vendor/Image-ExifTool-9.27/t/images/Real.ram +1 -0
  839. data/vendor/Image-ExifTool-9.27/t/images/Real.rm +0 -0
  840. data/vendor/Image-ExifTool-9.27/t/images/Ricoh.jpg +0 -0
  841. data/vendor/Image-ExifTool-9.27/t/images/Ricoh2.jpg +0 -0
  842. data/vendor/Image-ExifTool-9.27/t/images/Sanyo.jpg +0 -0
  843. data/vendor/Image-ExifTool-9.27/t/images/Sigma.jpg +0 -0
  844. data/vendor/Image-ExifTool-9.27/t/images/Sigma.x3f +0 -0
  845. data/vendor/Image-ExifTool-9.27/t/images/SigmaDP2.x3f +0 -0
  846. data/vendor/Image-ExifTool-9.27/t/images/Sony.jpg +0 -0
  847. data/vendor/Image-ExifTool-9.27/t/images/Sony.pmp +0 -0
  848. data/vendor/Image-ExifTool-9.27/t/images/Unknown.jpg +0 -0
  849. data/vendor/Image-ExifTool-9.27/t/images/Vorbis.ogg +0 -0
  850. data/vendor/Image-ExifTool-9.27/t/images/Writer.jpg +0 -0
  851. data/vendor/Image-ExifTool-9.27/t/images/XMP.inx +108 -0
  852. data/vendor/Image-ExifTool-9.27/t/images/XMP.jpg +0 -0
  853. data/vendor/Image-ExifTool-9.27/t/images/XMP.svg +33 -0
  854. data/vendor/Image-ExifTool-9.27/t/images/XMP.xml +98 -0
  855. data/vendor/Image-ExifTool-9.27/t/images/XMP.xmp +99 -0
  856. data/vendor/Image-ExifTool-9.27/t/images/XMP2.xmp +25 -0
  857. data/vendor/Image-ExifTool-9.27/t/images/XMP3.xmp +43 -0
  858. data/vendor/Image-ExifTool-9.27/t/images/XMP4.xmp +93 -0
  859. data/vendor/Image-ExifTool-9.27/t/images/XMP5.xmp +158 -0
  860. data/vendor/Image-ExifTool-9.27/t/images/ZIP.gz +0 -0
  861. data/vendor/Image-ExifTool-9.27/t/images/ZIP.zip +0 -0
  862. data/vendor/Image-ExifTool-9.27/t/images/iWork.numbers +0 -0
  863. metadata +868 -218
  864. data/vendor/Image-ExifTool-8.97/.DS_Store +0 -0
  865. data/vendor/Image-ExifTool-8.97/Changes +0 -5753
  866. data/vendor/Image-ExifTool-8.97/ExifTool_config +0 -299
  867. data/vendor/Image-ExifTool-8.97/MANIFEST +0 -831
  868. data/vendor/Image-ExifTool-8.97/META.yml +0 -26
  869. data/vendor/Image-ExifTool-8.97/README +0 -221
  870. data/vendor/Image-ExifTool-8.97/exiftool +0 -5207
  871. data/vendor/Image-ExifTool-8.97/kml.fmt +0 -63
  872. data/vendor/Image-ExifTool-8.97/lib/File/RandomAccess.pm +0 -378
  873. data/vendor/Image-ExifTool-8.97/lib/File/RandomAccess.pod +0 -231
  874. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool.pm +0 -6623
  875. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool.pod +0 -2276
  876. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/AES.pm +0 -501
  877. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/AFCP.pm +0 -280
  878. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/AIFF.pm +0 -271
  879. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/APE.pm +0 -254
  880. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/APP12.pm +0 -322
  881. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/ASF.pm +0 -871
  882. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/BMP.pm +0 -179
  883. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/BZZ.pm +0 -472
  884. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/BigTIFF.pm +0 -286
  885. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/BuildTagLookup.pm +0 -2311
  886. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Canon.pm +0 -7435
  887. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/CanonCustom.pm +0 -2484
  888. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/CanonRaw.pm +0 -927
  889. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/CanonVRD.pm +0 -1481
  890. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/CaptureOne.pm +0 -235
  891. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Casio.pm +0 -2013
  892. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Charset.pm +0 -396
  893. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/DICOM.pm +0 -3832
  894. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/DNG.pm +0 -835
  895. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/DV.pm +0 -319
  896. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/DjVu.pm +0 -373
  897. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/EXE.pm +0 -1228
  898. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Exif.pm +0 -4344
  899. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/FLAC.pm +0 -296
  900. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Fixup.pm +0 -333
  901. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Flash.pm +0 -755
  902. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/FlashPix.pm +0 -1882
  903. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Font.pm +0 -643
  904. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/FotoStation.pm +0 -258
  905. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/FujiFilm.pm +0 -968
  906. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/GE.pm +0 -80
  907. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/GIF.pm +0 -525
  908. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/GIMP.pm +0 -258
  909. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/GPS.pm +0 -511
  910. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/GeoTiff.pm +0 -2187
  911. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Geotag.pm +0 -1171
  912. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/H264.pm +0 -1093
  913. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/HP.pm +0 -262
  914. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/HTML.pm +0 -576
  915. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/HtmlDump.pm +0 -886
  916. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/ICC_Profile.pm +0 -997
  917. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/ID3.pm +0 -1276
  918. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/IPTC.pm +0 -1233
  919. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/ITC.pm +0 -215
  920. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Import.pm +0 -307
  921. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/InDesign.pm +0 -277
  922. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/JPEG.pm +0 -584
  923. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/JPEGDigest.pm +0 -2511
  924. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/JVC.pm +0 -130
  925. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Jpeg2000.pm +0 -823
  926. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Kodak.pm +0 -2012
  927. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/KyoceraRaw.pm +0 -173
  928. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/LNK.pm +0 -723
  929. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/cs.pm +0 -1581
  930. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/de.pm +0 -5503
  931. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/en_ca.pm +0 -557
  932. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/en_gb.pm +0 -572
  933. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/es.pm +0 -1718
  934. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/fi.pm +0 -2831
  935. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/fr.pm +0 -4716
  936. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/it.pm +0 -2201
  937. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/ja.pm +0 -5793
  938. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/ko.pm +0 -2324
  939. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/nl.pm +0 -3212
  940. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/pl.pm +0 -1134
  941. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/ru.pm +0 -761
  942. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/sv.pm +0 -632
  943. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/tr.pm +0 -539
  944. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1320
  945. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Lang/zh_tw.pm +0 -794
  946. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Leaf.pm +0 -515
  947. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/M2TS.pm +0 -729
  948. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MIE.pm +0 -2552
  949. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MIEUnits.pod +0 -377
  950. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MIFF.pm +0 -279
  951. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MNG.pm +0 -684
  952. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MPC.pm +0 -156
  953. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MPEG.pm +0 -736
  954. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MPF.pm +0 -286
  955. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MWG.pm +0 -586
  956. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MXF.pm +0 -3032
  957. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MakerNotes.pm +0 -1551
  958. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Matroska.pm +0 -891
  959. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Microsoft.pm +0 -861
  960. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Minolta.pm +0 -2786
  961. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/MinoltaRaw.pm +0 -534
  962. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Nikon.pm +0 -5568
  963. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/NikonCapture.pm +0 -911
  964. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/NikonCustom.pm +0 -3724
  965. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/OOXML.pm +0 -409
  966. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Ogg.pm +0 -237
  967. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Olympus.pm +0 -4027
  968. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/OpenEXR.pm +0 -324
  969. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PDF.pm +0 -1986
  970. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PGF.pm +0 -143
  971. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PICT.pm +0 -1260
  972. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PNG.pm +0 -1100
  973. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PPM.pm +0 -169
  974. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PSP.pm +0 -305
  975. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Panasonic.pm +0 -1852
  976. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PanasonicRaw.pm +0 -383
  977. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Pentax.pm +0 -5044
  978. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PhotoCD.pm +0 -507
  979. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PhotoMechanic.pm +0 -250
  980. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Photoshop.pm +0 -594
  981. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PostScript.pm +0 -691
  982. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/PrintIM.pm +0 -125
  983. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Qualcomm.pm +0 -1344
  984. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/QuickTime.pm +0 -2920
  985. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/README +0 -922
  986. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/RIFF.pm +0 -1278
  987. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/RSRC.pm +0 -240
  988. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/RTF.pm +0 -383
  989. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Radiance.pm +0 -144
  990. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Rawzor.pm +0 -190
  991. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Real.pm +0 -736
  992. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Reconyx.pm +0 -190
  993. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Ricoh.pm +0 -714
  994. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Samsung.pm +0 -764
  995. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Sanyo.pm +0 -439
  996. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Shift.pl +0 -594
  997. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Shortcuts.pm +0 -289
  998. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Sigma.pm +0 -488
  999. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/SigmaRaw.pm +0 -676
  1000. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Sony.pm +0 -3844
  1001. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/SonyIDC.pm +0 -330
  1002. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Stim.pm +0 -196
  1003. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/TagInfoXML.pm +0 -763
  1004. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/TagLookup.pm +0 -7305
  1005. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/TagNames.pod +0 -24147
  1006. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Theora.pm +0 -145
  1007. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Unknown.pm +0 -66
  1008. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Vorbis.pm +0 -221
  1009. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WriteCanonRaw.pl +0 -637
  1010. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WriteExif.pl +0 -3513
  1011. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WriteIPTC.pl +0 -700
  1012. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WritePDF.pl +0 -757
  1013. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WritePNG.pl +0 -329
  1014. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WritePhotoshop.pl +0 -266
  1015. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WritePostScript.pl +0 -776
  1016. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/WriteXMP.pl +0 -1296
  1017. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/Writer.pl +0 -5577
  1018. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/XMP.pm +0 -3589
  1019. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/XMP2.pl +0 -1315
  1020. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/XMPStruct.pl +0 -814
  1021. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/ZIP.pm +0 -623
  1022. data/vendor/Image-ExifTool-8.97/lib/Image/ExifTool/iWork.pm +0 -223
  1023. data/vendor/Image-ExifTool-8.97/perl-Image-ExifTool.spec +0 -103
@@ -0,0 +1,3316 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: QuickTime.pm
3
+ #
4
+ # Description: Read QuickTime, MP4 and M4A meta information
5
+ #
6
+ # Revisions: 10/04/2005 - P. Harvey Created
7
+ # 12/19/2005 - P. Harvey Added MP4 support
8
+ # 09/22/2006 - P. Harvey Added M4A support
9
+ # 07/27/2010 - P. Harvey Updated to 2010-05-03 QuickTime spec
10
+ #
11
+ # References: 1) http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html
12
+ # 2) http://search.cpan.org/dist/MP4-Info-1.04/
13
+ # 3) http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt
14
+ # 4) http://wiki.multimedia.cx/index.php?title=Apple_QuickTime
15
+ # 5) ISO 14496-12 (http://neuron2.net/library/avc/c041828_ISO_IEC_14496-12_2005(E).pdf)
16
+ # 6) ISO 14496-16 (http://www.iec-normen.de/previewpdf/info_isoiec14496-16%7Bed2.0%7Den.pdf)
17
+ # 7) http://atomicparsley.sourceforge.net/mpeg-4files.html
18
+ # 8) http://wiki.multimedia.cx/index.php?title=QuickTime_container
19
+ # 9) http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf (Oct 2008)
20
+ # 10) http://code.google.com/p/mp4v2/wiki/iTunesMetadata
21
+ # 11) http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf
22
+ # 12) QuickTime file format specification 2010-05-03
23
+ # 13) http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf
24
+ # 14) http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip
25
+ # 15) http://getid3.sourceforge.net/source/module.audio-video.quicktime.phps
26
+ #------------------------------------------------------------------------------
27
+
28
+ package Image::ExifTool::QuickTime;
29
+
30
+ use strict;
31
+ use vars qw($VERSION);
32
+ use Image::ExifTool qw(:DataAccess :Utils);
33
+ use Image::ExifTool::Exif;
34
+
35
+ $VERSION = '1.67';
36
+
37
+ sub FixWrongFormat($);
38
+ sub ProcessMOV($$;$);
39
+ sub ProcessKeys($$$);
40
+ sub ProcessMetaData($$$);
41
+ sub ProcessEncodingParams($$$);
42
+ sub ConvertISO6709($);
43
+ sub PrintGPSCoordinates($);
44
+ sub UnpackLang($);
45
+
46
+ # MIME types for all entries in the ftypLookup with file extensions
47
+ # (defaults to 'video/mp4' if not found in this lookup)
48
+ my %mimeLookup = (
49
+ '3G2' => 'video/3gpp2',
50
+ '3GP' => 'video/3gpp',
51
+ DVB => 'video/vnd.dvb.file',
52
+ F4A => 'audio/mp4',
53
+ F4B => 'audio/mp4',
54
+ JP2 => 'image/jp2',
55
+ JPM => 'image/jpm',
56
+ JPX => 'image/jpx',
57
+ M4A => 'audio/mp4',
58
+ M4B => 'audio/mp4',
59
+ M4P => 'audio/mp4',
60
+ M4V => 'video/x-m4v',
61
+ MOV => 'video/quicktime',
62
+ MQV => 'video/quicktime',
63
+ );
64
+
65
+ # look up file type from ftyp atom type, with MIME type in comment if known
66
+ # (ref http://www.ftyps.com/)
67
+ my %ftypLookup = (
68
+ '3g2a' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-0 V1.0', # video/3gpp2
69
+ '3g2b' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-A V1.0.0', # video/3gpp2
70
+ '3g2c' => '3GPP2 Media (.3G2) compliant with 3GPP2 C.S0050-B v1.0', # video/3gpp2
71
+ '3ge6' => '3GPP (.3GP) Release 6 MBMS Extended Presentations', # video/3gpp
72
+ '3ge7' => '3GPP (.3GP) Release 7 MBMS Extended Presentations', # video/3gpp
73
+ '3gg6' => '3GPP Release 6 General Profile', # video/3gpp
74
+ '3gp1' => '3GPP Media (.3GP) Release 1 (probably non-existent)', # video/3gpp
75
+ '3gp2' => '3GPP Media (.3GP) Release 2 (probably non-existent)', # video/3gpp
76
+ '3gp3' => '3GPP Media (.3GP) Release 3 (probably non-existent)', # video/3gpp
77
+ '3gp4' => '3GPP Media (.3GP) Release 4', # video/3gpp
78
+ '3gp5' => '3GPP Media (.3GP) Release 5', # video/3gpp
79
+ '3gp6' => '3GPP Media (.3GP) Release 6 Basic Profile', # video/3gpp
80
+ '3gp6' => '3GPP Media (.3GP) Release 6 Progressive Download', # video/3gpp
81
+ '3gp6' => '3GPP Media (.3GP) Release 6 Streaming Servers', # video/3gpp
82
+ '3gs7' => '3GPP Media (.3GP) Release 7 Streaming Servers', # video/3gpp
83
+ 'avc1' => 'MP4 Base w/ AVC ext [ISO 14496-12:2005]', # video/mp4
84
+ 'CAEP' => 'Canon Digital Camera',
85
+ 'caqv' => 'Casio Digital Camera',
86
+ 'CDes' => 'Convergent Design',
87
+ 'da0a' => 'DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG images',
88
+ 'da0b' => 'DMB MAF, extending DA0A, with 3GPP timed text, DID, TVA, REL, IPMP',
89
+ 'da1a' => 'DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images',
90
+ 'da1b' => 'DMB MAF, extending da1a, with 3GPP timed text, DID, TVA, REL, IPMP',
91
+ 'da2a' => 'DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG images',
92
+ 'da2b' => 'DMB MAF, extending da2a, with 3GPP timed text, DID, TVA, REL, IPMP',
93
+ 'da3a' => 'DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images',
94
+ 'da3b' => 'DMB MAF, extending da3a w/ BIFS, 3GPP timed text, DID, TVA, REL, IPMP',
95
+ 'dmb1' => 'DMB MAF supporting all the components defined in the specification',
96
+ 'dmpf' => 'Digital Media Project', # various
97
+ 'drc1' => 'Dirac (wavelet compression), encapsulated in ISO base media (MP4)',
98
+ 'dv1a' => 'DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG images, TS',
99
+ 'dv1b' => 'DMB MAF, extending dv1a, with 3GPP timed text, DID, TVA, REL, IPMP',
100
+ 'dv2a' => 'DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG images, TS',
101
+ 'dv2b' => 'DMB MAF, extending dv2a, with 3GPP timed text, DID, TVA, REL, IPMP',
102
+ 'dv3a' => 'DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG images, TS',
103
+ 'dv3b' => 'DMB MAF, extending dv3a, with 3GPP timed text, DID, TVA, REL, IPMP',
104
+ 'dvr1' => 'DVB (.DVB) over RTP', # video/vnd.dvb.file
105
+ 'dvt1' => 'DVB (.DVB) over MPEG-2 Transport Stream', # video/vnd.dvb.file
106
+ 'F4A ' => 'Audio for Adobe Flash Player 9+ (.F4A)', # audio/mp4
107
+ 'F4B ' => 'Audio Book for Adobe Flash Player 9+ (.F4B)', # audio/mp4
108
+ 'F4P ' => 'Protected Video for Adobe Flash Player 9+ (.F4P)', # video/mp4
109
+ 'F4V ' => 'Video for Adobe Flash Player 9+ (.F4V)', # video/mp4
110
+ 'isc2' => 'ISMACryp 2.0 Encrypted File', # ?/enc-isoff-generic
111
+ 'iso2' => 'MP4 Base Media v2 [ISO 14496-12:2005]', # video/mp4
112
+ 'isom' => 'MP4 Base Media v1 [IS0 14496-12:2003]', # video/mp4
113
+ 'JP2 ' => 'JPEG 2000 Image (.JP2) [ISO 15444-1 ?]', # image/jp2
114
+ 'JP20' => 'Unknown, from GPAC samples (prob non-existent)',
115
+ 'jpm ' => 'JPEG 2000 Compound Image (.JPM) [ISO 15444-6]', # image/jpm
116
+ 'jpx ' => 'JPEG 2000 with extensions (.JPX) [ISO 15444-2]', # image/jpx
117
+ 'KDDI' => '3GPP2 EZmovie for KDDI 3G cellphones', # video/3gpp2
118
+ #LCAG => (found in CompatibleBrands of Leica MOV videos)
119
+ 'M4A ' => 'Apple iTunes AAC-LC (.M4A) Audio', # audio/x-m4a
120
+ 'M4B ' => 'Apple iTunes AAC-LC (.M4B) Audio Book', # audio/mp4
121
+ 'M4P ' => 'Apple iTunes AAC-LC (.M4P) AES Protected Audio', # audio/mp4
122
+ 'M4V ' => 'Apple iTunes Video (.M4V) Video', # video/x-m4v
123
+ 'M4VH' => 'Apple TV (.M4V)', # video/x-m4v
124
+ 'M4VP' => 'Apple iPhone (.M4V)', # video/x-m4v
125
+ 'mj2s' => 'Motion JPEG 2000 [ISO 15444-3] Simple Profile', # video/mj2
126
+ 'mjp2' => 'Motion JPEG 2000 [ISO 15444-3] General Profile', # video/mj2
127
+ 'mmp4' => 'MPEG-4/3GPP Mobile Profile (.MP4/3GP) (for NTT)', # video/mp4
128
+ 'mp21' => 'MPEG-21 [ISO/IEC 21000-9]', # various
129
+ 'mp41' => 'MP4 v1 [ISO 14496-1:ch13]', # video/mp4
130
+ 'mp42' => 'MP4 v2 [ISO 14496-14]', # video/mp4
131
+ 'mp71' => 'MP4 w/ MPEG-7 Metadata [per ISO 14496-12]', # various
132
+ 'MPPI' => 'Photo Player, MAF [ISO/IEC 23000-3]', # various
133
+ 'mqt ' => 'Sony / Mobile QuickTime (.MQV) US Patent 7,477,830 (Sony Corp)', # video/quicktime
134
+ 'MSNV' => 'MPEG-4 (.MP4) for SonyPSP', # audio/mp4
135
+ 'NDAS' => 'MP4 v2 [ISO 14496-14] Nero Digital AAC Audio', # audio/mp4
136
+ 'NDSC' => 'MPEG-4 (.MP4) Nero Cinema Profile', # video/mp4
137
+ 'NDSH' => 'MPEG-4 (.MP4) Nero HDTV Profile', # video/mp4
138
+ 'NDSM' => 'MPEG-4 (.MP4) Nero Mobile Profile', # video/mp4
139
+ 'NDSP' => 'MPEG-4 (.MP4) Nero Portable Profile', # video/mp4
140
+ 'NDSS' => 'MPEG-4 (.MP4) Nero Standard Profile', # video/mp4
141
+ 'NDXC' => 'H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile', # video/mp4
142
+ 'NDXH' => 'H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile', # video/mp4
143
+ 'NDXM' => 'H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile', # video/mp4
144
+ 'NDXP' => 'H.264/MPEG-4 AVC (.MP4) Nero Portable Profile', # video/mp4
145
+ 'NDXS' => 'H.264/MPEG-4 AVC (.MP4) Nero Standard Profile', # video/mp4
146
+ 'odcf' => 'OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)', # various
147
+ 'opf2' => 'OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)',
148
+ 'opx2' => 'OMA PDCF DRM + XBS extensions (OMA-TS-DRM_XBS-V1_0-20070529-C)',
149
+ 'pana' => 'Panasonic Digital Camera',
150
+ 'qt ' => 'Apple QuickTime (.MOV/QT)', # video/quicktime
151
+ 'ROSS' => 'Ross Video',
152
+ 'sdv ' => 'SD Memory Card Video', # various?
153
+ 'ssc1' => 'Samsung stereoscopic, single stream',
154
+ 'ssc2' => 'Samsung stereoscopic, dual stream',
155
+ );
156
+
157
+ # information for time/date-based tags (time zero is Jan 1, 1904)
158
+ my %timeInfo = (
159
+ Notes => 'converted from UTC to local time if the QuickTimeUTC option is set',
160
+ # It is not uncommon for brain-dead software to use the wrong time zero,
161
+ # so assume a time zero of Jan 1, 1970 if the date is before this
162
+ RawConv => q{
163
+ my $offset = (66 * 365 + 17) * 24 * 3600;
164
+ return $val - $offset if $val >= $offset;
165
+ $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1) if $val;
166
+ return $val;
167
+ },
168
+ # Note: This value will be in UTC if generated by a system that is aware of the time zone
169
+ ValueConv => 'ConvertUnixTime($val, $self->Options("QuickTimeUTC"))',
170
+ PrintConv => '$self->ConvertDateTime($val)',
171
+ # (can't put Groups here because they aren't constant!)
172
+ );
173
+ # information for duration tags
174
+ my %durationInfo = (
175
+ ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
176
+ PrintConv => '$$self{TimeScale} ? ConvertDuration($val) : $val',
177
+ );
178
+ # parsing for most of the 3gp udta language text boxes
179
+ my %langText = (
180
+ RawConv => sub {
181
+ my ($val, $self) = @_;
182
+ return '<err>' unless length $val >= 6;
183
+ my $lang = UnpackLang(Get16u(\$val, 4));
184
+ $lang = $lang ? "($lang) " : '';
185
+ $val = substr($val, 6); # isolate string
186
+ $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
187
+ return $lang . $val;
188
+ },
189
+ );
190
+
191
+ # 4-character Vendor ID codes (ref PH)
192
+ my %vendorID = (
193
+ appl => 'Apple',
194
+ fe20 => 'Olympus (fe20)', # (FE200)
195
+ FFMP => 'FFmpeg',
196
+ 'GIC '=> 'General Imaging Co.',
197
+ kdak => 'Kodak',
198
+ KMPI => 'Konica-Minolta',
199
+ leic => 'Leica',
200
+ mino => 'Minolta',
201
+ niko => 'Nikon',
202
+ NIKO => 'Nikon',
203
+ olym => 'Olympus',
204
+ pana => 'Panasonic',
205
+ pent => 'Pentax',
206
+ pr01 => 'Olympus (pr01)', # (FE100,FE110,FE115)
207
+ sany => 'Sanyo',
208
+ 'SMI '=> 'Sorenson Media Inc.',
209
+ ZORA => 'Zoran Corporation',
210
+ );
211
+
212
+ # QuickTime data atom encodings for string types (ref 12)
213
+ my %stringEncoding = (
214
+ 1 => 'UTF8',
215
+ 2 => 'UTF16',
216
+ 3 => 'ShiftJIS',
217
+ 4 => 'UTF8',
218
+ 5 => 'UTF16',
219
+ );
220
+
221
+ my %graphicsMode = (
222
+ # (ref http://homepage.mac.com/vanhoek/MovieGuts%20docs/64.html)
223
+ 0x00 => 'srcCopy',
224
+ 0x01 => 'srcOr',
225
+ 0x02 => 'srcXor',
226
+ 0x03 => 'srcBic',
227
+ 0x04 => 'notSrcCopy',
228
+ 0x05 => 'notSrcOr',
229
+ 0x06 => 'notSrcXor',
230
+ 0x07 => 'notSrcBic',
231
+ 0x08 => 'patCopy',
232
+ 0x09 => 'patOr',
233
+ 0x0a => 'patXor',
234
+ 0x0b => 'patBic',
235
+ 0x0c => 'notPatCopy',
236
+ 0x0d => 'notPatOr',
237
+ 0x0e => 'notPatXor',
238
+ 0x0f => 'notPatBic',
239
+ 0x20 => 'blend',
240
+ 0x21 => 'addPin',
241
+ 0x22 => 'addOver',
242
+ 0x23 => 'subPin',
243
+ 0x24 => 'transparent',
244
+ 0x25 => 'addMax',
245
+ 0x26 => 'subOver',
246
+ 0x27 => 'addMin',
247
+ 0x31 => 'grayishTextOr',
248
+ 0x32 => 'hilite',
249
+ 0x40 => 'ditherCopy',
250
+ # the following ref ISO/IEC 15444-3
251
+ 0x100 => 'Alpha',
252
+ 0x101 => 'White Alpha',
253
+ 0x102 => 'Pre-multiplied Black Alpha',
254
+ 0x110 => 'Component Alpha',
255
+ );
256
+
257
+ # QuickTime atoms
258
+ %Image::ExifTool::QuickTime::Main = (
259
+ PROCESS_PROC => \&ProcessMOV,
260
+ GROUPS => { 2 => 'Video' },
261
+ NOTES => q{
262
+ The QuickTime format is used for many different types of audio, video and
263
+ image files (most commonly, MOV and MP4 videos). Exiftool extracts standard
264
+ meta information a variety of audio, video and image parameters, as well as
265
+ proprietary information written by many camera models. Tags with a question
266
+ mark after their name are not extracted unless the Unknown option is set.
267
+
268
+ According to the specification, many QuickTime date/time tags should be
269
+ stored as UTC. Unfortunately, digital cameras often store local time values
270
+ instead (presumably because they don't know the time zone). For this
271
+ reason, by default ExifTool does not assume a time zone for these values.
272
+ However, if the QuickTimeUTC option is set via the API or the ExifTool
273
+ configuration file, then ExifTool will assume these values are properly
274
+ stored as UTC, and will convert them to local time when extracting.
275
+ },
276
+ free => [
277
+ {
278
+ Name => 'KodakFree',
279
+ # (found in Kodak M5370 MP4 videos)
280
+ Condition => '$$valPt =~ /^\0\0\0.Seri/s',
281
+ SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Free' },
282
+ },{
283
+ Unknown => 1,
284
+ Binary => 1,
285
+ },
286
+ # (also Samsung WB750 uncompressed thumbnail data starting with "SDIC\0")
287
+ ],
288
+ skip => [
289
+ {
290
+ Name => 'CanonSkip',
291
+ Condition => '$$valPt =~ /^\0.{3}(CNDB|CNCV|CNMN|CNFV|CNTH|CNDM)/s',
292
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::Skip' },
293
+ },
294
+ { Name => 'Skip', Unknown => 1, Binary => 1 },
295
+ ],
296
+ wide => { Unknown => 1, Binary => 1 },
297
+ ftyp => { #MP4
298
+ Name => 'FileType',
299
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileType' },
300
+ },
301
+ pnot => {
302
+ Name => 'Preview',
303
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Preview' },
304
+ },
305
+ PICT => {
306
+ Name => 'PreviewPICT',
307
+ Binary => 1,
308
+ },
309
+ pict => { #8
310
+ Name => 'PreviewPICT',
311
+ Binary => 1,
312
+ },
313
+ moov => {
314
+ Name => 'Movie',
315
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Movie' },
316
+ },
317
+ mdat => { Name => 'MovieData', Unknown => 1, Binary => 1 },
318
+ 'mdat-size' => {
319
+ Name => 'MovieDataSize',
320
+ Notes => q{
321
+ not a real tag ID, this tag represents the size of the 'mdat' data in bytes
322
+ and is used in the AvgBitrate calculation
323
+ },
324
+ },
325
+ junk => { Unknown => 1, Binary => 1 }, #8
326
+ uuid => [
327
+ { #9 (MP4 files)
328
+ Name => 'UUID-XMP',
329
+ Condition => '$$valPt=~/^\xbe\x7a\xcf\xcb\x97\xa9\x42\xe8\x9c\x71\x99\x94\x91\xe3\xaf\xac/',
330
+ SubDirectory => {
331
+ TagTable => 'Image::ExifTool::XMP::Main',
332
+ Start => 16,
333
+ },
334
+ },
335
+ { #11 (MP4 files)
336
+ Name => 'UUID-PROF',
337
+ Condition => '$$valPt=~/^PROF!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
338
+ SubDirectory => {
339
+ TagTable => 'Image::ExifTool::QuickTime::Profile',
340
+ Start => 24, # uid(16) + version(1) + flags(3) + count(4)
341
+ },
342
+ },
343
+ { #PH (Flip MP4 files)
344
+ Name => 'UUID-Flip',
345
+ Condition => '$$valPt=~/\x4a\xb0\x3b\x0f\x61\x8d\x40\x75\x82\xb2\xd9\xfa\xce\xd3\x5f\xf5/',
346
+ SubDirectory => {
347
+ TagTable => 'Image::ExifTool::QuickTime::Flip',
348
+ Start => 16,
349
+ },
350
+ },
351
+ # "\x98\x7f\xa3\xdf\x2a\x85\x43\xc0\x8f\x8f\xd9\x7c\x47\x1e\x8e\xea" - unknown data in Flip videos
352
+ { #8
353
+ Name => 'UUID-Unknown',
354
+ Unknown => 1,
355
+ Binary => 1,
356
+ },
357
+ ],
358
+ );
359
+
360
+ # MPEG-4 'ftyp' atom
361
+ # (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
362
+ %Image::ExifTool::QuickTime::FileType = (
363
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
364
+ GROUPS => { 2 => 'Video' },
365
+ FORMAT => 'int32u',
366
+ 0 => {
367
+ Name => 'MajorBrand',
368
+ Format => 'undef[4]',
369
+ PrintConv => \%ftypLookup,
370
+ },
371
+ 1 => {
372
+ Name => 'MinorVersion',
373
+ Format => 'undef[4]',
374
+ ValueConv => 'sprintf("%x.%x.%x", unpack("nCC", $val))',
375
+ },
376
+ 2 => {
377
+ Name => 'CompatibleBrands',
378
+ Format => 'undef[$size-8]',
379
+ # ignore any entry with a null, and return others as a list
380
+ ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a',
381
+ },
382
+ );
383
+
384
+ # atoms used in QTIF files
385
+ %Image::ExifTool::QuickTime::ImageFile = (
386
+ PROCESS_PROC => \&ProcessMOV,
387
+ GROUPS => { 2 => 'Image' },
388
+ NOTES => 'Tags used in QTIF QuickTime Image Files.',
389
+ idsc => {
390
+ Name => 'ImageDescription',
391
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ImageDesc' },
392
+ },
393
+ idat => {
394
+ Name => 'ImageData',
395
+ Binary => 1,
396
+ },
397
+ iicc => {
398
+ Name => 'ICC_Profile',
399
+ SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
400
+ },
401
+ );
402
+
403
+ # image description data block
404
+ %Image::ExifTool::QuickTime::ImageDesc = (
405
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
406
+ GROUPS => { 2 => 'Image' },
407
+ FORMAT => 'int16u',
408
+ 2 => {
409
+ Name => 'CompressorID',
410
+ Format => 'string[4]',
411
+ # not very useful since this isn't a complete list and name is given below
412
+ # # ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html
413
+ # PrintConv => {
414
+ # cvid => 'Cinepak',
415
+ # jpeg => 'JPEG',
416
+ # 'smc '=> 'Graphics',
417
+ # 'rle '=> 'Animation',
418
+ # rpza => 'Apple Video',
419
+ # kpcd => 'Kodak Photo CD',
420
+ # 'png '=> 'Portable Network Graphics',
421
+ # mjpa => 'Motion-JPEG (format A)',
422
+ # mjpb => 'Motion-JPEG (format B)',
423
+ # SVQ1 => 'Sorenson video, version 1',
424
+ # SVQ3 => 'Sorenson video, version 3',
425
+ # mp4v => 'MPEG-4 video',
426
+ # 'dvc '=> 'NTSC DV-25 video',
427
+ # dvcp => 'PAL DV-25 video',
428
+ # 'gif '=> 'Compuserve Graphics Interchange Format',
429
+ # h263 => 'H.263 video',
430
+ # tiff => 'Tagged Image File Format',
431
+ # 'raw '=> 'Uncompressed RGB',
432
+ # '2vuY'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (2vuY)",
433
+ # 'yuv2'=> "Uncompressed Y'CbCr, 3x8-bit 4:2:2 (yuv2)",
434
+ # v308 => "Uncompressed Y'CbCr, 8-bit 4:4:4",
435
+ # v408 => "Uncompressed Y'CbCr, 8-bit 4:4:4:4",
436
+ # v216 => "Uncompressed Y'CbCr, 10, 12, 14, or 16-bit 4:2:2",
437
+ # v410 => "Uncompressed Y'CbCr, 10-bit 4:4:4",
438
+ # v210 => "Uncompressed Y'CbCr, 10-bit 4:2:2",
439
+ # },
440
+ },
441
+ 10 => {
442
+ Name => 'VendorID',
443
+ Format => 'string[4]',
444
+ RawConv => 'length $val ? $val : undef',
445
+ PrintConv => \%vendorID,
446
+ SeparateTable => 'VendorID',
447
+ },
448
+ # 14 - ("Quality" in QuickTime docs) ??
449
+ 16 => 'SourceImageWidth',
450
+ 17 => 'SourceImageHeight',
451
+ 18 => { Name => 'XResolution', Format => 'fixed32u' },
452
+ 20 => { Name => 'YResolution', Format => 'fixed32u' },
453
+ # 24 => 'FrameCount', # always 1 (what good is this?)
454
+ 25 => {
455
+ Name => 'CompressorName',
456
+ Format => 'string[32]',
457
+ # (sometimes this is a Pascal string, and sometimes it is a C string)
458
+ RawConv => q{
459
+ $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
460
+ length $val ? $val : undef;
461
+ },
462
+ },
463
+ 41 => 'BitDepth',
464
+ );
465
+
466
+ # preview data block
467
+ %Image::ExifTool::QuickTime::Preview = (
468
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
469
+ GROUPS => { 2 => 'Image' },
470
+ FORMAT => 'int16u',
471
+ 0 => {
472
+ Name => 'PreviewDate',
473
+ Format => 'int32u',
474
+ Groups => { 2 => 'Time' },
475
+ %timeInfo,
476
+ },
477
+ 2 => 'PreviewVersion',
478
+ 3 => {
479
+ Name => 'PreviewAtomType',
480
+ Format => 'string[4]',
481
+ },
482
+ 5 => 'PreviewAtomIndex',
483
+ );
484
+
485
+ # movie atoms
486
+ %Image::ExifTool::QuickTime::Movie = (
487
+ PROCESS_PROC => \&ProcessMOV,
488
+ GROUPS => { 2 => 'Video' },
489
+ mvhd => {
490
+ Name => 'MovieHeader',
491
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MovieHeader' },
492
+ },
493
+ trak => {
494
+ Name => 'Track',
495
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Track' },
496
+ },
497
+ udta => {
498
+ Name => 'UserData',
499
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
500
+ },
501
+ meta => { # 'meta' is found here in my EX-F1 MOV sample - PH
502
+ Name => 'Meta',
503
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
504
+ },
505
+ iods => {
506
+ Name => 'InitialObjectDescriptor',
507
+ Flags => ['Binary','Unknown'],
508
+ },
509
+ uuid => [
510
+ { #11 (MP4 files) (also found in QuickTime::Track)
511
+ Name => 'UUID-USMT',
512
+ Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
513
+ SubDirectory => {
514
+ TagTable => 'Image::ExifTool::QuickTime::UserMedia',
515
+ Start => 16,
516
+ },
517
+ },
518
+ {
519
+ Name => 'UUID-Unknown',
520
+ Unknown => 1,
521
+ Binary => 1,
522
+ },
523
+ ],
524
+ cmov => {
525
+ Name => 'CompressedMovie',
526
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::CMovie' },
527
+ },
528
+ # prfl - Profile (ref 12)
529
+ # clip - clipping --> contains crgn (clip region) (ref 12)
530
+ # mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14)
531
+ );
532
+
533
+ # movie header data block
534
+ %Image::ExifTool::QuickTime::MovieHeader = (
535
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
536
+ GROUPS => { 2 => 'Video' },
537
+ FORMAT => 'int32u',
538
+ 0 => {
539
+ Name => 'MovieHeaderVersion',
540
+ Format => 'int8u',
541
+ RawConv => '$$self{MovieHeaderVersion} = $val',
542
+ },
543
+ 1 => {
544
+ Name => 'CreateDate',
545
+ Groups => { 2 => 'Time' },
546
+ %timeInfo,
547
+ # this is int64u if MovieHeaderVersion == 1 (ref 13)
548
+ Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
549
+ },
550
+ 2 => {
551
+ Name => 'ModifyDate',
552
+ Groups => { 2 => 'Time' },
553
+ %timeInfo,
554
+ # this is int64u if MovieHeaderVersion == 1 (ref 13)
555
+ Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
556
+ },
557
+ 3 => {
558
+ Name => 'TimeScale',
559
+ RawConv => '$$self{TimeScale} = $val',
560
+ },
561
+ 4 => {
562
+ Name => 'Duration',
563
+ %durationInfo,
564
+ # this is int64u if MovieHeaderVersion == 1 (ref 13)
565
+ Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
566
+ },
567
+ 5 => {
568
+ Name => 'PreferredRate',
569
+ ValueConv => '$val / 0x10000',
570
+ },
571
+ 6 => {
572
+ Name => 'PreferredVolume',
573
+ Format => 'int16u',
574
+ ValueConv => '$val / 256',
575
+ PrintConv => 'sprintf("%.2f%%", $val * 100)',
576
+ },
577
+ 9 => {
578
+ Name => 'MatrixStructure',
579
+ Format => 'fixed32s[9]',
580
+ # (the right column is fixed 2.30 instead of 16.16)
581
+ ValueConv => q{
582
+ my @a = split ' ',$val;
583
+ $_ /= 0x4000 foreach @a[2,5,8];
584
+ return "@a";
585
+ },
586
+ },
587
+ 18 => { Name => 'PreviewTime', %durationInfo },
588
+ 19 => { Name => 'PreviewDuration', %durationInfo },
589
+ 20 => { Name => 'PosterTime', %durationInfo },
590
+ 21 => { Name => 'SelectionTime', %durationInfo },
591
+ 22 => { Name => 'SelectionDuration',%durationInfo },
592
+ 23 => { Name => 'CurrentTime', %durationInfo },
593
+ 24 => 'NextTrackID',
594
+ );
595
+
596
+ # track atoms
597
+ %Image::ExifTool::QuickTime::Track = (
598
+ PROCESS_PROC => \&ProcessMOV,
599
+ GROUPS => { 2 => 'Video' },
600
+ tkhd => {
601
+ Name => 'TrackHeader',
602
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackHeader' },
603
+ },
604
+ udta => {
605
+ Name => 'UserData',
606
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::UserData' },
607
+ },
608
+ mdia => { #MP4
609
+ Name => 'Media',
610
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Media' },
611
+ },
612
+ meta => { #PH (MOV)
613
+ Name => 'Meta',
614
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Meta' },
615
+ },
616
+ tref => {
617
+ Name => 'TrackRef',
618
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackRef' },
619
+ },
620
+ tapt => {
621
+ Name => 'TrackAperture',
622
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TrackAperture' },
623
+ },
624
+ uuid => [
625
+ { #11 (MP4 files) (also found in QuickTime::Movie)
626
+ Name => 'UUID-USMT',
627
+ Condition => '$$valPt=~/^USMT!\xd2\x4f\xce\xbb\x88\x69\x5c\xfa\xc9\xc7\x40/',
628
+ SubDirectory => {
629
+ TagTable => 'Image::ExifTool::QuickTime::UserMedia',
630
+ Start => 16,
631
+ },
632
+ },
633
+ {
634
+ Name => 'UUID-Unknown',
635
+ Unknown => 1,
636
+ Binary => 1,
637
+ },
638
+ ],
639
+ # edts - edits --> contains elst (edit list)
640
+ # clip - clipping --> contains crgn (clip region)
641
+ # matt - track matt --> contains kmat (compressed matt)
642
+ # load - track loading settings
643
+ # imap - track input map --> contains ' in' --> contains ' ty', obid
644
+ # prfl - Profile (ref 12)
645
+ );
646
+
647
+ # track header data block
648
+ %Image::ExifTool::QuickTime::TrackHeader = (
649
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
650
+ GROUPS => { 1 => 'Track#', 2 => 'Video' },
651
+ FORMAT => 'int32u',
652
+ 0 => {
653
+ Name => 'TrackHeaderVersion',
654
+ Format => 'int8u',
655
+ Priority => 0,
656
+ RawConv => '$$self{TrackHeaderVersion} = $val',
657
+ },
658
+ 1 => {
659
+ Name => 'TrackCreateDate',
660
+ Priority => 0,
661
+ Groups => { 2 => 'Time' },
662
+ %timeInfo,
663
+ # this is int64u if TrackHeaderVersion == 1 (ref 13)
664
+ Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
665
+ },
666
+ 2 => {
667
+ Name => 'TrackModifyDate',
668
+ Priority => 0,
669
+ Groups => { 2 => 'Time' },
670
+ %timeInfo,
671
+ # this is int64u if TrackHeaderVersion == 1 (ref 13)
672
+ Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
673
+ },
674
+ 3 => {
675
+ Name => 'TrackID',
676
+ Priority => 0,
677
+ },
678
+ 5 => {
679
+ Name => 'TrackDuration',
680
+ Priority => 0,
681
+ %durationInfo,
682
+ # this is int64u if TrackHeaderVersion == 1 (ref 13)
683
+ Hook => '$$self{TrackHeaderVersion} and $format = "int64u", $varSize += 4',
684
+ },
685
+ 8 => {
686
+ Name => 'TrackLayer',
687
+ Format => 'int16u',
688
+ Priority => 0,
689
+ },
690
+ 9 => {
691
+ Name => 'TrackVolume',
692
+ Format => 'int16u',
693
+ Priority => 0,
694
+ ValueConv => '$val / 256',
695
+ PrintConv => 'sprintf("%.2f%%", $val * 100)',
696
+ },
697
+ 10 => {
698
+ Name => 'MatrixStructure',
699
+ Format => 'fixed32s[9]',
700
+ # (the right column is fixed 2.30 instead of 16.16)
701
+ ValueConv => q{
702
+ my @a = split ' ',$val;
703
+ $_ /= 0x4000 foreach @a[2,5,8];
704
+ return "@a";
705
+ },
706
+ },
707
+ 19 => {
708
+ Name => 'ImageWidth',
709
+ Priority => 0,
710
+ RawConv => \&FixWrongFormat,
711
+ },
712
+ 20 => {
713
+ Name => 'ImageHeight',
714
+ Priority => 0,
715
+ RawConv => \&FixWrongFormat,
716
+ },
717
+ );
718
+
719
+ # user data atoms
720
+ %Image::ExifTool::QuickTime::UserData = (
721
+ PROCESS_PROC => \&ProcessMOV,
722
+ GROUPS => { 2 => 'Video' },
723
+ NOTES => q{
724
+ Tag ID's beginning with the copyright symbol (hex 0xa9) are multi-language
725
+ text. Alternate language tags are accessed by adding a dash followed by the
726
+ language/country code to the tag name. ExifTool will extract any
727
+ multi-language user data tags found, even if they don't exist in this table.
728
+ },
729
+ "\xa9cpy" => { Name => 'Copyright', Groups => { 2 => 'Author' } },
730
+ "\xa9day" => {
731
+ Name => 'CreateDate',
732
+ Groups => { 2 => 'Time' },
733
+ # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
734
+ ValueConv => q{
735
+ require Image::ExifTool::XMP;
736
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
737
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
738
+ return $val;
739
+ },
740
+ PrintConv => '$self->ConvertDateTime($val)',
741
+ },
742
+ "\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
743
+ "\xa9alb" => 'Album', #PH (iTunes 8.0.2)
744
+ "\xa9arg" => 'Arranger', #12
745
+ "\xa9ark" => 'ArrangerKeywords', #12
746
+ "\xa9cmt" => 'Comment', #PH (iTunes 8.0.2)
747
+ "\xa9cok" => 'ComposerKeywords', #12
748
+ "\xa9com" => 'Composer', #12
749
+ "\xa9dir" => 'Director', #12
750
+ "\xa9ed1" => 'Edit1',
751
+ "\xa9ed2" => 'Edit2',
752
+ "\xa9ed3" => 'Edit3',
753
+ "\xa9ed4" => 'Edit4',
754
+ "\xa9ed5" => 'Edit5',
755
+ "\xa9ed6" => 'Edit6',
756
+ "\xa9ed7" => 'Edit7',
757
+ "\xa9ed8" => 'Edit8',
758
+ "\xa9ed9" => 'Edit9',
759
+ "\xa9fmt" => 'Format',
760
+ "\xa9gen" => 'Genre', #PH (iTunes 8.0.2)
761
+ "\xa9grp" => 'Grouping', #PH (NC)
762
+ "\xa9inf" => 'Information',
763
+ "\xa9isr" => 'ISRCCode', #12
764
+ "\xa9lab" => 'RecordLabelName', #12
765
+ "\xa9lal" => 'RecordLabelURL', #12
766
+ "\xa9lyr" => 'Lyrics', #PH (NC)
767
+ "\xa9mak" => 'Make', #12
768
+ "\xa9mal" => 'MakerURL', #12
769
+ "\xa9mod" => 'Model', #PH
770
+ "\xa9nam" => 'Title', #12
771
+ "\xa9pdk" => 'ProducerKeywords', #12
772
+ "\xa9phg" => 'RecordingCopyright', #12
773
+ "\xa9prd" => 'Producer',
774
+ "\xa9prf" => 'Performers',
775
+ "\xa9prk" => 'PerformerKeywords', #12
776
+ "\xa9prl" => 'PerformerURL',
777
+ "\xa9dir" => 'Director', #12
778
+ "\xa9req" => 'Requirements',
779
+ "\xa9snk" => 'SubtitleKeywords', #12
780
+ "\xa9snm" => 'Subtitle', #12
781
+ "\xa9src" => 'SourceCredits', #12
782
+ "\xa9swf" => 'SongWriter', #12
783
+ "\xa9swk" => 'SongWriterKeywords', #12
784
+ "\xa9swr" => 'SoftwareVersion', #12
785
+ "\xa9too" => 'Encoder', #PH (NC)
786
+ "\xa9trk" => 'Track', #PH (NC)
787
+ "\xa9wrt" => 'Composer',
788
+ "\xa9xyz" => { #PH (iPhone 3GS)
789
+ Name => 'GPSCoordinates',
790
+ Groups => { 2 => 'Location' },
791
+ ValueConv => \&ConvertISO6709,
792
+ PrintConv => \&PrintGPSCoordinates,
793
+ },
794
+ name => 'Name',
795
+ WLOC => {
796
+ Name => 'WindowLocation',
797
+ Format => 'int16u',
798
+ },
799
+ LOOP => {
800
+ Name => 'LoopStyle',
801
+ Format => 'int32u',
802
+ PrintConv => {
803
+ 1 => 'Normal',
804
+ 2 => 'Palindromic',
805
+ },
806
+ },
807
+ SelO => {
808
+ Name => 'PlaySelection',
809
+ Format => 'int8u',
810
+ },
811
+ AllF => {
812
+ Name => 'PlayAllFrames',
813
+ Format => 'int8u',
814
+ },
815
+ meta => {
816
+ Name => 'Meta',
817
+ SubDirectory => {
818
+ TagTable => 'Image::ExifTool::QuickTime::Meta',
819
+ Start => 4, # must skip 4-byte version number header
820
+ },
821
+ },
822
+ DcMD => {
823
+ Name => 'KodakDcMD',
824
+ SubDirectory => { TagTable => 'Image::ExifTool::Kodak::DcMD' },
825
+ },
826
+ # AMBA => Ambarella AVC atom (unknown data written by Kodak Playsport video cam)
827
+ 'ptv '=> {
828
+ Name => 'PrintToVideo',
829
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
830
+ },
831
+ 'hnti'=> {
832
+ Name => 'HintInfo',
833
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintInfo' },
834
+ },
835
+ 'hinf' => {
836
+ Name => 'HintTrackInfo',
837
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintTrackInfo' },
838
+ },
839
+ TAGS => [ #PH
840
+ # these tags were initially discovered in a Pentax movie,
841
+ # but similar information is found in videos from other manufacturers
842
+ {
843
+ Name => 'FujiFilmTags',
844
+ Condition => '$$valPt =~ /^FUJIFILM DIGITAL CAMERA\0/',
845
+ SubDirectory => {
846
+ TagTable => 'Image::ExifTool::FujiFilm::MOV',
847
+ ByteOrder => 'LittleEndian',
848
+ },
849
+ },
850
+ {
851
+ Name => 'KodakTags',
852
+ Condition => '$$valPt =~ /^EASTMAN KODAK COMPANY/',
853
+ SubDirectory => {
854
+ TagTable => 'Image::ExifTool::Kodak::MOV',
855
+ ByteOrder => 'LittleEndian',
856
+ },
857
+ },
858
+ {
859
+ Name => 'KonicaMinoltaTags',
860
+ Condition => '$$valPt =~ /^KONICA MINOLTA DIGITAL CAMERA/',
861
+ SubDirectory => {
862
+ TagTable => 'Image::ExifTool::Minolta::MOV1',
863
+ ByteOrder => 'LittleEndian',
864
+ },
865
+ },
866
+ {
867
+ Name => 'MinoltaTags',
868
+ Condition => '$$valPt =~ /^MINOLTA DIGITAL CAMERA/',
869
+ SubDirectory => {
870
+ TagTable => 'Image::ExifTool::Minolta::MOV2',
871
+ ByteOrder => 'LittleEndian',
872
+ },
873
+ },
874
+ {
875
+ Name => 'NikonTags',
876
+ Condition => '$$valPt =~ /^NIKON DIGITAL CAMERA\0/',
877
+ SubDirectory => {
878
+ TagTable => 'Image::ExifTool::Nikon::MOV',
879
+ ByteOrder => 'LittleEndian',
880
+ },
881
+ },
882
+ {
883
+ Name => 'OlympusTags1',
884
+ Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0.{9}\x01\0/s',
885
+ SubDirectory => {
886
+ TagTable => 'Image::ExifTool::Olympus::MOV1',
887
+ ByteOrder => 'LittleEndian',
888
+ },
889
+ },
890
+ {
891
+ Name => 'OlympusTags2',
892
+ Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA(?!\0.{21}\x0a\0{3})/s',
893
+ SubDirectory => {
894
+ TagTable => 'Image::ExifTool::Olympus::MOV2',
895
+ ByteOrder => 'LittleEndian',
896
+ },
897
+ },
898
+ {
899
+ Name => 'OlympusTags3',
900
+ Condition => '$$valPt =~ /^OLYMPUS DIGITAL CAMERA\0/',
901
+ SubDirectory => {
902
+ TagTable => 'Image::ExifTool::Olympus::MP4',
903
+ ByteOrder => 'LittleEndian',
904
+ },
905
+ },
906
+ {
907
+ Name => 'OlympusTags4',
908
+ Condition => '$$valPt =~ /^.{16}OLYM\0/s',
909
+ SubDirectory => {
910
+ TagTable => 'Image::ExifTool::Olympus::MOV3',
911
+ Start => 12,
912
+ },
913
+ },
914
+ {
915
+ Name => 'PentaxTags',
916
+ Condition => '$$valPt =~ /^PENTAX DIGITAL CAMERA\0/',
917
+ SubDirectory => {
918
+ TagTable => 'Image::ExifTool::Pentax::MOV',
919
+ ByteOrder => 'LittleEndian',
920
+ },
921
+ },
922
+ {
923
+ Name => 'SamsungTags',
924
+ Condition => '$$valPt =~ /^SAMSUNG DIGITAL CAMERA\0/',
925
+ SubDirectory => {
926
+ TagTable => 'Image::ExifTool::Samsung::MP4',
927
+ ByteOrder => 'LittleEndian',
928
+ },
929
+ },
930
+ {
931
+ Name => 'SanyoMOV',
932
+ Condition => q{
933
+ $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
934
+ $self->{VALUE}->{FileType} eq "MOV"
935
+ },
936
+ SubDirectory => {
937
+ TagTable => 'Image::ExifTool::Sanyo::MOV',
938
+ ByteOrder => 'LittleEndian',
939
+ },
940
+ },
941
+ {
942
+ Name => 'SanyoMP4',
943
+ Condition => q{
944
+ $$valPt =~ /^SANYO DIGITAL CAMERA\0/ and
945
+ $self->{VALUE}->{FileType} eq "MP4"
946
+ },
947
+ SubDirectory => {
948
+ TagTable => 'Image::ExifTool::Sanyo::MP4',
949
+ ByteOrder => 'LittleEndian',
950
+ },
951
+ },
952
+ {
953
+ Name => 'UnknownTags',
954
+ Unknown => 1,
955
+ Binary => 1
956
+ },
957
+ ],
958
+ NCDT => { #PH
959
+ Name => 'NikonNCDT',
960
+ SubDirectory => { TagTable => 'Image::ExifTool::Nikon::NCDT' },
961
+ },
962
+ QVMI => { #PH
963
+ Name => 'CasioQVMI',
964
+ # Casio stores standard EXIF-format information in MOV videos (ie. EX-S880)
965
+ SubDirectory => {
966
+ TagTable => 'Image::ExifTool::Exif::Main',
967
+ ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
968
+ DirName => 'IFD0',
969
+ Multi => 0, # (no NextIFD pointer)
970
+ Start => 10,
971
+ ByteOrder => 'BigEndian',
972
+ },
973
+ },
974
+ PANA => { #PH
975
+ Name => 'PanasonicPANA',
976
+ SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
977
+ },
978
+ LEIC => { #PH
979
+ Name => 'LeicaLEIC',
980
+ SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::PANA' },
981
+ },
982
+ PENT => { #PH
983
+ Name => 'PentaxPENT',
984
+ SubDirectory => {
985
+ TagTable => 'Image::ExifTool::Pentax::PENT',
986
+ ByteOrder => 'LittleEndian',
987
+ },
988
+ },
989
+ MMA0 => { #PH (DiMage 7Hi)
990
+ Name => 'MinoltaMMA0',
991
+ SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
992
+ },
993
+ MMA1 => { #PH (Dimage A2)
994
+ Name => 'MinoltaMMA1',
995
+ SubDirectory => { TagTable => 'Image::ExifTool::Minolta::MMA' },
996
+ },
997
+ XMP_ => { #PH (Adobe CS3 Bridge)
998
+ Name => 'XMP',
999
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
1000
+ },
1001
+ vndr => 'Vendor', #PH (Samsung PL70)
1002
+ SDLN => 'PlayMode', #PH (NC, Samsung ST80 "SEQ_PLAY")
1003
+ # Canon tags
1004
+ CNCV => 'CompressorVersion', #PH (5D Mark II)
1005
+ CNMN => 'Model', #PH (EOS 550D)
1006
+ CNFV => 'FirmwareVersion', #PH (EOS 550D)
1007
+ CNTH => { #PH (PowerShot S95)
1008
+ Name => 'CanonCNTH',
1009
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' },
1010
+ },
1011
+ # CNDB - 2112 bytes (550D)
1012
+ # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95)
1013
+ INFO => {
1014
+ Name => 'SamsungINFO',
1015
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::INFO' },
1016
+ },
1017
+ FFMV => { #PH (FinePix HS20EXR)
1018
+ Name => 'FujiFilmFFMV',
1019
+ SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::FFMV' },
1020
+ },
1021
+ MVTG => { #PH (FinePix HS20EXR)
1022
+ Name => 'FujiFilmMVTG',
1023
+ SubDirectory => {
1024
+ TagTable => 'Image::ExifTool::Exif::Main',
1025
+ ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
1026
+ DirName => 'IFD0',
1027
+ Start => 16,
1028
+ Base => '$start',
1029
+ ByteOrder => 'LittleEndian',
1030
+ },
1031
+ },
1032
+ Xtra => { #PH (microsoft)
1033
+ Name => 'MicrosoftXtra',
1034
+ SubDirectory => { TagTable => 'Image::ExifTool::Microsoft::Xtra' },
1035
+ },
1036
+ hinv => 'HintVersion', #PH (guess)
1037
+ thmb => [
1038
+ { #PH (Pentax Q)
1039
+ Name => 'MakerNotePentax5a',
1040
+ Condition => '$$valPt =~ /^PENTAX \0II/',
1041
+ SubDirectory => {
1042
+ TagTable => 'Image::ExifTool::Pentax::Main',
1043
+ ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
1044
+ Start => 10,
1045
+ Base => '$start - 10',
1046
+ ByteOrder => 'LittleEndian',
1047
+ },
1048
+ },{ #PH (TG-810)
1049
+ Name => 'OlympusThumbnail',
1050
+ Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
1051
+ SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb' },
1052
+ },
1053
+ ],
1054
+ scrn => { #PH (TG-810)
1055
+ Name => 'OlympusPreview',
1056
+ Condition => '$$valPt =~ /^.{4}\xff\xd8\xff\xdb/s',
1057
+ SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' },
1058
+ },
1059
+ PXTH => { #PH (Pentax K-01)
1060
+ Name => 'PentaxPreview',
1061
+ SubDirectory => { TagTable => 'Image::ExifTool::Pentax::PXTH' },
1062
+ },
1063
+ PXMN => { #PH (Pentax K-01)
1064
+ Name => 'MakerNotePentax5b',
1065
+ Condition => '$$valPt =~ /^PENTAX \0MM/',
1066
+ SubDirectory => {
1067
+ TagTable => 'Image::ExifTool::Pentax::Main',
1068
+ ProcessProc => \&Image::ExifTool::Exif::ProcessExif, # (because ProcessMOV is default)
1069
+ Start => 10,
1070
+ Base => '$start - 10',
1071
+ ByteOrder => 'BigEndian',
1072
+ },
1073
+ },
1074
+ modl => { #PH (Samsung GT-S8530)
1075
+ Name => 'Model',
1076
+ Description => 'Camera Model Name',
1077
+ },
1078
+ # ducp - 4 bytes, all zero (Samsung ST96,WB750)
1079
+ GoPr => 'GoProType', #PH
1080
+ # the following are 3gp tags, references:
1081
+ # http://atomicparsley.sourceforge.net
1082
+ # http://www.3gpp.org/ftp/tsg_sa/WG4_CODEC/TSGS4_25/Docs/
1083
+ cprt => { Name => 'Copyright', %langText, Groups => { 2 => 'Author' } },
1084
+ auth => { Name => 'Author', %langText, Groups => { 2 => 'Author' } },
1085
+ titl => { Name => 'Title', %langText },
1086
+ dscp => { Name => 'Description',%langText },
1087
+ perf => { Name => 'Performer', %langText },
1088
+ gnre => { Name => 'Genre', %langText },
1089
+ albm => { Name => 'Album', %langText },
1090
+ rtng => {
1091
+ Name => 'Rating',
1092
+ # (4-byte flags, 4-char entity, 4-char criteria, 2-byte lang, string)
1093
+ RawConv => q{
1094
+ return '<err>' unless length $val >= 14;
1095
+ my $str = 'Entity=' . substr($val,4,4) . ' Criteria=' . substr($val,8,4);
1096
+ $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
1097
+ my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 12));
1098
+ $lang = $lang ? "($lang) " : '';
1099
+ $val = substr($val, 14);
1100
+ $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
1101
+ return $lang . $str . ' ' . $val;
1102
+ },
1103
+ },
1104
+ clsf => {
1105
+ Name => 'Classification',
1106
+ # (4-byte flags, 4-char entity, 2-byte index, 2-byte lang, string)
1107
+ RawConv => q{
1108
+ return '<err>' unless length $val >= 12;
1109
+ my $str = 'Entity=' . substr($val,4,4) . ' Index=' . Get16u(\$val,8);
1110
+ $str =~ tr/\0-\x1f\x7f-\xff//d; # remove unprintable characters
1111
+ my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 10));
1112
+ $lang = $lang ? "($lang) " : '';
1113
+ $val = substr($val, 12);
1114
+ $val = $self->Decode($val, 'UCS2') if $val =~ /^\xfe\xff/;
1115
+ return $lang . $str . ' ' . $val;
1116
+ },
1117
+ },
1118
+ kywd => {
1119
+ Name => 'Keywords',
1120
+ # (4 byte flags, 2-byte lang, 1-byte count, count x pascal strings)
1121
+ RawConv => q{
1122
+ return '<err>' unless length $val >= 7;
1123
+ my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
1124
+ $lang = $lang ? "($lang) " : '';
1125
+ my $num = Get8u(\$val, 6);
1126
+ my ($i, @vals);
1127
+ my $pos = 7;
1128
+ for ($i=0; $i<$num; ++$i) {
1129
+ last if $pos >= length $val;
1130
+ my $len = Get8u(\$val, $pos++);
1131
+ last if $pos + $len > length $val;
1132
+ my $v = substr($val, $pos, $len);
1133
+ $v = $self->Decode($v, 'UCS2') if $v =~ /^\xfe\xff/;
1134
+ push @vals, $v;
1135
+ $pos += $len;
1136
+ }
1137
+ my $sep = $self->Options('ListSep');
1138
+ return $lang . join($sep, @vals);
1139
+ },
1140
+ },
1141
+ loci => {
1142
+ Name => 'LocationInformation',
1143
+ Groups => { 2 => 'Location' },
1144
+ # (4-byte flags, 2-byte lang, location string, 1-byte role, 4-byte fixed longitude,
1145
+ # 4-byte fixed latitude, 4-byte fixed altitude, body string, notes string)
1146
+ RawConv => q{
1147
+ return '<err>' unless length $val >= 6;
1148
+ my $lang = Image::ExifTool::QuickTime::UnpackLang(Get16u(\$val, 4));
1149
+ $lang = $lang ? "($lang) " : '';
1150
+ $val = substr($val, 6);
1151
+ my $str;
1152
+ if ($val =~ /^\xfe\xff/) {
1153
+ $val =~ s/^(\xfe\xff(.{2})*?)\0\0//s or return '<err>';
1154
+ $str = $self->Decode($1, 'UCS2');
1155
+ } else {
1156
+ $val =~ s/^(.*?)\0//s or return '<err>';
1157
+ $str = $1;
1158
+ }
1159
+ $str = '(none)' unless length $str;
1160
+ return '<err>' if length $val < 13;
1161
+ my $role = Get8u(\$val, 0);
1162
+ my $lon = GetFixed32s(\$val, 1);
1163
+ my $lat = GetFixed32s(\$val, 5);
1164
+ my $alt = GetFixed32s(\$val, 9);
1165
+ my $roleStr = {0=>'shooting',1=>'real',2=>'fictional',3=>'reserved'}->{$role};
1166
+ $str .= ' Role=' . ($roleStr || "unknown($role)");
1167
+ $str .= sprintf(' Lat=%.5f Lon=%.5f Alt=%.2f', $lat, $lon, $alt);
1168
+ $val = substr($val, 13);
1169
+ if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
1170
+ $str .= ' Body=' . $self->Decode($1, 'UCS2');
1171
+ } elsif ($val =~ s/^(.*?)\0//s) {
1172
+ $str .= " Body=$1";
1173
+ }
1174
+ if ($val =~ s/^(\xfe\xff(.{2})*?)\0\0//s) {
1175
+ $str .= ' Notes=' . $self->Decode($1, 'UCS2');
1176
+ } elsif ($val =~ s/^(.*?)\0//s) {
1177
+ $str .= " Notes=$1";
1178
+ }
1179
+ return $lang . $str;
1180
+ },
1181
+ },
1182
+ yrrc => {
1183
+ Name => 'Year',
1184
+ Groups => { 2 => 'Time' },
1185
+ RawConv => 'length($val) >= 6 ? Get16u(\$val,4) : "<err>"',
1186
+ },
1187
+ # the following are various 3rd-party tags
1188
+ # ref http://code.google.com/p/mp4parser/source/browse/trunk/isoparser/src/main/resources/isoparser-default.properties?r=814
1189
+ ccid => 'ContentID',
1190
+ icnu => 'IconURI',
1191
+ infu => 'InfoURL',
1192
+ cdis => 'ContentDistributorID',
1193
+ albr => { Name => 'AlbumArtist', Groups => { 2 => 'Author' } },
1194
+ cvru => 'CoverURI',
1195
+ lrcu => 'LyricsURI',
1196
+ );
1197
+
1198
+ # User-specific media data atoms (ref 11)
1199
+ %Image::ExifTool::QuickTime::UserMedia = (
1200
+ PROCESS_PROC => \&ProcessMOV,
1201
+ GROUPS => { 2 => 'Video' },
1202
+ MTDT => {
1203
+ Name => 'MetaData',
1204
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MetaData' },
1205
+ },
1206
+ );
1207
+
1208
+ # User-specific media data atoms (ref 11)
1209
+ %Image::ExifTool::QuickTime::MetaData = (
1210
+ PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessMetaData,
1211
+ GROUPS => { 2 => 'Video' },
1212
+ TAG_PREFIX => 'MetaData',
1213
+ 0x01 => 'Title',
1214
+ 0x03 => {
1215
+ Name => 'ProductionDate',
1216
+ Groups => { 2 => 'Time' },
1217
+ # translate from format "YYYY/mm/dd HH:MM:SS"
1218
+ ValueConv => '$val=~tr{/}{:}; $val',
1219
+ PrintConv => '$self->ConvertDateTime($val)',
1220
+ },
1221
+ 0x04 => 'Software',
1222
+ 0x05 => 'Product',
1223
+ 0x0a => {
1224
+ Name => 'TrackProperty',
1225
+ RawConv => 'my @a=unpack("Nnn",$val); "@a"',
1226
+ PrintConv => [
1227
+ { 0 => 'No presentation', BITMASK => { 0 => 'Main track' } },
1228
+ { 0 => 'No attributes', BITMASK => { 15 => 'Read only' } },
1229
+ '"Priority $val"',
1230
+ ],
1231
+ },
1232
+ 0x0b => {
1233
+ Name => 'TimeZone',
1234
+ Groups => { 2 => 'Time' },
1235
+ RawConv => 'Get16s(\$val,0)',
1236
+ PrintConv => 'TimeZoneString($val)',
1237
+ },
1238
+ 0x0c => {
1239
+ Name => 'ModifyDate',
1240
+ Groups => { 2 => 'Time' },
1241
+ # translate from format "YYYY/mm/dd HH:MM:SS"
1242
+ ValueConv => '$val=~tr{/}{:}; $val',
1243
+ PrintConv => '$self->ConvertDateTime($val)',
1244
+ },
1245
+ );
1246
+
1247
+ # compressed movie atoms (ref http://wiki.multimedia.cx/index.php?title=QuickTime_container#cmov)
1248
+ %Image::ExifTool::QuickTime::CMovie = (
1249
+ PROCESS_PROC => \&ProcessMOV,
1250
+ GROUPS => { 2 => 'Video' },
1251
+ dcom => 'Compression',
1252
+ # cmvd - compressed movie data
1253
+ );
1254
+
1255
+ # Profile atoms (ref 11)
1256
+ %Image::ExifTool::QuickTime::Profile = (
1257
+ PROCESS_PROC => \&ProcessMOV,
1258
+ GROUPS => { 2 => 'Video' },
1259
+ FPRF => {
1260
+ Name => 'FileGlobalProfile',
1261
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::FileProf' },
1262
+ },
1263
+ APRF => {
1264
+ Name => 'AudioProfile',
1265
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioProf' },
1266
+ },
1267
+ VPRF => {
1268
+ Name => 'VideoProfile',
1269
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoProf' },
1270
+ },
1271
+ OLYM => { #PH
1272
+ Name => 'OlympusOLYM',
1273
+ SubDirectory => {
1274
+ TagTable => 'Image::ExifTool::Olympus::OLYM',
1275
+ ByteOrder => 'BigEndian',
1276
+ },
1277
+ },
1278
+ );
1279
+
1280
+ # FPRF atom information (ref 11)
1281
+ %Image::ExifTool::QuickTime::FileProf = (
1282
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1283
+ GROUPS => { 2 => 'Video' },
1284
+ FORMAT => 'int32u',
1285
+ 0 => { Name => 'FileProfileVersion', Unknown => 1 }, # unknown = uninteresting
1286
+ 1 => {
1287
+ Name => 'FileFunctionFlags',
1288
+ PrintConv => { BITMASK => {
1289
+ 28 => 'Fragmented',
1290
+ 29 => 'Additional tracks',
1291
+ 30 => 'Edited', # (main AV track is edited)
1292
+ }},
1293
+ },
1294
+ # 2 - reserved
1295
+ );
1296
+
1297
+ # APRF atom information (ref 11)
1298
+ %Image::ExifTool::QuickTime::AudioProf = (
1299
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1300
+ GROUPS => { 2 => 'Audio' },
1301
+ FORMAT => 'int32u',
1302
+ 0 => { Name => 'AudioProfileVersion', Unknown => 1 },
1303
+ 1 => 'AudioTrackID',
1304
+ 2 => {
1305
+ Name => 'AudioCodec',
1306
+ Format => 'undef[4]',
1307
+ },
1308
+ 3 => {
1309
+ Name => 'AudioCodecInfo',
1310
+ Unknown => 1,
1311
+ PrintConv => 'sprintf("0x%.4x", $val)',
1312
+ },
1313
+ 4 => {
1314
+ Name => 'AudioAttributes',
1315
+ PrintConv => { BITMASK => {
1316
+ 0 => 'Encrypted',
1317
+ 1 => 'Variable bitrate',
1318
+ 2 => 'Dual mono',
1319
+ }},
1320
+ },
1321
+ 5 => {
1322
+ Name => 'AudioAvgBitrate',
1323
+ ValueConv => '$val * 1000',
1324
+ PrintConv => 'ConvertBitrate($val)',
1325
+ },
1326
+ 6 => {
1327
+ Name => 'AudioMaxBitrate',
1328
+ ValueConv => '$val * 1000',
1329
+ PrintConv => 'ConvertBitrate($val)',
1330
+ },
1331
+ 7 => 'AudioSampleRate',
1332
+ 8 => 'AudioChannels',
1333
+ );
1334
+
1335
+ # VPRF atom information (ref 11)
1336
+ %Image::ExifTool::QuickTime::VideoProf = (
1337
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1338
+ GROUPS => { 2 => 'Video' },
1339
+ FORMAT => 'int32u',
1340
+ 0 => { Name => 'VideoProfileVersion', Unknown => 1 },
1341
+ 1 => 'VideoTrackID',
1342
+ 2 => {
1343
+ Name => 'VideoCodec',
1344
+ Format => 'undef[4]',
1345
+ },
1346
+ 3 => {
1347
+ Name => 'VideoCodecInfo',
1348
+ Unknown => 1,
1349
+ PrintConv => 'sprintf("0x%.4x", $val)',
1350
+ },
1351
+ 4 => {
1352
+ Name => 'VideoAttributes',
1353
+ PrintConv => { BITMASK => {
1354
+ 0 => 'Encrypted',
1355
+ 1 => 'Variable bitrate',
1356
+ 2 => 'Variable frame rate',
1357
+ 3 => 'Interlaced',
1358
+ }},
1359
+ },
1360
+ 5 => {
1361
+ Name => 'VideoAvgBitrate',
1362
+ ValueConv => '$val * 1000',
1363
+ PrintConv => 'ConvertBitrate($val)',
1364
+ },
1365
+ 6 => {
1366
+ Name => 'VideoMaxBitrate',
1367
+ ValueConv => '$val * 1000',
1368
+ PrintConv => 'ConvertBitrate($val)',
1369
+ },
1370
+ 7 => {
1371
+ Name => 'VideoAvgFrameRate',
1372
+ Format => 'fixed32u',
1373
+ PrintConv => 'int($val * 1000 + 0.5) / 1000',
1374
+ },
1375
+ 8 => {
1376
+ Name => 'VideoMaxFrameRate',
1377
+ Format => 'fixed32u',
1378
+ PrintConv => 'int($val * 1000 + 0.5) / 1000',
1379
+ },
1380
+ 9 => {
1381
+ Name => 'VideoSize',
1382
+ Format => 'int16u[2]',
1383
+ PrintConv => '$val=~tr/ /x/; $val',
1384
+ },
1385
+ 10 => {
1386
+ Name => 'PixelAspectRatio',
1387
+ Format => 'int16u[2]',
1388
+ PrintConv => '$val=~tr/ /:/; $val',
1389
+ },
1390
+ );
1391
+
1392
+ # meta atoms
1393
+ %Image::ExifTool::QuickTime::Meta = (
1394
+ PROCESS_PROC => \&ProcessMOV,
1395
+ GROUPS => { 2 => 'Video' },
1396
+ ilst => {
1397
+ Name => 'ItemList',
1398
+ SubDirectory => {
1399
+ TagTable => 'Image::ExifTool::QuickTime::ItemList',
1400
+ HasData => 1, # process atoms as containers with 'data' elements
1401
+ },
1402
+ },
1403
+ # MP4 tags (ref 5)
1404
+ hdlr => {
1405
+ Name => 'Handler',
1406
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
1407
+ },
1408
+ dinf => {
1409
+ Name => 'DataInformation',
1410
+ Flags => ['Binary','Unknown'],
1411
+ },
1412
+ ipmc => {
1413
+ Name => 'IPMPControl',
1414
+ Flags => ['Binary','Unknown'],
1415
+ },
1416
+ iloc => {
1417
+ Name => 'ItemLocation',
1418
+ Flags => ['Binary','Unknown'],
1419
+ },
1420
+ ipro => {
1421
+ Name => 'ItemProtection',
1422
+ Flags => ['Binary','Unknown'],
1423
+ },
1424
+ iinf => {
1425
+ Name => 'ItemInformation',
1426
+ Flags => ['Binary','Unknown'],
1427
+ },
1428
+ 'xml ' => {
1429
+ Name => 'XML',
1430
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
1431
+ },
1432
+ 'keys' => {
1433
+ Name => 'Keys',
1434
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Keys' },
1435
+ },
1436
+ bxml => {
1437
+ Name => 'BinaryXML',
1438
+ Flags => ['Binary','Unknown'],
1439
+ },
1440
+ pitm => {
1441
+ Name => 'PrimaryItemReference',
1442
+ Flags => ['Binary','Unknown'],
1443
+ },
1444
+ free => { #PH
1445
+ Name => 'Free',
1446
+ Flags => ['Binary','Unknown'],
1447
+ },
1448
+ );
1449
+
1450
+ # track reference atoms
1451
+ %Image::ExifTool::QuickTime::TrackRef = (
1452
+ PROCESS_PROC => \&ProcessMOV,
1453
+ GROUPS => { 2 => 'Video' },
1454
+ chap => { Name => 'ChapterList', Format => 'int32u' },
1455
+ tmcd => { Name => 'TimeCode', Format => 'int32u' },
1456
+ # also: sync, scpt, ssrc, iTunesInfo
1457
+ );
1458
+
1459
+ # track aperture mode dimensions atoms
1460
+ # (ref https://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap2/qtff2.html)
1461
+ %Image::ExifTool::QuickTime::TrackAperture = (
1462
+ PROCESS_PROC => \&ProcessMOV,
1463
+ GROUPS => { 2 => 'Video' },
1464
+ clef => {
1465
+ Name => 'CleanApertureDimensions',
1466
+ Format => 'fixed32u',
1467
+ Count => 3,
1468
+ ValueConv => '$val =~ s/^.*? //; $val', # remove flags word
1469
+ PrintConv => '$val =~ tr/ /x/; $val',
1470
+ },
1471
+ prof => {
1472
+ Name => 'ProductionApertureDimensions',
1473
+ Format => 'fixed32u',
1474
+ Count => 3,
1475
+ ValueConv => '$val =~ s/^.*? //; $val',
1476
+ PrintConv => '$val =~ tr/ /x/; $val',
1477
+ },
1478
+ enof => {
1479
+ Name => 'EncodedPixelsDimensions',
1480
+ Format => 'fixed32u',
1481
+ Count => 3,
1482
+ ValueConv => '$val =~ s/^.*? //; $val',
1483
+ PrintConv => '$val =~ tr/ /x/; $val',
1484
+ },
1485
+ );
1486
+
1487
+ # item list atoms
1488
+ # -> these atoms are unique, and contain one or more 'data' atoms
1489
+ %Image::ExifTool::QuickTime::ItemList = (
1490
+ PROCESS_PROC => \&ProcessMOV,
1491
+ GROUPS => { 2 => 'Audio' },
1492
+ NOTES => q{
1493
+ As well as these tags, the 'mdta' handler uses numerical tag ID's which are
1494
+ added dynamically to this table after processing the Meta Keys information.
1495
+ },
1496
+ # in this table, binary 1 and 2-byte "data"-type tags are interpreted as
1497
+ # int8u and int16u. Multi-byte binary "data" tags are extracted as binary data
1498
+ "\xa9ART" => 'Artist',
1499
+ "\xa9alb" => 'Album',
1500
+ "\xa9cmt" => 'Comment',
1501
+ "\xa9com" => 'Composer',
1502
+ "\xa9day" => { Name => 'Year', Groups => { 2 => 'Time' } },
1503
+ "\xa9des" => 'Description', #4
1504
+ "\xa9enc" => 'EncodedBy', #10
1505
+ "\xa9gen" => 'Genre',
1506
+ "\xa9grp" => 'Grouping',
1507
+ "\xa9lyr" => 'Lyrics',
1508
+ "\xa9nam" => 'Title',
1509
+ # "\xa9st3" ? #10
1510
+ "\xa9too" => 'Encoder',
1511
+ "\xa9trk" => 'Track',
1512
+ "\xa9wrt" => 'Composer',
1513
+ '----' => {
1514
+ Name => 'iTunesInfo',
1515
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::iTunesInfo' },
1516
+ },
1517
+ aART => 'AlbumArtist',
1518
+ covr => 'CoverArt',
1519
+ cpil => { #10
1520
+ Name => 'Compilation',
1521
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
1522
+ },
1523
+ disk => {
1524
+ Name => 'DiskNumber',
1525
+ Format => 'undef', # (necessary to prevent decoding as string!)
1526
+ ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
1527
+ },
1528
+ pgap => { #10
1529
+ Name => 'PlayGap',
1530
+ PrintConv => {
1531
+ 0 => 'Insert Gap',
1532
+ 1 => 'No Gap',
1533
+ },
1534
+ },
1535
+ tmpo => {
1536
+ Name => 'BeatsPerMinute',
1537
+ Format => 'int16u', # marked as boolean but really int16u in my sample
1538
+ },
1539
+ trkn => {
1540
+ Name => 'TrackNumber',
1541
+ Format => 'undef', # (necessary to prevent decoding as string!)
1542
+ ValueConv => 'length($val) >= 6 ? join(" of ",unpack("x2nn",$val)) : \$val',
1543
+ },
1544
+ #
1545
+ # Note: it is possible that the tags below are not being decoded properly
1546
+ # because I don't have samples to verify many of these - PH
1547
+ #
1548
+ akID => { #10
1549
+ Name => 'AppleStoreAccountType',
1550
+ PrintConv => {
1551
+ 0 => 'iTunes',
1552
+ 1 => 'AOL',
1553
+ },
1554
+ },
1555
+ albm => 'Album', #(ffmpeg source)
1556
+ apID => 'AppleStoreAccount',
1557
+ atID => { #10 (or TV series)
1558
+ Name => 'AlbumTitleID',
1559
+ Format => 'int32u',
1560
+ },
1561
+ auth => { Name => 'Author', Groups => { 2 => 'Author' } },
1562
+ catg => 'Category', #7
1563
+ cnID => { #10
1564
+ Name => 'AppleStoreCatalogID',
1565
+ Format => 'int32u',
1566
+ },
1567
+ cprt => { Name => 'Copyright', Groups => { 2 => 'Author' } },
1568
+ dscp => 'Description',
1569
+ desc => 'Description', #7
1570
+ gnre => { #10
1571
+ Name => 'Genre',
1572
+ PrintConv => q{
1573
+ return $val unless $val =~ /^\d+$/;
1574
+ require Image::ExifTool::ID3;
1575
+ Image::ExifTool::ID3::PrintGenre($val - 1); # note the "- 1"
1576
+ },
1577
+ },
1578
+ egid => 'EpisodeGlobalUniqueID', #7
1579
+ geID => { #10
1580
+ Name => 'GenreID',
1581
+ Format => 'int32u',
1582
+ # 4005 = Kids
1583
+ # 4010 = Teens
1584
+ },
1585
+ grup => 'Grouping', #10
1586
+ hdvd => { #10
1587
+ Name => 'HDVideo',
1588
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
1589
+ },
1590
+ keyw => 'Keyword', #7
1591
+ ldes => 'LongDescription', #10
1592
+ pcst => { #7
1593
+ Name => 'Podcast',
1594
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
1595
+ },
1596
+ perf => 'Performer',
1597
+ plID => { #10 (or TV season)
1598
+ Name => 'PlayListID',
1599
+ Format => 'int8u', # actually int64u, but split it up
1600
+ },
1601
+ purd => 'PurchaseDate', #7
1602
+ purl => 'PodcastURL', #7
1603
+ rtng => { #10
1604
+ Name => 'Rating',
1605
+ PrintConv => {
1606
+ 0 => 'none',
1607
+ 2 => 'Clean',
1608
+ 4 => 'Explicit',
1609
+ },
1610
+ },
1611
+ sfID => { #10
1612
+ Name => 'AppleStoreCountry',
1613
+ Format => 'int32u',
1614
+ PrintConvColumns => 2,
1615
+ PrintConv => {
1616
+ 143460 => 'Australia',
1617
+ 143445 => 'Austria',
1618
+ 143446 => 'Belgium',
1619
+ 143455 => 'Canada',
1620
+ 143458 => 'Denmark',
1621
+ 143447 => 'Finland',
1622
+ 143442 => 'France',
1623
+ 143443 => 'Germany',
1624
+ 143448 => 'Greece',
1625
+ 143449 => 'Ireland',
1626
+ 143450 => 'Italy',
1627
+ 143462 => 'Japan',
1628
+ 143451 => 'Luxembourg',
1629
+ 143452 => 'Netherlands',
1630
+ 143461 => 'New Zealand',
1631
+ 143457 => 'Norway',
1632
+ 143453 => 'Portugal',
1633
+ 143454 => 'Spain',
1634
+ 143456 => 'Sweden',
1635
+ 143459 => 'Switzerland',
1636
+ 143444 => 'United Kingdom',
1637
+ 143441 => 'United States',
1638
+ },
1639
+ },
1640
+ soaa => 'SortAlbumArtist', #10
1641
+ soal => 'SortAlbum', #10
1642
+ soar => 'SortArtist', #10
1643
+ soco => 'SortComposer', #10
1644
+ sonm => 'SortName', #10
1645
+ sosn => 'SortShow', #10
1646
+ stik => { #10
1647
+ Name => 'MediaType',
1648
+ PrintConvColumns => 2,
1649
+ PrintConv => { #(http://weblog.xanga.com/gryphondwb/615474010/iphone-ringtones---what-did-itunes-741-really-do.html)
1650
+ 0 => 'Movie',
1651
+ 1 => 'Normal (Music)',
1652
+ 2 => 'Audiobook',
1653
+ 5 => 'Whacked Bookmark',
1654
+ 6 => 'Music Video',
1655
+ 9 => 'Short Film',
1656
+ 10 => 'TV Show',
1657
+ 11 => 'Booklet',
1658
+ 14 => 'Ringtone',
1659
+ 21 => 'Podcast', #15
1660
+ },
1661
+ },
1662
+ titl => 'Title',
1663
+ tven => 'TVEpisodeID', #7
1664
+ tves => { #7/10
1665
+ Name => 'TVEpisode',
1666
+ Format => 'int32u',
1667
+ },
1668
+ tvnn => 'TVNetworkName', #7
1669
+ tvsh => 'TVShow', #10
1670
+ tvsn => { #7/10
1671
+ Name => 'TVSeason',
1672
+ Format => 'int32u',
1673
+ },
1674
+ yrrc => 'Year', #(ffmpeg source)
1675
+ itnu => { #PH (iTunes 10.5)
1676
+ Name => 'iTunesU',
1677
+ Description => 'iTunes U',
1678
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
1679
+ },
1680
+ );
1681
+
1682
+ # item list keys (ref PH)
1683
+ %Image::ExifTool::QuickTime::Keys = (
1684
+ PROCESS_PROC => \&Image::ExifTool::QuickTime::ProcessKeys,
1685
+ VARS => { LONG_TAGS => 1 },
1686
+ NOTES => q{
1687
+ This directory contains a list of key names which are used to decode
1688
+ ItemList tags written by the "mdta" handler. The prefix of
1689
+ "com.apple.quicktime." has been removed from all TagID's below.
1690
+ },
1691
+ version => 'Version',
1692
+ album => 'Album',
1693
+ artist => { },
1694
+ artwork => { },
1695
+ author => { Name => 'Author', Groups => { 2 => 'Author' } },
1696
+ comment => { },
1697
+ copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
1698
+ creationdate=> {
1699
+ Name => 'CreationDate',
1700
+ Groups => { 2 => 'Time' },
1701
+ ValueConv => q{
1702
+ require Image::ExifTool::XMP;
1703
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val,1);
1704
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
1705
+ return $val;
1706
+ },
1707
+ PrintConv => '$self->ConvertDateTime($val)',
1708
+ },
1709
+ description => { },
1710
+ director => { },
1711
+ genre => { },
1712
+ information => { },
1713
+ keywords => { },
1714
+ make => { Name => 'Make', Groups => { 2 => 'Camera' } },
1715
+ model => { Name => 'Model', Groups => { 2 => 'Camera' } },
1716
+ publisher => { },
1717
+ software => { },
1718
+ year => { Groups => { 2 => 'Time' } },
1719
+ 'camera.identifier' => 'CameraIdentifier', # (iPhone 4)
1720
+ 'camera.framereadouttimeinmicroseconds' => { # (iPhone 4)
1721
+ Name => 'FrameReadoutTime',
1722
+ ValueConv => '$val * 1e-6',
1723
+ PrintConv => '$val * 1e6 . " microseconds"',
1724
+ },
1725
+ 'location.ISO6709' => {
1726
+ Name => 'GPSCoordinates',
1727
+ Groups => { 2 => 'Location' },
1728
+ ValueConv => \&ConvertISO6709,
1729
+ PrintConv => \&PrintGPSCoordinates,
1730
+ },
1731
+ 'location.name' => { Name => 'LocationName', Groups => { 2 => 'Location' } },
1732
+ 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
1733
+ 'location.note' => { Name => 'LocationNote', Groups => { 2 => 'Location' } },
1734
+ 'location.role' => {
1735
+ Name => 'LocationRole',
1736
+ Groups => { 2 => 'Location' },
1737
+ PrintConv => {
1738
+ 0 => 'Shooting Location',
1739
+ 1 => 'Real Location',
1740
+ 2 => 'Fictional Location',
1741
+ },
1742
+ },
1743
+ 'location.date' => {
1744
+ Name => 'LocationDate',
1745
+ Groups => { 2 => 'Time' },
1746
+ ValueConv => q{
1747
+ require Image::ExifTool::XMP;
1748
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
1749
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
1750
+ return $val;
1751
+ },
1752
+ PrintConv => '$self->ConvertDateTime($val)',
1753
+ },
1754
+ 'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } },
1755
+ 'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } },
1756
+ 'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
1757
+ 'player.version' => 'PlayerVersion',
1758
+ 'player.movie.visual.brightness'=> 'Brightness',
1759
+ 'player.movie.visual.color' => 'Color',
1760
+ 'player.movie.visual.tint' => 'Tint',
1761
+ 'player.movie.visual.contrast' => 'Contrast',
1762
+ 'player.movie.audio.gain' => 'AudioGain',
1763
+ 'player.movie.audio.treble' => 'Trebel',
1764
+ 'player.movie.audio.bass' => 'Bass',
1765
+ 'player.movie.audio.balance' => 'Balance',
1766
+ 'player.movie.audio.pitchshift' => 'PitchShift',
1767
+ 'player.movie.audio.mute' => {
1768
+ Name => 'Mute',
1769
+ Format => 'int8u',
1770
+ PrintConv => { 0 => 'Off', 1 => 'On' },
1771
+ },
1772
+ 'rating.user' => 'UserRating', # (Canon ELPH 510 HS)
1773
+ 'Encoded_With' => 'EncodedWith',
1774
+ );
1775
+
1776
+ # iTunes info ('----') atoms
1777
+ %Image::ExifTool::QuickTime::iTunesInfo = (
1778
+ PROCESS_PROC => \&ProcessMOV,
1779
+ GROUPS => { 2 => 'Audio' },
1780
+ NOTES => q{
1781
+ ExifTool will extract any iTunesInfo tags that exist, even if they are not
1782
+ defined in this table.
1783
+ },
1784
+ # 'mean'/'name'/'data' atoms form a triplet, but unfortunately
1785
+ # I haven't been able to find any documentation on this.
1786
+ # 'mean' is normally 'com.apple.iTunes'
1787
+ mean => {
1788
+ Name => 'Mean',
1789
+ # the 'Triplet' flag tells ProcessMOV() to generate
1790
+ # a single tag from the mean/name/data triplet
1791
+ Triplet => 1,
1792
+ Hidden => 1,
1793
+ },
1794
+ name => {
1795
+ Name => 'Name',
1796
+ Triplet => 1,
1797
+ Hidden => 1,
1798
+ },
1799
+ data => {
1800
+ Name => 'Data',
1801
+ Triplet => 1,
1802
+ Hidden => 1,
1803
+ },
1804
+ # the tag ID's below are composed from "mean/name",
1805
+ # but "mean/" is omitted if it is "com.apple.iTunes/":
1806
+ 'iTunMOVI' => {
1807
+ Name => 'iTunMOVI',
1808
+ SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
1809
+ },
1810
+ 'tool' => {
1811
+ Name => 'iTunTool',
1812
+ Description => 'iTunTool',
1813
+ Format => 'int32u',
1814
+ PrintConv => 'sprintf("0x%.8x",$val)',
1815
+ },
1816
+ 'iTunEXTC' => {
1817
+ Name => 'ContentRating',
1818
+ Notes => 'standard | rating | score | reasons',
1819
+ # ie. 'us-tv|TV-14|500|V', 'mpaa|PG-13|300|For violence and sexuality'
1820
+ # (see http://shadowofged.blogspot.ca/2008/06/itunes-content-ratings.html)
1821
+ },
1822
+ 'iTunNORM' => {
1823
+ Name => 'VolumeNormalization',
1824
+ PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val',
1825
+ },
1826
+ 'iTunSMPB' => {
1827
+ Name => 'iTunSMPB',
1828
+ Description => 'iTunSMPB',
1829
+ # hex format, similar to iTunNORM, but 12 words instead of 10,
1830
+ # and 4th word is 16 hex digits (all others are 8)
1831
+ # (gives AAC encoder delay, ref http://code.google.com/p/l-smash/issues/detail?id=1)
1832
+ PrintConv => '$val=~s/ 0+(\w)/ $1/g; $val=~s/^\s+//; $val',
1833
+ },
1834
+ # (CDDB = Compact Disc DataBase)
1835
+ # iTunes_CDDB_1 = <CDDB1 disk ID>+<# tracks>+<logical block address for each track>...
1836
+ 'iTunes_CDDB_1' => 'CDDB1Info',
1837
+ 'iTunes_CDDB_TrackNumber' => 'CDDBTrackNumber',
1838
+ 'Encoding Params' => {
1839
+ Name => 'EncodingParams',
1840
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::EncodingParams' },
1841
+ }
1842
+ # also heard about 'iTunPGAP', but I haven't seen a sample
1843
+ );
1844
+
1845
+ # iTunes audio encoding parameters
1846
+ # ref https://developer.apple.com/library/mac/#documentation/MusicAudio/Reference/AudioCodecServicesRef/Reference/reference.html
1847
+ %Image::ExifTool::QuickTime::EncodingParams = (
1848
+ PROCESS_PROC => \&ProcessEncodingParams,
1849
+ GROUPS => { 2 => 'Audio' },
1850
+ # (I have commented out the ones that don't have integer values because they
1851
+ # probably don't appear, and definitly wouldn't work with current decoding - PH)
1852
+
1853
+ # global codec properties
1854
+ #'lnam' => 'AudioCodecName',
1855
+ #'lmak' => 'AudioCodecManufacturer',
1856
+ #'lfor' => 'AudioCodecFormat',
1857
+ 'vpk?' => 'AudioHasVariablePacketByteSizes',
1858
+ #'ifm#' => 'AudioSupportedInputFormats',
1859
+ #'ofm#' => 'AudioSupportedOutputFormats',
1860
+ #'aisr' => 'AudioAvailableInputSampleRates',
1861
+ #'aosr' => 'AudioAvailableOutputSampleRates',
1862
+ 'abrt' => 'AudioAvailableBitRateRange',
1863
+ 'mnip' => 'AudioMinimumNumberInputPackets',
1864
+ 'mnop' => 'AudioMinimumNumberOutputPackets',
1865
+ 'cmnc' => 'AudioAvailableNumberChannels',
1866
+ 'lmrc' => 'AudioDoesSampleRateConversion',
1867
+ #'aicl' => 'AudioAvailableInputChannelLayoutTags',
1868
+ #'aocl' => 'AudioAvailableOutputChannelLayoutTags',
1869
+ #'if4o' => 'AudioInputFormatsForOutputFormat',
1870
+ #'of4i' => 'AudioOutputFormatsForInputFormat',
1871
+ #'acfi' => 'AudioFormatInfo',
1872
+
1873
+ # instance codec properties
1874
+ 'tbuf' => 'AudioInputBufferSize',
1875
+ 'pakf' => 'AudioPacketFrameSize',
1876
+ 'pakb' => 'AudioMaximumPacketByteSize',
1877
+ #'ifmt' => 'AudioCurrentInputFormat',
1878
+ #'ofmt' => 'AudioCurrentOutputFormat',
1879
+ #'kuki' => 'AudioMagicCookie',
1880
+ 'ubuf' => 'AudioUsedInputBufferSize',
1881
+ 'init' => 'AudioIsInitialized',
1882
+ 'brat' => 'AudioCurrentTargetBitRate',
1883
+ #'cisr' => 'AudioCurrentInputSampleRate',
1884
+ #'cosr' => 'AudioCurrentOutputSampleRate',
1885
+ 'srcq' => 'AudioQualitySetting',
1886
+ #'brta' => 'AudioApplicableBitRateRange',
1887
+ #'isra' => 'AudioApplicableInputSampleRates',
1888
+ #'osra' => 'AudioApplicableOutputSampleRates',
1889
+ 'pad0' => 'AudioZeroFramesPadded',
1890
+ 'prmm' => 'AudioCodecPrimeMethod',
1891
+ #'prim' => 'AudioCodecPrimeInfo',
1892
+ #'icl ' => 'AudioInputChannelLayout',
1893
+ #'ocl ' => 'AudioOutputChannelLayout',
1894
+ #'acs ' => 'AudioCodecSettings',
1895
+ #'acfl' => 'AudioCodecFormatList',
1896
+ 'acbf' => 'AudioBitRateControlMode',
1897
+ 'vbrq' => 'AudioVBRQuality',
1898
+ 'mdel' => 'AudioMinimumDelayMode',
1899
+
1900
+ # deprecated
1901
+ 'pakd' => 'AudioRequiresPacketDescription',
1902
+ #'brt#' => 'AudioAvailableBitRates',
1903
+ 'acef' => 'AudioExtendFrequencies',
1904
+ 'ursr' => 'AudioUseRecommendedSampleRate',
1905
+ 'oppr' => 'AudioOutputPrecedence',
1906
+ #'loud' => 'AudioCurrentLoudnessStatistics',
1907
+
1908
+ # others
1909
+ 'vers' => 'AudioEncodingParamsVersion', #PH
1910
+ 'cdcv' => { #PH
1911
+ Name => 'AudioComponentVersion',
1912
+ ValueConv => 'join ".", unpack("ncc", pack("N",$val))',
1913
+ },
1914
+ );
1915
+
1916
+ # print to video data block
1917
+ %Image::ExifTool::QuickTime::Video = (
1918
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1919
+ GROUPS => { 2 => 'Video' },
1920
+ 0 => {
1921
+ Name => 'DisplaySize',
1922
+ PrintConv => {
1923
+ 0 => 'Normal',
1924
+ 1 => 'Double Size',
1925
+ 2 => 'Half Size',
1926
+ 3 => 'Full Screen',
1927
+ 4 => 'Current Size',
1928
+ },
1929
+ },
1930
+ 6 => {
1931
+ Name => 'SlideShow',
1932
+ PrintConv => {
1933
+ 0 => 'No',
1934
+ 1 => 'Yes',
1935
+ },
1936
+ },
1937
+ );
1938
+
1939
+ # 'hnti' atoms
1940
+ %Image::ExifTool::QuickTime::HintInfo = (
1941
+ PROCESS_PROC => \&ProcessMOV,
1942
+ GROUPS => { 2 => 'Video' },
1943
+ 'rtp ' => {
1944
+ Name => 'RealtimeStreamingProtocol',
1945
+ PrintConv => '$val=~s/^sdp /(SDP) /; $val',
1946
+ },
1947
+ 'sdp ' => 'StreamingDataProtocol',
1948
+ );
1949
+
1950
+ # 'hinf' atoms
1951
+ %Image::ExifTool::QuickTime::HintTrackInfo = (
1952
+ PROCESS_PROC => \&ProcessMOV,
1953
+ GROUPS => { 2 => 'Video' },
1954
+ trpY => { Name => 'TotalBytes', Format => 'int64u' }, #(documented)
1955
+ trpy => { Name => 'TotalBytes', Format => 'int64u' }, #(observed)
1956
+ totl => { Name => 'TotalBytes', Format => 'int32u' },
1957
+ nump => { Name => 'NumPackets', Format => 'int64u' },
1958
+ npck => { Name => 'NumPackets', Format => 'int32u' },
1959
+ tpyl => { Name => 'TotalBytesNoRTPHeaders', Format => 'int64u' },
1960
+ tpaY => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(documented)
1961
+ tpay => { Name => 'TotalBytesNoRTPHeaders', Format => 'int32u' }, #(observed)
1962
+ maxr => {
1963
+ Name => 'MaxDataRate',
1964
+ Format => 'int32u',
1965
+ Count => 2,
1966
+ PrintConv => 'my @a=split(" ",$val);sprintf("%d bytes in %.3f s",$a[1],$a[0]/1000)',
1967
+ },
1968
+ dmed => { Name => 'MediaTrackBytes', Format => 'int64u' },
1969
+ dimm => { Name => 'ImmediateDataBytes', Format => 'int64u' },
1970
+ drep => { Name => 'RepeatedDataBytes', Format => 'int64u' },
1971
+ tmin => {
1972
+ Name => 'MinTransmissionTime',
1973
+ Format => 'int32u',
1974
+ PrintConv => 'sprintf("%.3f s",$val/1000)',
1975
+ },
1976
+ tmax => {
1977
+ Name => 'MaxTransmissionTime',
1978
+ Format => 'int32u',
1979
+ PrintConv => 'sprintf("%.3f s",$val/1000)',
1980
+ },
1981
+ pmax => { Name => 'LargestPacketSize', Format => 'int32u' },
1982
+ dmax => {
1983
+ Name => 'LargestPacketDuration',
1984
+ Format => 'int32u',
1985
+ PrintConv => 'sprintf("%.3f s",$val/1000)',
1986
+ },
1987
+ payt => {
1988
+ Name => 'PayloadType',
1989
+ Format => 'undef', # (necessary to prevent decoding as string!)
1990
+ ValueConv => 'unpack("N",$val) . " " . substr($val, 5)',
1991
+ PrintConv => '$val=~s/ /, /;$val',
1992
+ },
1993
+ );
1994
+
1995
+ # MP4 media box (ref 5)
1996
+ %Image::ExifTool::QuickTime::Media = (
1997
+ PROCESS_PROC => \&ProcessMOV,
1998
+ GROUPS => { 2 => 'Video' },
1999
+ NOTES => 'MP4 media box.',
2000
+ mdhd => {
2001
+ Name => 'MediaHeader',
2002
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaHeader' },
2003
+ },
2004
+ hdlr => {
2005
+ Name => 'Handler',
2006
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
2007
+ },
2008
+ minf => {
2009
+ Name => 'MediaInfo',
2010
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' },
2011
+ },
2012
+ );
2013
+
2014
+ # MP4 media header box (ref 5)
2015
+ %Image::ExifTool::QuickTime::MediaHeader = (
2016
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2017
+ GROUPS => { 2 => 'Video' },
2018
+ FORMAT => 'int32u',
2019
+ 0 => {
2020
+ Name => 'MediaHeaderVersion',
2021
+ RawConv => '$$self{MediaHeaderVersion} = $val',
2022
+ },
2023
+ 1 => {
2024
+ Name => 'MediaCreateDate',
2025
+ Groups => { 2 => 'Time' },
2026
+ %timeInfo,
2027
+ # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
2028
+ Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
2029
+ },
2030
+ 2 => {
2031
+ Name => 'MediaModifyDate',
2032
+ Groups => { 2 => 'Time' },
2033
+ %timeInfo,
2034
+ # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
2035
+ Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
2036
+ },
2037
+ 3 => {
2038
+ Name => 'MediaTimeScale',
2039
+ RawConv => '$$self{MediaTS} = $val',
2040
+ },
2041
+ 4 => {
2042
+ Name => 'MediaDuration',
2043
+ RawConv => '$$self{MediaTS} ? $val / $$self{MediaTS} : $val',
2044
+ PrintConv => '$$self{MediaTS} ? ConvertDuration($val) : $val',
2045
+ # this is int64u if MediaHeaderVersion == 1 (ref 5/13)
2046
+ Hook => '$$self{MediaHeaderVersion} and $format = "int64u", $varSize += 4',
2047
+ },
2048
+ 5 => {
2049
+ Name => 'MediaLanguageCode',
2050
+ Format => 'int16u',
2051
+ RawConv => '$val ? $val : undef',
2052
+ # allow both Macintosh (for MOV files) and ISO (for MP4 files) language codes
2053
+ ValueConv => '$val < 0x400 ? $val : pack "C*", map { (($val>>$_)&0x1f)+0x60 } 10, 5, 0',
2054
+ PrintConv => q{
2055
+ return $val unless $val =~ /^\d+$/;
2056
+ require Image::ExifTool::Font;
2057
+ return $Image::ExifTool::Font::ttLang{Macintosh}{$val} || "Unknown ($val)";
2058
+ },
2059
+ },
2060
+ );
2061
+
2062
+ # MP4 media information box (ref 5)
2063
+ %Image::ExifTool::QuickTime::MediaInfo = (
2064
+ PROCESS_PROC => \&ProcessMOV,
2065
+ GROUPS => { 2 => 'Video' },
2066
+ NOTES => 'MP4 media info box.',
2067
+ vmhd => {
2068
+ Name => 'VideoHeader',
2069
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::VideoHeader' },
2070
+ },
2071
+ smhd => {
2072
+ Name => 'AudioHeader',
2073
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::AudioHeader' },
2074
+ },
2075
+ hmhd => {
2076
+ Name => 'HintHeader',
2077
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HintHeader' },
2078
+ },
2079
+ nmhd => {
2080
+ Name => 'NullMediaHeader',
2081
+ Flags => ['Binary','Unknown'],
2082
+ },
2083
+ dinf => {
2084
+ Name => 'DataInfo',
2085
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::DataInfo' },
2086
+ },
2087
+ gmhd => {
2088
+ Name => 'GenMediaHeader',
2089
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaHeader' },
2090
+ },
2091
+ hdlr => { #PH
2092
+ Name => 'Handler',
2093
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Handler' },
2094
+ },
2095
+ stbl => {
2096
+ Name => 'SampleTable',
2097
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SampleTable' },
2098
+ },
2099
+ );
2100
+
2101
+ # MP4 video media header (ref 5)
2102
+ %Image::ExifTool::QuickTime::VideoHeader = (
2103
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2104
+ GROUPS => { 2 => 'Video' },
2105
+ NOTES => 'MP4 video media header.',
2106
+ FORMAT => 'int16u',
2107
+ 2 => {
2108
+ Name => 'GraphicsMode',
2109
+ PrintHex => 1,
2110
+ SeparateTable => 'GraphicsMode',
2111
+ PrintConv => \%graphicsMode,
2112
+ },
2113
+ 3 => { Name => 'OpColor', Format => 'int16u[3]' },
2114
+ );
2115
+
2116
+ # MP4 audio media header (ref 5)
2117
+ %Image::ExifTool::QuickTime::AudioHeader = (
2118
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2119
+ GROUPS => { 2 => 'Audio' },
2120
+ NOTES => 'MP4 audio media header.',
2121
+ FORMAT => 'int16u',
2122
+ 2 => { Name => 'Balance', Format => 'fixed16s' },
2123
+ );
2124
+
2125
+ # MP4 hint media header (ref 5)
2126
+ %Image::ExifTool::QuickTime::HintHeader = (
2127
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2128
+ NOTES => 'MP4 hint media header.',
2129
+ FORMAT => 'int16u',
2130
+ 2 => 'MaxPDUSize',
2131
+ 3 => 'AvgPDUSize',
2132
+ 4 => { Name => 'MaxBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
2133
+ 6 => { Name => 'AvgBitrate', Format => 'int32u', PrintConv => 'ConvertBitrate($val)' },
2134
+ );
2135
+
2136
+ # MP4 sample table box (ref 5)
2137
+ %Image::ExifTool::QuickTime::SampleTable = (
2138
+ PROCESS_PROC => \&ProcessMOV,
2139
+ GROUPS => { 2 => 'Video' },
2140
+ NOTES => 'MP4 sample table box.',
2141
+ stsd => [
2142
+ {
2143
+ Name => 'AudioSampleDesc',
2144
+ Condition => '$$self{HandlerType} and $$self{HandlerType} eq "soun"',
2145
+ SubDirectory => {
2146
+ TagTable => 'Image::ExifTool::QuickTime::AudioSampleDesc',
2147
+ Start => 8, # skip version number and count
2148
+ },
2149
+ },{
2150
+ Name => 'VideoSampleDesc',
2151
+ Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
2152
+ SubDirectory => {
2153
+ TagTable => 'Image::ExifTool::QuickTime::ImageDesc',
2154
+ Start => 8, # skip version number and count
2155
+ },
2156
+ },{
2157
+ Name => 'HintSampleDesc',
2158
+ Condition => '$$self{HandlerType} and $$self{HandlerType} eq "hint"',
2159
+ SubDirectory => {
2160
+ TagTable => 'Image::ExifTool::QuickTime::HintSampleDesc',
2161
+ Start => 8, # skip version number and count
2162
+ },
2163
+ },{
2164
+ Name => 'OtherSampleDesc',
2165
+ SubDirectory => {
2166
+ TagTable => 'Image::ExifTool::QuickTime::OtherSampleDesc',
2167
+ Start => 8, # skip version number and count
2168
+ },
2169
+ },
2170
+ # (Note: "alis" HandlerType handled by the parent audio or video handler)
2171
+ ],
2172
+ stts => [ # decoding time-to-sample table
2173
+ {
2174
+ Name => 'VideoFrameRate',
2175
+ Notes => 'average rate calculated from time-to-sample table for video media',
2176
+ Condition => '$$self{HandlerType} and $$self{HandlerType} eq "vide"',
2177
+ Format => 'undef', # (necessary to prevent decoding as string!)
2178
+ # (must be RawConv so appropriate MediaTS is used in calculation)
2179
+ RawConv => 'Image::ExifTool::QuickTime::CalcSampleRate($self, \$val)',
2180
+ PrintConv => 'int($val * 1000 + 0.5) / 1000',
2181
+ },
2182
+ {
2183
+ Name => 'TimeToSampleTable',
2184
+ Flags => ['Binary','Unknown'],
2185
+ },
2186
+ ],
2187
+ ctts => {
2188
+ Name => 'CompositionTimeToSample',
2189
+ Flags => ['Binary','Unknown'],
2190
+ },
2191
+ stsc => {
2192
+ Name => 'SampleToChunk',
2193
+ Flags => ['Binary','Unknown'],
2194
+ },
2195
+ stsz => {
2196
+ Name => 'SampleSizes',
2197
+ Flags => ['Binary','Unknown'],
2198
+ },
2199
+ stz2 => {
2200
+ Name => 'CompactSampleSizes',
2201
+ Flags => ['Binary','Unknown'],
2202
+ },
2203
+ stco => {
2204
+ Name => 'ChunkOffset',
2205
+ Flags => ['Binary','Unknown'],
2206
+ },
2207
+ co64 => {
2208
+ Name => 'ChunkOffset64',
2209
+ Flags => ['Binary','Unknown'],
2210
+ },
2211
+ stss => {
2212
+ Name => 'SyncSampleTable',
2213
+ Flags => ['Binary','Unknown'],
2214
+ },
2215
+ stsh => {
2216
+ Name => 'ShadowSyncSampleTable',
2217
+ Flags => ['Binary','Unknown'],
2218
+ },
2219
+ padb => {
2220
+ Name => 'SamplePaddingBits',
2221
+ Flags => ['Binary','Unknown'],
2222
+ },
2223
+ stdp => {
2224
+ Name => 'SampleDegradationPriority',
2225
+ Flags => ['Binary','Unknown'],
2226
+ },
2227
+ sdtp => {
2228
+ Name => 'IdependentAndDisposableSamples',
2229
+ Flags => ['Binary','Unknown'],
2230
+ },
2231
+ sbgp => {
2232
+ Name => 'SampleToGroup',
2233
+ Flags => ['Binary','Unknown'],
2234
+ },
2235
+ sgpd => {
2236
+ Name => 'SampleGroupDescription',
2237
+ Flags => ['Binary','Unknown'],
2238
+ },
2239
+ subs => {
2240
+ Name => 'Sub-sampleInformation',
2241
+ Flags => ['Binary','Unknown'],
2242
+ },
2243
+ cslg => {
2244
+ Name => 'CompositionToDecodeTimelineMapping',
2245
+ Flags => ['Binary','Unknown'],
2246
+ },
2247
+ );
2248
+
2249
+ # MP4 audio sample description box (ref 5)
2250
+ %Image::ExifTool::QuickTime::AudioSampleDesc = (
2251
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2252
+ GROUPS => { 2 => 'Audio' },
2253
+ FORMAT => 'int16u',
2254
+ NOTES => 'MP4 audio sample description.',
2255
+ 2 => {
2256
+ Name => 'AudioFormat',
2257
+ Format => 'undef[4]',
2258
+ RawConv => q{
2259
+ return undef unless $val =~ /^[\w ]{4}$/i;
2260
+ # check for protected audio format
2261
+ $self->OverrideFileType('M4P') if $val eq 'drms' and $$self{VALUE}{FileType} eq 'M4A';
2262
+ return $val;
2263
+ },
2264
+ },
2265
+ 10 => { #PH
2266
+ Name => 'AudioVendorID',
2267
+ Format => 'undef[4]',
2268
+ RawConv => '$val eq "\0\0\0\0" ? undef : $val',
2269
+ PrintConv => \%vendorID,
2270
+ SeparateTable => 'VendorID',
2271
+ },
2272
+ 12 => 'AudioChannels',
2273
+ 13 => 'AudioBitsPerSample',
2274
+ 16 => { Name => 'AudioSampleRate', Format => 'fixed32u' },
2275
+ 28 => { #PH
2276
+ Name => 'AudioFormat',
2277
+ Format => 'undef[4]',
2278
+ RawConv => '$val =~ /^[\w ]{4}$/i ? $val : undef',
2279
+ Notes => 'in Casio MOV videos',
2280
+ },
2281
+ );
2282
+
2283
+ # MP4 hint sample description box (ref 5)
2284
+ %Image::ExifTool::QuickTime::HintSampleDesc = (
2285
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2286
+ FORMAT => 'int16u',
2287
+ NOTES => 'MP4 hint sample description.',
2288
+ 2 => { Name => 'HintFormat', Format => 'undef[4]' },
2289
+ );
2290
+
2291
+ # MP4 generic sample description box
2292
+ %Image::ExifTool::QuickTime::OtherSampleDesc = (
2293
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2294
+ FORMAT => 'int16u',
2295
+ 2 => { Name => 'OtherFormat', Format => 'undef[4]' },
2296
+ );
2297
+
2298
+ # MP4 data information box (ref 5)
2299
+ %Image::ExifTool::QuickTime::DataInfo = (
2300
+ PROCESS_PROC => \&ProcessMOV,
2301
+ NOTES => 'MP4 data information box.',
2302
+ dref => {
2303
+ Name => 'DataRef',
2304
+ SubDirectory => {
2305
+ TagTable => 'Image::ExifTool::QuickTime::DataRef',
2306
+ Start => 8,
2307
+ },
2308
+ },
2309
+ );
2310
+
2311
+ # Generic media header
2312
+ %Image::ExifTool::QuickTime::GenMediaHeader = (
2313
+ PROCESS_PROC => \&ProcessMOV,
2314
+ gmin => {
2315
+ Name => 'GenMediaInfo',
2316
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::GenMediaInfo' },
2317
+ },
2318
+ text => {
2319
+ Name => 'Text',
2320
+ Flags => ['Binary','Unknown'],
2321
+ },
2322
+ tmcd => {
2323
+ Name => 'TimeCode',
2324
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TimeCode' },
2325
+ },
2326
+ );
2327
+
2328
+ # TimeCode header
2329
+ %Image::ExifTool::QuickTime::TimeCode = (
2330
+ PROCESS_PROC => \&ProcessMOV,
2331
+ tcmi => {
2332
+ Name => 'TCMediaInfo',
2333
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::TCMediaInfo' },
2334
+ },
2335
+ );
2336
+
2337
+ # TimeCode media info (ref 12)
2338
+ %Image::ExifTool::QuickTime::TCMediaInfo = (
2339
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2340
+ GROUPS => { 2 => 'Video' },
2341
+ 4 => {
2342
+ Name => 'TextFont',
2343
+ Format => 'int16u',
2344
+ PrintConv => { 0 => 'System' },
2345
+ },
2346
+ 6 => {
2347
+ Name => 'TextFace',
2348
+ Format => 'int16u',
2349
+ PrintConv => {
2350
+ 0 => 'Plain',
2351
+ BITMASK => {
2352
+ 0 => 'Bold',
2353
+ 1 => 'Italic',
2354
+ 2 => 'Underline',
2355
+ 3 => 'Outline',
2356
+ 4 => 'Shadow',
2357
+ 5 => 'Condense',
2358
+ 6 => 'Extend',
2359
+ },
2360
+ },
2361
+ },
2362
+ 8 => {
2363
+ Name => 'TextSize',
2364
+ Format => 'int16u',
2365
+ },
2366
+ 10 => {
2367
+ Name => 'TextColor',
2368
+ Format => 'int16u[3]',
2369
+ },
2370
+ 16 => {
2371
+ Name => 'BackgroundColor',
2372
+ Format => 'int16u[3]',
2373
+ },
2374
+ 22 => {
2375
+ Name => 'FontName',
2376
+ Format => 'pstring',
2377
+ ValueConv => '$self->Decode($val, $self->Options("CharsetQuickTime"))',
2378
+ },
2379
+ );
2380
+
2381
+ # Generic media info (ref http://sourceforge.jp/cvs/view/ntvrec/ntvrec/libqtime/gmin.h?view=co)
2382
+ %Image::ExifTool::QuickTime::GenMediaInfo = (
2383
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2384
+ GROUPS => { 2 => 'Video' },
2385
+ 0 => 'GenMediaVersion',
2386
+ 1 => { Name => 'GenFlags', Format => 'int8u[3]' },
2387
+ 4 => { Name => 'GenGraphicsMode',
2388
+ Format => 'int16u',
2389
+ PrintHex => 1,
2390
+ SeparateTable => 'GraphicsMode',
2391
+ PrintConv => \%graphicsMode,
2392
+ },
2393
+ 6 => { Name => 'GenOpColor', Format => 'int16u[3]' },
2394
+ 12 => { Name => 'GenBalance', Format => 'fixed16s' },
2395
+ );
2396
+
2397
+ # MP4 data reference box (ref 5)
2398
+ %Image::ExifTool::QuickTime::DataRef = (
2399
+ PROCESS_PROC => \&ProcessMOV,
2400
+ NOTES => 'MP4 data reference box.',
2401
+ 'url ' => {
2402
+ Name => 'URL',
2403
+ Format => 'undef', # (necessary to prevent decoding as string!)
2404
+ RawConv => q{
2405
+ # ignore if self-contained (flags bit 0 set)
2406
+ return undef if unpack("N",$val) & 0x01;
2407
+ $_ = substr($val,4); s/\0.*//s; $_;
2408
+ },
2409
+ },
2410
+ 'urn ' => {
2411
+ Name => 'URN',
2412
+ Format => 'undef', # (necessary to prevent decoding as string!)
2413
+ RawConv => q{
2414
+ return undef if unpack("N",$val) & 0x01;
2415
+ $_ = substr($val,4); s/\0.*//s; $_;
2416
+ },
2417
+ },
2418
+ );
2419
+
2420
+ # MP4 handler box (ref 5)
2421
+ %Image::ExifTool::QuickTime::Handler = (
2422
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2423
+ GROUPS => { 2 => 'Video' },
2424
+ 4 => { #PH
2425
+ Name => 'HandlerClass',
2426
+ Format => 'undef[4]',
2427
+ RawConv => '$val eq "\0\0\0\0" ? undef : $val',
2428
+ PrintConv => {
2429
+ mhlr => 'Media Handler',
2430
+ dhlr => 'Data Handler',
2431
+ },
2432
+ },
2433
+ 8 => {
2434
+ Name => 'HandlerType',
2435
+ Format => 'undef[4]',
2436
+ RawConv => '$$self{HandlerType} = $val unless $val eq "alis"; $val',
2437
+ PrintConvColumns => 2,
2438
+ PrintConv => {
2439
+ alis => 'Alias Data', #PH
2440
+ crsm => 'Clock Reference', #3
2441
+ hint => 'Hint Track',
2442
+ ipsm => 'IPMP', #3
2443
+ m7sm => 'MPEG-7 Stream', #3
2444
+ mdir => 'Metadata', #3
2445
+ mdta => 'Metadata Tags', #PH
2446
+ mjsm => 'MPEG-J', #3
2447
+ ocsm => 'Object Content', #3
2448
+ odsm => 'Object Descriptor', #3
2449
+ sdsm => 'Scene Description', #3
2450
+ soun => 'Audio Track',
2451
+ text => 'Text', #PH (but what type? subtitle?)
2452
+ tmcd => 'Time Code', #PH
2453
+ 'url '=> 'URL', #3
2454
+ vide => 'Video Track',
2455
+ },
2456
+ },
2457
+ 12 => { #PH
2458
+ Name => 'HandlerVendorID',
2459
+ Format => 'undef[4]',
2460
+ RawConv => '$val eq "\0\0\0\0" ? undef : $val',
2461
+ PrintConv => \%vendorID,
2462
+ SeparateTable => 'VendorID',
2463
+ },
2464
+ 24 => {
2465
+ Name => 'HandlerDescription',
2466
+ Format => 'string',
2467
+ # (sometimes this is a Pascal string, and sometimes it is a C string)
2468
+ RawConv => q{
2469
+ $val=substr($val,1,ord($1)) if $val=~/^([\0-\x1f])/ and ord($1)<length($val);
2470
+ length $val ? $val : undef;
2471
+ },
2472
+ },
2473
+ );
2474
+
2475
+ # Flip uuid data (ref PH)
2476
+ %Image::ExifTool::QuickTime::Flip = (
2477
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2478
+ FORMAT => 'int32u',
2479
+ FIRST_ENTRY => 0,
2480
+ NOTES => 'Found in MP4 files from Flip Video cameras.',
2481
+ GROUPS => { 1 => 'MakerNotes', 2 => 'Image' },
2482
+ 1 => 'PreviewImageWidth',
2483
+ 2 => 'PreviewImageHeight',
2484
+ 13 => 'PreviewImageLength',
2485
+ 14 => { # (confirmed for FlipVideoMinoHD)
2486
+ Name => 'SerialNumber',
2487
+ Groups => { 2 => 'Camera' },
2488
+ Format => 'string[16]',
2489
+ },
2490
+ 28 => {
2491
+ Name => 'PreviewImage',
2492
+ Format => 'undef[$val{13}]',
2493
+ RawConv => '$self->ValidateImage(\$val, $tag)',
2494
+ },
2495
+ );
2496
+
2497
+ # QuickTime composite tags
2498
+ %Image::ExifTool::QuickTime::Composite = (
2499
+ GROUPS => { 2 => 'Video' },
2500
+ Rotation => {
2501
+ Require => {
2502
+ 0 => 'QuickTime:MatrixStructure',
2503
+ 1 => 'QuickTime:HandlerType',
2504
+ },
2505
+ ValueConv => 'Image::ExifTool::QuickTime::CalcRotation($self)',
2506
+ },
2507
+ AvgBitrate => {
2508
+ Priority => 0, # let QuickTime::AvgBitrate take priority
2509
+ Require => {
2510
+ 0 => 'QuickTime::MovieDataSize',
2511
+ 1 => 'QuickTime::Duration',
2512
+ },
2513
+ RawConv => q{
2514
+ return undef unless $val[1];
2515
+ $val[1] /= $$self{TimeScale} if $$self{TimeScale};
2516
+ my $key = 'MovieDataSize';
2517
+ my $size = $val[0];
2518
+ for (;;) {
2519
+ $key = $self->NextTagKey($key) or last;
2520
+ $size += $self->GetValue($key);
2521
+ }
2522
+ return int($size * 8 / $val[1] + 0.5);
2523
+ },
2524
+ PrintConv => 'ConvertBitrate($val)',
2525
+ },
2526
+ GPSLatitude => {
2527
+ Require => 'QuickTime:GPSCoordinates',
2528
+ Groups => { 2 => 'Location' },
2529
+ ValueConv => 'my @c = split " ", $val; $c[0]',
2530
+ PrintConv => q{
2531
+ require Image::ExifTool::GPS;
2532
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
2533
+ },
2534
+ },
2535
+ GPSLongitude => {
2536
+ Require => 'QuickTime:GPSCoordinates',
2537
+ Groups => { 2 => 'Location' },
2538
+ ValueConv => 'my @c = split " ", $val; $c[1]',
2539
+ PrintConv => q{
2540
+ require Image::ExifTool::GPS;
2541
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
2542
+ },
2543
+ },
2544
+ # split altitude into GPSAltitude/GPSAltitudeRef like EXIF and XMP
2545
+ GPSAltitude => {
2546
+ Require => 'QuickTime:GPSCoordinates',
2547
+ Groups => { 2 => 'Location' },
2548
+ Priority => 0, # (because it may not exist)
2549
+ ValueConv => 'my @c = split " ", $val; defined $c[2] ? abs($c[2]) : undef',
2550
+ PrintConv => '"$val m"',
2551
+ },
2552
+ GPSAltitudeRef => {
2553
+ Require => 'QuickTime:GPSCoordinates',
2554
+ Groups => { 2 => 'Location' },
2555
+ Priority => 0, # (because altitude information may not exist)
2556
+ ValueConv => 'my @c = split " ", $val; defined $c[2] ? ($c[2] < 0 ? 1 : 0) : undef',
2557
+ PrintConv => {
2558
+ 0 => 'Above Sea Level',
2559
+ 1 => 'Below Sea Level',
2560
+ },
2561
+ },
2562
+ GPSLatitude2 => {
2563
+ Name => 'GPSLatitude',
2564
+ Require => 'QuickTime:LocationInformation',
2565
+ Groups => { 2 => 'Location' },
2566
+ ValueConv => '$val =~ /Lat=([-+.\d]+)/; abs($1)',
2567
+ PrintConv => q{
2568
+ require Image::ExifTool::GPS;
2569
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'N');
2570
+ },
2571
+ },
2572
+ GPSLongitude2 => {
2573
+ Name => 'GPSLongitude',
2574
+ Require => 'QuickTime:LocationInformation',
2575
+ Groups => { 2 => 'Location' },
2576
+ ValueConv => '$val =~ /Lon=([-+.\d]+)/; abs($1)',
2577
+ PrintConv => q{
2578
+ require Image::ExifTool::GPS;
2579
+ Image::ExifTool::GPS::ToDMS($self, $val, 1, 'E');
2580
+ },
2581
+ },
2582
+ GPSAltitude2 => {
2583
+ Name => 'GPSAltitude',
2584
+ Require => 'QuickTime:LocationInformation',
2585
+ Groups => { 2 => 'Location' },
2586
+ ValueConv => '$val =~ /Alt=([-+.\d]+)/; abs($1)',
2587
+ PrintConv => '"$val m"',
2588
+ },
2589
+ GPSAltitudeRef2 => {
2590
+ Name => 'GPSAltitudeRef',
2591
+ Require => 'QuickTime:LocationInformation',
2592
+ Groups => { 2 => 'Location' },
2593
+ ValueConv => '$val =~ /Alt=([-+.\d]+)/; $1 < 0 ? 1 : 0',
2594
+ PrintConv => {
2595
+ 0 => 'Above Sea Level',
2596
+ 1 => 'Below Sea Level',
2597
+ },
2598
+ },
2599
+ CDDBDiscPlayTime => {
2600
+ Require => 'CDDB1Info',
2601
+ Groups => { 2 => 'Audio' },
2602
+ ValueConv => '$val =~ /^..([a-z0-9]{4})/i ? hex($1) : undef',
2603
+ PrintConv => 'ConvertDuration($val)',
2604
+ },
2605
+ CDDBDiscTracks => {
2606
+ Require => 'CDDB1Info',
2607
+ Groups => { 2 => 'Audio' },
2608
+ ValueConv => '$val =~ /^.{6}([a-z0-9]{2})/i ? hex($1) : undef',
2609
+ },
2610
+ );
2611
+
2612
+ # add our composite tags
2613
+ Image::ExifTool::AddCompositeTags('Image::ExifTool::QuickTime');
2614
+
2615
+
2616
+ #------------------------------------------------------------------------------
2617
+ # Calculate rotation of video track
2618
+ # Inputs: 0) ExifTool object ref
2619
+ # Returns: rotation angle or undef
2620
+ sub CalcRotation($)
2621
+ {
2622
+ my $exifTool = shift;
2623
+ my $value = $$exifTool{VALUE};
2624
+ my ($i, $track);
2625
+ # get the video track family 1 group (ie. "Track1");
2626
+ for ($i=0; ; ++$i) {
2627
+ my $idx = $i ? " ($i)" : '';
2628
+ my $tag = "HandlerType$idx";
2629
+ last unless $$value{$tag};
2630
+ next unless $$value{$tag} eq 'vide';
2631
+ $track = $exifTool->GetGroup($tag, 1);
2632
+ last;
2633
+ }
2634
+ return undef unless $track;
2635
+ # get the video track matrix
2636
+ for ($i=0; ; ++$i) {
2637
+ my $idx = $i ? " ($i)" : '';
2638
+ my $tag = "MatrixStructure$idx";
2639
+ last unless $$value{$tag};
2640
+ next unless $exifTool->GetGroup($tag, 1) eq $track;
2641
+ my @a = split ' ', $$value{$tag};
2642
+ return undef unless $a[0] or $a[1];
2643
+ # calculate the rotation angle (assume uniform rotation)
2644
+ my $angle = atan2($a[1], $a[0]) * 180 / 3.14159;
2645
+ $angle += 360 if $angle < 0;
2646
+ return int($angle * 1000 + 0.5) / 1000;
2647
+ }
2648
+ return undef;
2649
+ }
2650
+
2651
+ #------------------------------------------------------------------------------
2652
+ # Determine the average sample rate from a time-to-sample table
2653
+ # Inputs: 0) ExifTool object ref, 1) time-to-sample table data ref
2654
+ # Returns: average sample rate (in Hz)
2655
+ sub CalcSampleRate($$)
2656
+ {
2657
+ my ($exifTool, $valPt) = @_;
2658
+ my @dat = unpack('N*', $$valPt);
2659
+ my ($num, $dur) = (0, 0);
2660
+ my $i;
2661
+ for ($i=2; $i<@dat-1; $i+=2) {
2662
+ $num += $dat[$i]; # total number of samples
2663
+ $dur += $dat[$i] * $dat[$i+1]; # total sample duration
2664
+ }
2665
+ return undef unless $num and $dur and $$exifTool{MediaTS};
2666
+ return $num * $$exifTool{MediaTS} / $dur;
2667
+ }
2668
+
2669
+ #------------------------------------------------------------------------------
2670
+ # Fix incorrect format for ImageWidth/Height as written by Pentax
2671
+ sub FixWrongFormat($)
2672
+ {
2673
+ my $val = shift;
2674
+ return undef unless $val;
2675
+ if ($val & 0xffff0000) {
2676
+ $val = unpack('n',pack('N',$val));
2677
+ }
2678
+ return $val;
2679
+ }
2680
+
2681
+ #------------------------------------------------------------------------------
2682
+ # Convert ISO 6709 string to standard lag/lon format
2683
+ # Inputs: 0) ISO 6709 string (lat, lon, and optional alt)
2684
+ # Returns: position in decimal degress with altitude if available
2685
+ # Notes: Wikipedia indicates altitude may be in feet -- how is this specified?
2686
+ sub ConvertISO6709($)
2687
+ {
2688
+ my $val = shift;
2689
+ if ($val =~ /^([-+]\d{2}(?:\.\d*)?)([-+]\d{3}(?:\.\d*)?)([-+]\d+)?/) {
2690
+ $val = ($1 + 0) . ' ' . ($2 + 0);
2691
+ $val .= ' ' . ($3 + 0) if $3;
2692
+ } elsif ($val =~ /^([-+])(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
2693
+ my $lat = $2 + $3 / 60;
2694
+ $lat = -$lat if $1 eq '-';
2695
+ my $lon = $5 + $6 / 60;
2696
+ $lon = -$lon if $4 eq '-';
2697
+ $val = "$lat $lon";
2698
+ $val .= ' ' . ($7 + 0) if $7;
2699
+ } elsif ($val =~ /^([-+])(\d{2})(\d{2})(\d{2}(?:\.\d*)?)([-+])(\d{3})(\d{2})(\d{2}(?:\.\d*)?)([-+]\d+)?/) {
2700
+ my $lat = $2 + $3 / 60 + $4 / 3600;
2701
+ $lat = -$lat if $1 eq '-';
2702
+ my $lon = $6 + $7 / 60 + $8 / 3600;
2703
+ $lon = -$lon if $5 eq '-';
2704
+ $val = "$lat $lon";
2705
+ $val .= ' ' . ($9 + 0) if $9;
2706
+ }
2707
+ return $val;
2708
+ }
2709
+
2710
+ #------------------------------------------------------------------------------
2711
+ # Format GPSCoordinates for printing
2712
+ # Inputs: 0) string with numerical lat, lon and optional alt, separated by spaces
2713
+ # 1) ExifTool object reference
2714
+ # Returns: PrintConv value
2715
+ sub PrintGPSCoordinates($)
2716
+ {
2717
+ my ($val, $exifTool) = @_;
2718
+ require Image::ExifTool::GPS;
2719
+ my @v = split ' ', $val;
2720
+ my $prt = Image::ExifTool::GPS::ToDMS($exifTool, $v[0], 1, "N") . ', ' .
2721
+ Image::ExifTool::GPS::ToDMS($exifTool, $v[1], 1, "E");
2722
+ if (defined $v[2]) {
2723
+ $prt .= ', ' . ($v[2] < 0 ? -$v[2] . ' m Below' : $v[2] . ' m Above') . ' Sea Level';
2724
+ }
2725
+ return $prt;
2726
+ }
2727
+
2728
+ #------------------------------------------------------------------------------
2729
+ # Unpack packed ISO 639/T language code
2730
+ # Inputs: 0) packed language code (or undef)
2731
+ # Returns: language code, or undef for default language, or 'err' for format error
2732
+ sub UnpackLang($)
2733
+ {
2734
+ my $lang = shift;
2735
+ if ($lang) {
2736
+ # language code is packed in 5-bit characters
2737
+ $lang = pack "C*", map { (($lang>>$_)&0x1f)+0x60 } 10, 5, 0;
2738
+ # validate language code
2739
+ if ($lang =~ /^[a-z]+$/) {
2740
+ # treat 'eng' or 'und' as the default language
2741
+ undef $lang if $lang eq 'und' or $lang eq 'eng';
2742
+ } else {
2743
+ $lang = 'err'; # invalid language code
2744
+ }
2745
+ }
2746
+ return $lang;
2747
+ }
2748
+
2749
+ #------------------------------------------------------------------------------
2750
+ # Process MPEG-4 MTDT atom (ref 11)
2751
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2752
+ # Returns: 1 on success
2753
+ sub ProcessMetaData($$$)
2754
+ {
2755
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2756
+ my $dataPt = $$dirInfo{DataPt};
2757
+ my $dirLen = length $$dataPt;
2758
+ my $verbose = $exifTool->Options('Verbose');
2759
+ return 0 unless $dirLen >= 2;
2760
+ my $count = Get16u($dataPt, 0);
2761
+ $verbose and $exifTool->VerboseDir('MetaData', $count);
2762
+ my $i;
2763
+ my $pos = 2;
2764
+ for ($i=0; $i<$count; ++$i) {
2765
+ last if $pos + 10 > $dirLen;
2766
+ my $size = Get16u($dataPt, $pos);
2767
+ last if $size < 10 or $size + $pos > $dirLen;
2768
+ my $tag = Get32u($dataPt, $pos + 2);
2769
+ my $lang = Get16u($dataPt, $pos + 6);
2770
+ my $enc = Get16u($dataPt, $pos + 8);
2771
+ my $val = substr($$dataPt, $pos + 10, $size);
2772
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
2773
+ if ($tagInfo) {
2774
+ # convert language code to ASCII (ignore read-only bit)
2775
+ $lang = UnpackLang($lang);
2776
+ # handle alternate languages
2777
+ if ($lang) {
2778
+ my $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang);
2779
+ $tagInfo = $langInfo if $langInfo;
2780
+ }
2781
+ $verbose and $exifTool->VerboseInfo($tag, $tagInfo,
2782
+ Value => $val,
2783
+ DataPt => $dataPt,
2784
+ Start => $pos + 10,
2785
+ Size => $size - 10,
2786
+ );
2787
+ # convert from UTF-16 BE if necessary
2788
+ $val = $exifTool->Decode($val, 'UCS2') if $enc == 1;
2789
+ if ($enc == 0 and $$tagInfo{Unknown}) {
2790
+ # binary data
2791
+ $exifTool->FoundTag($tagInfo, \$val);
2792
+ } else {
2793
+ $exifTool->FoundTag($tagInfo, $val);
2794
+ }
2795
+ }
2796
+ $pos += $size;
2797
+ }
2798
+ return 1;
2799
+ }
2800
+
2801
+ #------------------------------------------------------------------------------
2802
+ # Process iTunes Encoding Params (ref PH)
2803
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2804
+ # Returns: 1 on success
2805
+ sub ProcessEncodingParams($$$)
2806
+ {
2807
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2808
+ my $dataPt = $$dirInfo{DataPt};
2809
+ my $dirLen = length $$dataPt;
2810
+ my $pos;
2811
+ $exifTool->VerboseDir('Encoding Params', $dirLen / 8);
2812
+ for ($pos = 0; $pos + 8 <= $dirLen; $pos += 8) {
2813
+ my ($tag, $val) = unpack("x${pos}a4N", $$dataPt);
2814
+ $exifTool->HandleTag($tagTablePtr, $tag, $val);
2815
+ }
2816
+ return 1;
2817
+ }
2818
+
2819
+ #------------------------------------------------------------------------------
2820
+ # Process Meta keys and add tags to the ItemList table ('mdta' handler) (ref PH)
2821
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2822
+ # Returns: 1 on success
2823
+ sub ProcessKeys($$$)
2824
+ {
2825
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2826
+ my $dataPt = $$dirInfo{DataPt};
2827
+ my $dirLen = length $$dataPt;
2828
+ my $out;
2829
+ if ($exifTool->Options('Verbose')) {
2830
+ $exifTool->VerboseDir('Keys');
2831
+ $out = $exifTool->Options('TextOut');
2832
+ }
2833
+ my $pos = 8;
2834
+ my $index = 1;
2835
+ my $infoTable = GetTagTable('Image::ExifTool::QuickTime::ItemList');
2836
+ my $userTable = GetTagTable('Image::ExifTool::QuickTime::UserData');
2837
+ while ($pos < $dirLen - 4) {
2838
+ my $len = unpack("x${pos}N", $$dataPt);
2839
+ last if $len < 8 or $pos + $len > $dirLen;
2840
+ delete $$tagTablePtr{$index};
2841
+ my $ns = substr($$dataPt, $pos + 4, 4);
2842
+ my $tag = substr($$dataPt, $pos + 8, $len - 8);
2843
+ $tag =~ s/\0.*//s; # truncate at null
2844
+ if ($ns eq 'mdta') {
2845
+ $tag =~ s/^com\.apple\.quicktime\.//; # remove common apple quicktime domain
2846
+ }
2847
+ next unless $tag;
2848
+ # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
2849
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
2850
+ unless ($tagInfo) {
2851
+ $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
2852
+ unless ($tagInfo) {
2853
+ $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
2854
+ if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
2855
+ $tag = pack('N', unpack('V', $tag));
2856
+ $tagInfo = $exifTool->GetTagInfo($infoTable, $tag);
2857
+ $tagInfo or $tagInfo = $exifTool->GetTagInfo($userTable, $tag);
2858
+ }
2859
+ }
2860
+ }
2861
+ my ($newInfo, $msg);
2862
+ if ($tagInfo) {
2863
+ $newInfo = {
2864
+ Name => $$tagInfo{Name},
2865
+ Format => $$tagInfo{Format},
2866
+ ValueConv => $$tagInfo{ValueConv},
2867
+ PrintConv => $$tagInfo{PrintConv},
2868
+ };
2869
+ my $groups = $$tagInfo{Groups};
2870
+ $$newInfo{Groups} = { %$groups } if $groups;
2871
+ } elsif ($tag =~ /^[-\w.]+$/) {
2872
+ # create info for tags with reasonable id's
2873
+ my $name = $tag;
2874
+ $name =~ s/\.(.)/\U$1/g;
2875
+ $newInfo = { Name => ucfirst($name) };
2876
+ $msg = ' (Unknown)';
2877
+ }
2878
+ # substitute this tag in the ItemList table with the given index
2879
+ delete $$infoTable{$index};
2880
+ if ($newInfo) {
2881
+ $msg or $msg = '';
2882
+ AddTagToTable($infoTable, $index, $newInfo);
2883
+ $out and printf $out "%sAdded ItemList Tag 0x%.4x = $tag$msg\n", $exifTool->{INDENT}, $index;
2884
+ }
2885
+ $pos += $len;
2886
+ ++$index;
2887
+ }
2888
+ return 1;
2889
+ }
2890
+
2891
+ #------------------------------------------------------------------------------
2892
+ # Process a QuickTime atom
2893
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) optional tag table ref
2894
+ # Returns: 1 on success
2895
+ sub ProcessMOV($$;$)
2896
+ {
2897
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2898
+ my $raf = $$dirInfo{RAF};
2899
+ my $dataPt = $$dirInfo{DataPt};
2900
+ my $verbose = $exifTool->Options('Verbose');
2901
+ my $dataPos = $$dirInfo{Base} || 0;
2902
+ my $charsetQuickTime = $exifTool->Options('CharsetQuickTime');
2903
+ my ($buff, $tag, $size, $track, $isUserData, %triplet);
2904
+
2905
+ # more convenient to package data as a RandomAccess file
2906
+ $raf or $raf = new File::RandomAccess($dataPt);
2907
+ # skip leading bytes if necessary
2908
+ if ($$dirInfo{DirStart}) {
2909
+ $raf->Seek($$dirInfo{DirStart}, 1) or return 0;
2910
+ $dataPos += $$dirInfo{DirStart};
2911
+ }
2912
+ # read size/tag name atom header
2913
+ $raf->Read($buff,8) == 8 or return 0;
2914
+ $dataPos += 8;
2915
+ if ($tagTablePtr) {
2916
+ $isUserData = ($tagTablePtr eq \%Image::ExifTool::QuickTime::UserData);
2917
+ } else {
2918
+ $tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
2919
+ }
2920
+ ($size, $tag) = unpack('Na4', $buff);
2921
+ if ($dataPt) {
2922
+ $verbose and $exifTool->VerboseDir($$dirInfo{DirName});
2923
+ } else {
2924
+ # check on file type if called with a RAF
2925
+ $$tagTablePtr{$tag} or return 0;
2926
+ if ($tag eq 'ftyp') {
2927
+ # read ahead 4 bytes to see what type of file this is
2928
+ my $fileType;
2929
+ if ($raf->Read($buff, 4) == 4) {
2930
+ $raf->Seek(-4, 1);
2931
+ # see if we know the extension for this file type
2932
+ $fileType = $1 if $ftypLookup{$buff} and $ftypLookup{$buff} =~ /\(\.(\w+)/;
2933
+ }
2934
+ $fileType or $fileType = 'MP4'; # default to MP4
2935
+ $exifTool->SetFileType($fileType, $mimeLookup{$fileType} || 'video/mp4');
2936
+ } else {
2937
+ $exifTool->SetFileType(); # MOV
2938
+ }
2939
+ SetByteOrder('MM');
2940
+ }
2941
+ for (;;) {
2942
+ if ($size < 8) {
2943
+ last if $size == 0;
2944
+ $size == 1 or $exifTool->Warn('Invalid atom size'), last;
2945
+ $raf->Read($buff, 8) == 8 or last;
2946
+ $dataPos += 8;
2947
+ my ($hi, $lo) = unpack('NN', $buff);
2948
+ $size = $lo;
2949
+ if ($hi or $lo > 0x7fffffff) {
2950
+ if ($hi > 0x7fffffff) {
2951
+ $exifTool->Warn('Invalid atom size');
2952
+ last;
2953
+ } elsif (not $exifTool->Options('LargeFileSupport')) {
2954
+ $exifTool->Warn('End of processing at large atom (LargeFileSupport not enabled)');
2955
+ last;
2956
+ }
2957
+ }
2958
+ $size = $hi * 4294967296 + $lo - 8;
2959
+ $size < 8 and $exifTool->Warn('Invalid extended size'), last;
2960
+ }
2961
+ $size -= 8;
2962
+ if ($isUserData and $$exifTool{SET_GROUP1}) {
2963
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
2964
+ # add track name to UserData tags inside tracks
2965
+ $tag = $$exifTool{SET_GROUP1} . $tag;
2966
+ if (not $$tagTablePtr{$tag} and $tagInfo) {
2967
+ my %newInfo = %$tagInfo;
2968
+ foreach ('Name', 'Description') {
2969
+ $newInfo{$_} = $$exifTool{SET_GROUP1} . $$tagInfo{$_} if $$tagInfo{$_};
2970
+ }
2971
+ AddTagToTable($tagTablePtr, $tag, \%newInfo);
2972
+ }
2973
+ }
2974
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
2975
+ # allow numerical tag ID's
2976
+ unless ($tagInfo) {
2977
+ my $num = unpack('N', $tag);
2978
+ if ($$tagTablePtr{$num}) {
2979
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $num);
2980
+ $tag = $num;
2981
+ }
2982
+ }
2983
+ # generate tagInfo if Unknown option set
2984
+ if (not defined $tagInfo and ($exifTool->{OPTIONS}->{Unknown} or
2985
+ $verbose or $tag =~ /^\xa9/))
2986
+ {
2987
+ my $name = $tag;
2988
+ my $n = ($name =~ s/([\x00-\x1f\x7f-\xff])/'x'.unpack('H*',$1)/eg);
2989
+ # print in hex if tag is numerical
2990
+ $name = sprintf('0x%.4x',unpack('N',$tag)) if $n > 2;
2991
+ if ($name =~ /^xa9(.*)/) {
2992
+ $tagInfo = {
2993
+ Name => "UserData_$1",
2994
+ Description => "User Data $1",
2995
+ };
2996
+ } else {
2997
+ $tagInfo = {
2998
+ Name => "Unknown_$name",
2999
+ Description => "Unknown $name",
3000
+ Unknown => 1,
3001
+ Binary => 1,
3002
+ };
3003
+ }
3004
+ AddTagToTable($tagTablePtr, $tag, $tagInfo);
3005
+ }
3006
+ # save required tag sizes
3007
+ $exifTool->HandleTag($tagTablePtr, "$tag-size", $size) if $$tagTablePtr{"$tag-size"};
3008
+ # load values only if associated with a tag (or verbose) and < 16MB long
3009
+ if ((defined $tagInfo or $verbose) and $size < 0x1000000) {
3010
+ my $val;
3011
+ unless ($raf->Read($val, $size) == $size) {
3012
+ $exifTool->Warn("Truncated '$tag' data");
3013
+ last;
3014
+ }
3015
+ # use value to get tag info if necessary
3016
+ $tagInfo or $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag, \$val);
3017
+ my $hasData = ($$dirInfo{HasData} and $val =~ /\0...data\0/s);
3018
+ if ($verbose and not $hasData) {
3019
+ my $tval;
3020
+ if ($tagInfo and $$tagInfo{Format}) {
3021
+ $tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
3022
+ }
3023
+ $exifTool->VerboseInfo($tag, $tagInfo,
3024
+ Value => $tval,
3025
+ DataPt => \$val,
3026
+ DataPos => $dataPos,
3027
+ Size => $size,
3028
+ Format => $tagInfo ? $$tagInfo{Format} : undef,
3029
+ );
3030
+ }
3031
+ # handle iTunesInfo mean/name/data triplets
3032
+ if ($tagInfo and $$tagInfo{Triplet}) {
3033
+ if ($tag eq 'data' and $triplet{mean} and $triplet{name}) {
3034
+ $tag = $triplet{name};
3035
+ # add 'mean' to name unless it is 'com.apple.iTunes'
3036
+ $tag = $triplet{mean} . '/' . $tag unless $triplet{mean} eq 'com.apple.iTunes';
3037
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag, \$val);
3038
+ unless ($tagInfo) {
3039
+ my $name = $triplet{name};
3040
+ my $desc = $name;
3041
+ $name =~ tr/-_a-zA-Z0-9//dc;
3042
+ $desc =~ tr/_/ /;
3043
+ $tagInfo = {
3044
+ Name => $name,
3045
+ Description => $desc,
3046
+ };
3047
+ AddTagToTable($tagTablePtr, $tag, $tagInfo);
3048
+ }
3049
+ # ignore 8-byte header
3050
+ $val = substr($val, 8) if length($val) >= 8;
3051
+ unless ($$tagInfo{Format} or $$tagInfo{SubDirectory}) {
3052
+ # extract as binary if it contains any non-ASCII or control characters
3053
+ if ($val =~ /[^\x20-\x7e]/) {
3054
+ my $buff = $val;
3055
+ $val = \$buff;
3056
+ }
3057
+ }
3058
+ undef %triplet;
3059
+ } else {
3060
+ undef %triplet if $tag eq 'mean';
3061
+ $triplet{$tag} = substr($val,4) if length($val) > 4;
3062
+ undef $tagInfo; # don't store this tag
3063
+ }
3064
+ }
3065
+ if ($tagInfo) {
3066
+ my $subdir = $$tagInfo{SubDirectory};
3067
+ if ($subdir) {
3068
+ my $start = $$subdir{Start} || 0;
3069
+ my ($base, $dPos) = ($dataPos, 0);
3070
+ if ($$subdir{Base}) {
3071
+ $dPos -= eval $$subdir{Base};
3072
+ $base -= $dPos;
3073
+ }
3074
+ my %dirInfo = (
3075
+ DataPt => \$val,
3076
+ DataLen => $size,
3077
+ DirStart => $start,
3078
+ DirLen => $size - $start,
3079
+ DirName => $$subdir{DirName} || $$tagInfo{Name},
3080
+ HasData => $$subdir{HasData},
3081
+ Multi => $$subdir{Multi},
3082
+ DataPos => $dPos,
3083
+ # Base needed for IsOffset tags in binary data
3084
+ Base => $base,
3085
+ );
3086
+ if ($$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/) {
3087
+ SetByteOrder('II');
3088
+ }
3089
+ my $oldGroup1 = $exifTool->{SET_GROUP1};
3090
+ if ($$tagInfo{Name} eq 'Track') {
3091
+ $track or $track = 0;
3092
+ $exifTool->{SET_GROUP1} = 'Track' . (++$track);
3093
+ }
3094
+ my $subTable = GetTagTable($$subdir{TagTable});
3095
+ my $proc = $$subdir{ProcessProc};
3096
+ # make ProcessMOV() the default processing procedure for subdirectories
3097
+ $proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC};
3098
+ $exifTool->ProcessDirectory(\%dirInfo, $subTable, $proc) if $size > $start;
3099
+ $exifTool->{SET_GROUP1} = $oldGroup1;
3100
+ SetByteOrder('MM');
3101
+ } elsif ($hasData) {
3102
+ # handle atoms containing 'data' tags
3103
+ # (currently ignore contained atoms: 'itif', 'name', etc.)
3104
+ my $pos = 0;
3105
+ for (;;) {
3106
+ last if $pos + 16 > $size;
3107
+ my ($len, $type, $flags, $ctry, $lang) = unpack("x${pos}Na4Nnn", $val);
3108
+ last if $pos + $len > $size;
3109
+ my $value;
3110
+ my $format = $$tagInfo{Format};
3111
+ if ($type eq 'data' and $len >= 16) {
3112
+ $pos += 16;
3113
+ $len -= 16;
3114
+ $value = substr($val, $pos, $len);
3115
+ # format flags (ref 12):
3116
+ # 0x0=binary, 0x1=UTF-8, 0x2=UTF-16, 0x3=ShiftJIS,
3117
+ # 0x4=UTF-8 0x5=UTF-16, 0xd=JPEG, 0xe=PNG,
3118
+ # 0x15=signed int, 0x16=unsigned int, 0x17=float,
3119
+ # 0x18=double, 0x1b=BMP, 0x1c='meta' atom
3120
+ if ($stringEncoding{$flags}) {
3121
+ # handle all string formats
3122
+ $value = $exifTool->Decode($value, $stringEncoding{$flags});
3123
+ } else {
3124
+ if (not $format) {
3125
+ if ($flags == 0x15 or $flags == 0x16) {
3126
+ $format = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len};
3127
+ $format .= $flags == 0x15 ? 's' : 'u' if $format;
3128
+ } elsif ($flags == 0x17) {
3129
+ $format = 'float';
3130
+ } elsif ($flags == 0x18) {
3131
+ $format = 'double';
3132
+ } elsif ($flags == 0x00) {
3133
+ # read 1 and 2-byte binary as integers
3134
+ if ($len == 1) {
3135
+ $format = 'int8u',
3136
+ } elsif ($len == 2) {
3137
+ $format = 'int16u',
3138
+ }
3139
+ }
3140
+ }
3141
+ if ($format) {
3142
+ $value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len);
3143
+ } elsif (not $$tagInfo{ValueConv}) {
3144
+ # make binary data a scalar reference unless a ValueConv exists
3145
+ my $buf = $value;
3146
+ $value = \$buf;
3147
+ }
3148
+ }
3149
+ }
3150
+ my $langInfo;
3151
+ if ($ctry or $lang) {
3152
+ # ignore country ('ctry') and language lists ('lang') for now
3153
+ undef $ctry if $ctry and $ctry <= 255;
3154
+ undef $lang if $lang and $lang <= 255;
3155
+ $lang = UnpackLang($lang);
3156
+ # add country code if specified
3157
+ if ($ctry) {
3158
+ $ctry = unpack('a2',pack('n',$ctry)); # unpack as ISO 3166-1
3159
+ # treat 'ZZ' like a default country (see ref 12)
3160
+ undef $ctry if $ctry eq 'ZZ';
3161
+ if ($ctry and $ctry =~ /^[A-Z]{2}$/) {
3162
+ $lang or $lang = 'und';
3163
+ $lang .= "-$ctry";
3164
+ }
3165
+ }
3166
+ $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
3167
+ }
3168
+ $langInfo or $langInfo = $tagInfo;
3169
+ $exifTool->VerboseInfo($tag, $langInfo,
3170
+ Value => ref $value ? $$value : $value,
3171
+ DataPt => \$val,
3172
+ DataPos => $dataPos,
3173
+ Start => $pos,
3174
+ Size => $len,
3175
+ Format => $format,
3176
+ Extra => sprintf(", Type='$type', Flags=0x%x",$flags)
3177
+ ) if $verbose;
3178
+ $exifTool->FoundTag($langInfo, $value) if defined $value;
3179
+ $pos += $len;
3180
+ }
3181
+ } elsif ($tag =~ /^\xa9/) {
3182
+ # parse international text to extract all languages
3183
+ my $pos = 0;
3184
+ for (;;) {
3185
+ last if $pos + 4 > $size;
3186
+ my ($len, $lang) = unpack("x${pos}nn", $val);
3187
+ $pos += 4;
3188
+ # according to the QuickTime spec (ref 12), $len should include
3189
+ # 4 bytes for length and type words, but nobody (including
3190
+ # Apple, Pentax and Kodak) seems to add these in, so try
3191
+ # to allow for either
3192
+ if ($pos + $len > $size) {
3193
+ $len -= 4;
3194
+ last if $pos + $len > $size or $len < 0;
3195
+ }
3196
+ # ignore any empty entries (or null padding) after the first
3197
+ next if not $len and $pos;
3198
+ my $str = substr($val, $pos, $len);
3199
+ my $langInfo;
3200
+ if ($lang < 0x400) {
3201
+ # this is a Macintosh language code
3202
+ # a language code of 0 is Macintosh english, so treat as default
3203
+ if ($lang) {
3204
+ # use Font.pm to look up language string
3205
+ require Image::ExifTool::Font;
3206
+ $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
3207
+ }
3208
+ # the spec says only "Macintosh text encoding", but
3209
+ # allow this to be configured by the user
3210
+ $str = $exifTool->Decode($str, $charsetQuickTime);
3211
+ } else {
3212
+ # convert language code to ASCII (ignore read-only bit)
3213
+ $lang = UnpackLang($lang);
3214
+ # may be either UTF-8 or UTF-16BE
3215
+ my $enc = $str=~s/^\xfe\xff// ? 'UTF16' : 'UTF8';
3216
+ $str = $exifTool->Decode($str, $enc);
3217
+ }
3218
+ $langInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
3219
+ $exifTool->FoundTag($langInfo || $tagInfo, $str);
3220
+ $pos += $len;
3221
+ }
3222
+ } else {
3223
+ my $format = $$tagInfo{Format};
3224
+ if ($format) {
3225
+ $val = ReadValue(\$val, 0, $format, $$tagInfo{Count}, length($val));
3226
+ }
3227
+ my $key = $exifTool->FoundTag($tagInfo, $val);
3228
+ # decode if necessary (NOTE: must be done after RawConv)
3229
+ if (defined $key and (not $format or $format =~ /^string/) and
3230
+ not $$tagInfo{Unknown} and not $$tagInfo{Binary} and
3231
+ defined $$exifTool{VALUE}{$key} and not ref $val)
3232
+ {
3233
+ my $vp = \$$exifTool{VALUE}{$key};
3234
+ if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
3235
+ # the encoding of this is not specified, so use CharsetQuickTime
3236
+ $$vp = $exifTool->Decode($$vp, $charsetQuickTime);
3237
+ }
3238
+ }
3239
+ }
3240
+ }
3241
+ } else {
3242
+ $raf->Seek($size, 1) or $exifTool->Warn("Truncated '$tag' data"), last;
3243
+ }
3244
+ $raf->Read($buff, 8) == 8 or last;
3245
+ $dataPos += $size + 8;
3246
+ ($size, $tag) = unpack('Na4', $buff);
3247
+ }
3248
+ return 1;
3249
+ }
3250
+
3251
+ #------------------------------------------------------------------------------
3252
+ # Process a QuickTime Image File
3253
+ # Inputs: 0) ExifTool object reference, 1) directory information reference
3254
+ # Returns: 1 on success
3255
+ sub ProcessQTIF($$)
3256
+ {
3257
+ my ($exifTool, $dirInfo) = @_;
3258
+ my $table = GetTagTable('Image::ExifTool::QuickTime::ImageFile');
3259
+ return ProcessMOV($exifTool, $dirInfo, $table);
3260
+ }
3261
+
3262
+ 1; # end
3263
+
3264
+ __END__
3265
+
3266
+ =head1 NAME
3267
+
3268
+ Image::ExifTool::QuickTime - Read QuickTime and MP4 meta information
3269
+
3270
+ =head1 SYNOPSIS
3271
+
3272
+ This module is used by Image::ExifTool
3273
+
3274
+ =head1 DESCRIPTION
3275
+
3276
+ This module contains routines required by Image::ExifTool to extract
3277
+ information from QuickTime and MP4 video, and M4A audio files.
3278
+
3279
+ =head1 AUTHOR
3280
+
3281
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
3282
+
3283
+ This library is free software; you can redistribute it and/or modify it
3284
+ under the same terms as Perl itself.
3285
+
3286
+ =head1 REFERENCES
3287
+
3288
+ =over 4
3289
+
3290
+ =item L<http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html>
3291
+
3292
+ =item L<http://search.cpan.org/dist/MP4-Info-1.04/>
3293
+
3294
+ =item L<http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt>
3295
+
3296
+ =item L<http://wiki.multimedia.cx/index.php?title=Apple_QuickTime>
3297
+
3298
+ =item L<http://atomicparsley.sourceforge.net/mpeg-4files.html>
3299
+
3300
+ =item L<http://wiki.multimedia.cx/index.php?title=QuickTime_container>
3301
+
3302
+ =item L<http://code.google.com/p/mp4v2/wiki/iTunesMetadata>
3303
+
3304
+ =item L<http://www.canieti.com.mx/assets/files/1011/IEC_100_1384_DC.pdf>
3305
+
3306
+ =item L<http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf>
3307
+
3308
+ =back
3309
+
3310
+ =head1 SEE ALSO
3311
+
3312
+ L<Image::ExifTool::TagNames/QuickTime Tags>,
3313
+ L<Image::ExifTool(3pm)|Image::ExifTool>
3314
+
3315
+ =cut
3316
+