exiftool_vendored 9.33.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

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