exiftool_vendored 9.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (864) hide show
  1. checksums.yaml +15 -0
  2. data/bin/Image-ExifTool-9.33/Changes +6241 -0
  3. data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
  4. data/bin/Image-ExifTool-9.33/META.yml +27 -0
  5. data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
  6. data/bin/Image-ExifTool-9.33/README +227 -0
  7. data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
  8. data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
  9. data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
  10. data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
  11. data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
  12. data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
  13. data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
  14. data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
  15. data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
  16. data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
  17. data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
  18. data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
  19. data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
  20. data/bin/Image-ExifTool-9.33/exiftool +5715 -0
  21. data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
  22. data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
  23. data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
  24. data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
  25. data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
  27. data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
  28. data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
  29. data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
  30. data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
  31. data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
  32. data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
  33. data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
  34. data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
  35. data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
  36. data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
  37. data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
  38. data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
  39. data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
  40. data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
  41. data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
  42. data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
  43. data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
  44. data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
  45. data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
  46. data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
  47. data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
  48. data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
  49. data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
  50. data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
  51. data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
  52. data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
  53. data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
  54. data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
  55. data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
  56. data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
  57. data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
  58. data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
  59. data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
  60. data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
  61. data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
  62. data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
  63. data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
  64. data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
  65. data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
  66. data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
  67. data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
  68. data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
  69. data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
  70. data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
  71. data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
  72. data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
  73. data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
  74. data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
  75. data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
  76. data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
  77. data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
  78. data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
  79. data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
  80. data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
  81. data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
  82. data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
  83. data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
  84. data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
  85. data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
  86. data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
  87. data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
  88. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
  89. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
  90. data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
  91. data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
  92. data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
  93. data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
  94. data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
  95. data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
  96. data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
  97. data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
  98. data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
  99. data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
  100. data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
  101. data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
  102. data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
  103. data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
  104. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
  105. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
  106. data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
  107. data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
  108. data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
  109. data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
  110. data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
  111. data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
  112. data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
  113. data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
  114. data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
  115. data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
  116. data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
  117. data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
  118. data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
  119. data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
  120. data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
  121. data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
  122. data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
  123. data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
  124. data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
  125. data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
  126. data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
  127. data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
  128. data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
  129. data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
  130. data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
  131. data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
  132. data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
  133. data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
  134. data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
  135. data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
  136. data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
  137. data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
  138. data/bin/Image-ExifTool-9.33/html/config.html +312 -0
  139. data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
  140. data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
  141. data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
  142. data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
  143. data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
  144. data/bin/Image-ExifTool-9.33/html/history.html +358 -0
  145. data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
  146. data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
  147. data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
  148. data/bin/Image-ExifTool-9.33/html/install.html +239 -0
  149. data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
  150. data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
  151. data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
  152. data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
  153. data/bin/Image-ExifTool-9.33/html/style.css +31 -0
  154. data/bin/Image-ExifTool-9.33/html/under.html +124 -0
  155. data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
  156. data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
  157. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
  158. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
  159. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
  160. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
  161. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
  162. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
  163. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
  164. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
  165. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
  166. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
  167. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
  168. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
  169. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
  170. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
  171. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
  172. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  173. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
  174. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  175. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
  176. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
  177. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
  178. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
  179. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
  180. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
  181. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
  182. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
  183. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
  184. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
  185. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
  186. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
  187. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
  188. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
  189. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
  190. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
  191. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
  192. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
  193. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
  194. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
  195. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
  196. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
  197. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
  198. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
  199. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
  200. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
  201. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
  202. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
  203. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
  204. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
  205. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
  206. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
  207. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
  208. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
  209. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
  210. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
  211. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
  212. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
  213. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
  214. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
  215. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
  216. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
  217. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
  218. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
  219. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
  220. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
  221. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
  222. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
  223. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
  224. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
  225. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
  226. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
  227. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  228. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
  229. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
  230. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
  231. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
  232. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
  233. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  234. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
  235. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
  236. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
  237. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
  238. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
  239. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
  240. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  241. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
  242. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  243. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
  244. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  245. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
  246. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  247. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
  248. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  249. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  250. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
  251. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  252. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  253. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
  254. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  255. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  256. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  257. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  258. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
  259. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
  260. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
  261. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  262. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  263. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
  264. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
  265. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
  266. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
  267. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
  268. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
  269. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
  270. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
  271. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
  272. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
  273. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
  274. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
  275. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
  276. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
  277. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
  278. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  279. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
  280. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
  281. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  282. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
  283. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
  284. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
  285. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
  286. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
  287. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
  288. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
  289. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
  290. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
  291. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
  292. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
  293. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
  294. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  295. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
  296. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
  297. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
  298. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  299. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
  300. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
  301. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
  302. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  303. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
  304. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
  305. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
  306. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
  307. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
  308. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
  309. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
  310. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
  311. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
  312. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
  313. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
  314. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
  315. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
  316. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
  317. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
  318. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  319. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
  320. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
  321. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
  322. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  323. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
  324. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
  325. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
  326. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
  327. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
  328. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  329. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
  330. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  331. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
  332. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
  333. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  334. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
  335. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  336. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
  337. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
  338. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
  339. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
  340. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
  341. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
  342. data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
  343. data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
  344. data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
  345. data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
  346. data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
  347. data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
  348. data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
  349. data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
  350. data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
  351. data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
  352. data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
  353. data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
  354. data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
  355. data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
  356. data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
  357. data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
  358. data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
  359. data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
  360. data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
  361. data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
  362. data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
  363. data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
  364. data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
  365. data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
  366. data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
  367. data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
  368. data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
  369. data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
  370. data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
  371. data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
  372. data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
  373. data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
  374. data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
  375. data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
  376. data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
  377. data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
  378. data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
  379. data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
  380. data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
  381. data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
  382. data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
  383. data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
  384. data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
  385. data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
  386. data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
  387. data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
  388. data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
  389. data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
  390. data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
  391. data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
  392. data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
  393. data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
  394. data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
  395. data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
  396. data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
  397. data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
  398. data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
  399. data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
  400. data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
  401. data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
  402. data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
  403. data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
  404. data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
  405. data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
  406. data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
  407. data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
  408. data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
  409. data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
  410. data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
  411. data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
  412. data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
  413. data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
  414. data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
  415. data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
  416. data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
  417. data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
  418. data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
  419. data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
  420. data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
  421. data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
  422. data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
  423. data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
  424. data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
  425. data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
  426. data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
  427. data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
  428. data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
  429. data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
  430. data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
  431. data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
  432. data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
  433. data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
  434. data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
  435. data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
  436. data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
  437. data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
  438. data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
  439. data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
  440. data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
  441. data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
  442. data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
  443. data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
  444. data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
  445. data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
  446. data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
  447. data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
  448. data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
  449. data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
  450. data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
  451. data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
  452. data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
  453. data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
  454. data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
  455. data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
  456. data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
  457. data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
  458. data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
  459. data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
  460. data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
  461. data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
  462. data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
  463. data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
  464. data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
  465. data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
  466. data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
  467. data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
  468. data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
  469. data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
  470. data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
  471. data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
  472. data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
  473. data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
  474. data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
  475. data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
  476. data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
  477. data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
  478. data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
  479. data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
  480. data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
  481. data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
  482. data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
  483. data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
  484. data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
  485. data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
  486. data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
  487. data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
  488. data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
  489. data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
  490. data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
  491. data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
  492. data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
  493. data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
  494. data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
  495. data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
  496. data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
  497. data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
  498. data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
  499. data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
  500. data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
  501. data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
  502. data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
  503. data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
  504. data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
  505. data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
  506. data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
  507. data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
  508. data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
  509. data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
  510. data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
  511. data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
  512. data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
  513. data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
  514. data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
  515. data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
  516. data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
  517. data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
  518. data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
  519. data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
  520. data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
  521. data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
  522. data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
  523. data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
  524. data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
  525. data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
  526. data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
  527. data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
  528. data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
  529. data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
  530. data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
  531. data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
  532. data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
  533. data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
  534. data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
  535. data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
  536. data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
  537. data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
  538. data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
  539. data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
  540. data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
  541. data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
  542. data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
  543. data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
  544. data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
  545. data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
  546. data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
  547. data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
  548. data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
  549. data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
  550. data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
  551. data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
  552. data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
  553. data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
  554. data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
  555. data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
  556. data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
  557. data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
  558. data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
  559. data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
  560. data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
  561. data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
  562. data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
  563. data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
  564. data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
  565. data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
  566. data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
  567. data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
  568. data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
  569. data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
  570. data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
  571. data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
  572. data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
  573. data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
  574. data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
  575. data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
  576. data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
  577. data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
  578. data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
  579. data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
  580. data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
  581. data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
  582. data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
  583. data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
  584. data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
  585. data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
  586. data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
  587. data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
  588. data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
  589. data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
  590. data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
  591. data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
  592. data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
  593. data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
  594. data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
  595. data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
  596. data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
  597. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
  598. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
  599. data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
  600. data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
  601. data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
  602. data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
  603. data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
  604. data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
  605. data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
  606. data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
  607. data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
  608. data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
  609. data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
  610. data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
  611. data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
  612. data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
  613. data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
  614. data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
  615. data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
  616. data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
  617. data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
  618. data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
  619. data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
  620. data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
  621. data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
  622. data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
  623. data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
  624. data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
  625. data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
  626. data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
  627. data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
  628. data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
  629. data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
  630. data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
  631. data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
  632. data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
  633. data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
  634. data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
  635. data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
  636. data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
  637. data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
  638. data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
  639. data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
  640. data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
  641. data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
  642. data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
  643. data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
  644. data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
  645. data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
  646. data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
  647. data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
  648. data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
  649. data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
  650. data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
  651. data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
  652. data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
  653. data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
  654. data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
  655. data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
  656. data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
  657. data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
  658. data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
  659. data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
  660. data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
  661. data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
  662. data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
  663. data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
  664. data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
  665. data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
  666. data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
  667. data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
  668. data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
  669. data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
  670. data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
  671. data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
  672. data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
  673. data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
  674. data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
  675. data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
  676. data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
  677. data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
  678. data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
  679. data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
  680. data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
  681. data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
  682. data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
  683. data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
  684. data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
  685. data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
  686. data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
  687. data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
  688. data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
  689. data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
  690. data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
  691. data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
  692. data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
  693. data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
  694. data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
  695. data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
  696. data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
  697. data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
  698. data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
  699. data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
  700. data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
  701. data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
  702. data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
  703. data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
  704. data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
  705. data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
  706. data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
  707. data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
  708. data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
  709. data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
  710. data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
  711. data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
  712. data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
  713. data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
  714. data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
  715. data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
  716. data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
  717. data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
  718. data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
  719. data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
  720. data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
  721. data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
  722. data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
  723. data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
  724. data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
  725. data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
  726. data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
  727. data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
  728. data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
  729. data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
  730. data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
  731. data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
  732. data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
  733. data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
  734. data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
  735. data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
  736. data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
  737. data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
  738. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
  739. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
  740. data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
  741. data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
  742. data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
  743. data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
  744. data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
  745. data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
  746. data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
  747. data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
  748. data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
  749. data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
  750. data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
  751. data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
  752. data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
  753. data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
  754. data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
  755. data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
  756. data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
  757. data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
  758. data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
  759. data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
  760. data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
  761. data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
  762. data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
  763. data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
  764. data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
  765. data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
  766. data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
  767. data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
  768. data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
  769. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
  770. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
  771. data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
  772. data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
  773. data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
  774. data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
  775. data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
  776. data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
  777. data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
  778. data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
  779. data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
  780. data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
  781. data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
  782. data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
  783. data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
  784. data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
  785. data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
  786. data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
  787. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
  788. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
  789. data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
  790. data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
  791. data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
  792. data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
  793. data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
  794. data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
  795. data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
  796. data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
  797. data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
  798. data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
  799. data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
  800. data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
  801. data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
  802. data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
  803. data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
  804. data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
  805. data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
  806. data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
  807. data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
  808. data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
  809. data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
  810. data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
  811. data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
  812. data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
  813. data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
  814. data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
  815. data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
  816. data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
  817. data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
  818. data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
  819. data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
  820. data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
  821. data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
  822. data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
  823. data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
  824. data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
  825. data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
  826. data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
  827. data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
  828. data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
  829. data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
  830. data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
  831. data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
  832. data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
  833. data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
  834. data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
  835. data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
  836. data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
  837. data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
  838. data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
  839. data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
  840. data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
  841. data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
  842. data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
  843. data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
  844. data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
  845. data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
  846. data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
  847. data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
  848. data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
  849. data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
  850. data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
  851. data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
  852. data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
  853. data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
  854. data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
  855. data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
  856. data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
  857. data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
  858. data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
  859. data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
  860. data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
  861. data/lib/exiftool_vendored.rb +10 -0
  862. data/lib/exiftool_vendored/version.rb +3 -0
  863. data/lib/exiftool_vendored/version_extractor.rb +17 -0
  864. metadata +977 -0
@@ -0,0 +1,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
+