exiftool_vendored 9.45.0 → 9.46.0

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

Potentially problematic release.


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

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