exiftool_vendored 9.45.0 → 9.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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,4596 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: Exif.pm
3
+ #
4
+ # Description: Read EXIF/TIFF meta information
5
+ #
6
+ # Revisions: 11/25/2003 - P. Harvey Created
7
+ # 02/06/2004 - P. Harvey Moved processing functions from ExifTool
8
+ # 03/19/2004 - P. Harvey Check PreviewImage for validity
9
+ # 11/11/2004 - P. Harvey Split off maker notes into MakerNotes.pm
10
+ # 12/13/2004 - P. Harvey Added AUTOLOAD to load write routines
11
+ #
12
+ # References: 0) http://www.exif.org/Exif2-2.PDF
13
+ # 1) http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf
14
+ # 2) http://www.adobe.com/products/dng/pdfs/dng_spec_1_3_0_0.pdf
15
+ # 3) http://www.awaresystems.be/imaging/tiff/tifftags.html
16
+ # 4) http://www.remotesensing.org/libtiff/TIFFTechNote2.html
17
+ # 5) http://www.exif.org/dcf.PDF
18
+ # 6) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
19
+ # 7) http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf
20
+ # 8) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
21
+ # 9) http://hul.harvard.edu/jhove/tiff-tags.html
22
+ # 10) http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf
23
+ # 11) Robert Mucke private communication
24
+ # 12) http://www.broomscloset.com/closet/photo/exif/TAG2000-22_DIS12234-2.PDF
25
+ # 13) http://www.microsoft.com/whdc/xps/wmphoto.mspx
26
+ # 14) http://www.asmail.be/msg0054681802.html
27
+ # 15) http://crousseau.free.fr/imgfmt_raw.htm
28
+ # 16) http://www.cybercom.net/~dcoffin/dcraw/
29
+ # 17) http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml
30
+ # 18) http://www.asmail.be/msg0055568584.html
31
+ # 19) http://libpsd.graphest.com/files/Photoshop%20File%20Formats.pdf
32
+ # 20) http://tiki-lounge.com/~raf/tiff/fields.html
33
+ # 21) http://community.roxen.com/developers/idocs/rfc/rfc3949.html
34
+ # 22) http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01
35
+ # 23) MetaMorph Stack (STK) Image File Format:
36
+ # --> ftp://ftp.meta.moleculardevices.com/support/stack/STK.doc
37
+ # 24) http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf (Exif 2.3)
38
+ # 25) Vesa Kivisto private communication (7D)
39
+ # 26) Jeremy Brown private communication
40
+ # 27) Gregg Lee private communication
41
+ # 28) http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf
42
+ # JD) Jens Duttke private communication
43
+ #------------------------------------------------------------------------------
44
+
45
+ package Image::ExifTool::Exif;
46
+
47
+ use strict;
48
+ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
49
+ %lightSource %flash %compression %photometricInterpretation %orientation
50
+ %subfileType);
51
+ use Image::ExifTool qw(:DataAccess :Utils);
52
+ use Image::ExifTool::MakerNotes;
53
+
54
+ $VERSION = '3.60';
55
+
56
+ sub ProcessExif($$$);
57
+ sub WriteExif($$$);
58
+ sub CheckExif($$$);
59
+ sub RebuildMakerNotes($$$);
60
+ sub EncodeExifText($$);
61
+ sub ValidateIFD($;$);
62
+ sub ProcessTiffIFD($$$);
63
+ sub PrintParameter($$$);
64
+ sub GetOffList($$$$$);
65
+ sub PrintLensInfo($);
66
+ sub ConvertLensInfo($);
67
+
68
+ # size limit for loading binary data block into memory
69
+ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
70
+
71
+ # byte sizes for the various EXIF format types below
72
+ @formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8);
73
+
74
+ @formatName = (
75
+ undef, 'int8u', 'string', 'int16u',
76
+ 'int32u', 'rational64u','int8s', 'undef',
77
+ 'int16s', 'int32s', 'rational64s','float',
78
+ 'double', 'ifd', 'unicode', 'complex',
79
+ 'int64u', 'int64s', 'ifd64', # (new BigTIFF formats)
80
+ );
81
+
82
+ # hash to look up EXIF format numbers by name
83
+ # (format types are all lower case)
84
+ %formatNumber = (
85
+ 'int8u' => 1, # BYTE
86
+ 'string' => 2, # ASCII
87
+ 'int16u' => 3, # SHORT
88
+ 'int32u' => 4, # LONG
89
+ 'rational64u' => 5, # RATIONAL
90
+ 'int8s' => 6, # SBYTE
91
+ 'undef' => 7, # UNDEFINED
92
+ 'binary' => 7, # (treat binary data as undef)
93
+ 'int16s' => 8, # SSHORT
94
+ 'int32s' => 9, # SLONG
95
+ 'rational64s' => 10, # SRATIONAL
96
+ 'float' => 11, # FLOAT
97
+ 'double' => 12, # DOUBLE
98
+ 'ifd' => 13, # IFD (with int32u format)
99
+ 'unicode' => 14, # UNICODE [see Note below]
100
+ 'complex' => 15, # COMPLEX [see Note below]
101
+ 'int64u' => 16, # LONG8 [BigTIFF]
102
+ 'int64s' => 17, # SLONG8 [BigTIFF]
103
+ 'ifd64' => 18, # IFD8 (with int64u format) [BigTIFF]
104
+ # Note: unicode and complex types are not yet properly supported by ExifTool.
105
+ # These are types which have been observed in the Adobe DNG SDK code, but
106
+ # aren't fully supported there either. We know the sizes, but that's about it.
107
+ # We don't know if the unicode is null terminated, or the format for complex
108
+ # (although I suspect it would be two 4-byte floats, real and imaginary).
109
+ );
110
+
111
+ # lookup for integer format strings
112
+ %intFormat = (
113
+ 'int8u' => 1,
114
+ 'int16u' => 3,
115
+ 'int32u' => 4,
116
+ 'int8s' => 6,
117
+ 'int16s' => 8,
118
+ 'int32s' => 9,
119
+ 'ifd' => 13,
120
+ 'int64u' => 16,
121
+ 'int64s' => 17,
122
+ 'ifd64' => 18,
123
+ );
124
+
125
+ # EXIF LightSource PrintConv values
126
+ %lightSource = (
127
+ 0 => 'Unknown',
128
+ 1 => 'Daylight',
129
+ 2 => 'Fluorescent',
130
+ 3 => 'Tungsten (Incandescent)',
131
+ 4 => 'Flash',
132
+ 9 => 'Fine Weather',
133
+ 10 => 'Cloudy',
134
+ 11 => 'Shade',
135
+ 12 => 'Daylight Fluorescent', # (D 5700 - 7100K)
136
+ 13 => 'Day White Fluorescent', # (N 4600 - 5500K)
137
+ 14 => 'Cool White Fluorescent', # (W 3800 - 4500K)
138
+ 15 => 'White Fluorescent', # (WW 3250 - 3800K)
139
+ 16 => 'Warm White Fluorescent', # (L 2600 - 3250K)
140
+ 17 => 'Standard Light A',
141
+ 18 => 'Standard Light B',
142
+ 19 => 'Standard Light C',
143
+ 20 => 'D55',
144
+ 21 => 'D65',
145
+ 22 => 'D75',
146
+ 23 => 'D50',
147
+ 24 => 'ISO Studio Tungsten',
148
+ 255 => 'Other',
149
+ );
150
+
151
+ # EXIF Flash values
152
+ %flash = (
153
+ OTHER => sub {
154
+ # translate "Off" and "On" when writing
155
+ my ($val, $inv) = @_;
156
+ return undef unless $inv and $val =~ /^(off|on)$/i;
157
+ return lc $val eq 'off' ? 0x00 : 0x01;
158
+ },
159
+ 0x00 => 'No Flash',
160
+ 0x01 => 'Fired',
161
+ 0x05 => 'Fired, Return not detected',
162
+ 0x07 => 'Fired, Return detected',
163
+ 0x08 => 'On, Did not fire', # not charged up?
164
+ 0x09 => 'On, Fired',
165
+ 0x0d => 'On, Return not detected',
166
+ 0x0f => 'On, Return detected',
167
+ 0x10 => 'Off, Did not fire',
168
+ 0x14 => 'Off, Did not fire, Return not detected',
169
+ 0x18 => 'Auto, Did not fire',
170
+ 0x19 => 'Auto, Fired',
171
+ 0x1d => 'Auto, Fired, Return not detected',
172
+ 0x1f => 'Auto, Fired, Return detected',
173
+ 0x20 => 'No flash function',
174
+ 0x30 => 'Off, No flash function',
175
+ 0x41 => 'Fired, Red-eye reduction',
176
+ 0x45 => 'Fired, Red-eye reduction, Return not detected',
177
+ 0x47 => 'Fired, Red-eye reduction, Return detected',
178
+ 0x49 => 'On, Red-eye reduction',
179
+ 0x4d => 'On, Red-eye reduction, Return not detected',
180
+ 0x4f => 'On, Red-eye reduction, Return detected',
181
+ 0x50 => 'Off, Red-eye reduction',
182
+ 0x58 => 'Auto, Did not fire, Red-eye reduction',
183
+ 0x59 => 'Auto, Fired, Red-eye reduction',
184
+ 0x5d => 'Auto, Fired, Red-eye reduction, Return not detected',
185
+ 0x5f => 'Auto, Fired, Red-eye reduction, Return detected',
186
+ );
187
+
188
+ # TIFF Compression values
189
+ # (values with format "Xxxxx XXX Compressed" are used to identify RAW file types)
190
+ %compression = (
191
+ 1 => 'Uncompressed',
192
+ 2 => 'CCITT 1D',
193
+ 3 => 'T4/Group 3 Fax',
194
+ 4 => 'T6/Group 4 Fax',
195
+ 5 => 'LZW',
196
+ 6 => 'JPEG (old-style)', #3
197
+ 7 => 'JPEG', #4
198
+ 8 => 'Adobe Deflate', #3
199
+ 9 => 'JBIG B&W', #3
200
+ 10 => 'JBIG Color', #3
201
+ 99 => 'JPEG', #16
202
+ 262 => 'Kodak 262', #16
203
+ 32766 => 'Next', #3
204
+ 32767 => 'Sony ARW Compressed', #16
205
+ 32769 => 'Packed RAW', #PH (used by Epson, Nikon, Samsung)
206
+ 32770 => 'Samsung SRW Compressed', #PH
207
+ 32771 => 'CCIRLEW', #3
208
+ 32773 => 'PackBits',
209
+ 32809 => 'Thunderscan', #3
210
+ 32867 => 'Kodak KDC Compressed', #PH
211
+ 32895 => 'IT8CTPAD', #3
212
+ 32896 => 'IT8LW', #3
213
+ 32897 => 'IT8MP', #3
214
+ 32898 => 'IT8BL', #3
215
+ 32908 => 'PixarFilm', #3
216
+ 32909 => 'PixarLog', #3
217
+ 32946 => 'Deflate', #3
218
+ 32947 => 'DCS', #3
219
+ 34661 => 'JBIG', #3
220
+ 34676 => 'SGILog', #3
221
+ 34677 => 'SGILog24', #3
222
+ 34712 => 'JPEG 2000', #3
223
+ 34713 => 'Nikon NEF Compressed', #PH
224
+ 34715 => 'JBIG2 TIFF FX', #20
225
+ 34718 => 'Microsoft Document Imaging (MDI) Binary Level Codec', #18
226
+ 34719 => 'Microsoft Document Imaging (MDI) Progressive Transform Codec', #18
227
+ 34720 => 'Microsoft Document Imaging (MDI) Vector', #18
228
+ 34892 => 'Lossy JPEG', # (DNG 1.4)
229
+ 65000 => 'Kodak DCR Compressed', #PH
230
+ 65535 => 'Pentax PEF Compressed', #Jens
231
+ );
232
+
233
+ %photometricInterpretation = (
234
+ 0 => 'WhiteIsZero',
235
+ 1 => 'BlackIsZero',
236
+ 2 => 'RGB',
237
+ 3 => 'RGB Palette',
238
+ 4 => 'Transparency Mask',
239
+ 5 => 'CMYK',
240
+ 6 => 'YCbCr',
241
+ 8 => 'CIELab',
242
+ 9 => 'ICCLab', #3
243
+ 10 => 'ITULab', #3
244
+ 32803 => 'Color Filter Array', #2
245
+ 32844 => 'Pixar LogL', #3
246
+ 32845 => 'Pixar LogLuv', #3
247
+ 34892 => 'Linear Raw', #2
248
+ );
249
+
250
+ %orientation = (
251
+ 1 => 'Horizontal (normal)',
252
+ 2 => 'Mirror horizontal',
253
+ 3 => 'Rotate 180',
254
+ 4 => 'Mirror vertical',
255
+ 5 => 'Mirror horizontal and rotate 270 CW',
256
+ 6 => 'Rotate 90 CW',
257
+ 7 => 'Mirror horizontal and rotate 90 CW',
258
+ 8 => 'Rotate 270 CW',
259
+ );
260
+
261
+ %subfileType = (
262
+ 0 => 'Full-resolution Image',
263
+ 1 => 'Reduced-resolution image',
264
+ 2 => 'Single page of multi-page image',
265
+ 3 => 'Single page of multi-page reduced-resolution image',
266
+ 4 => 'Transparency mask',
267
+ 5 => 'Transparency mask of reduced-resolution image',
268
+ 6 => 'Transparency mask of multi-page image',
269
+ 7 => 'Transparency mask of reduced-resolution multi-page image',
270
+ 0x10001 => 'Alternate reduced-resolution image', # (DNG 1.2)
271
+ 0xffffffff => 'invalid', #(found in E5700 NEF's)
272
+ BITMASK => {
273
+ 0 => 'Reduced resolution',
274
+ 1 => 'Single page',
275
+ 2 => 'Transparency mask',
276
+ 3 => 'TIFF/IT final page', #20
277
+ 4 => 'TIFF-FX mixed raster content', #20
278
+ },
279
+ );
280
+
281
+ # PrintConv for parameter tags
282
+ %Image::ExifTool::Exif::printParameter = (
283
+ PrintConv => {
284
+ 0 => 'Normal',
285
+ OTHER => \&Image::ExifTool::Exif::PrintParameter,
286
+ },
287
+ );
288
+
289
+ # ValueConv that makes long values binary type
290
+ my %longBin = (
291
+ ValueConv => 'length($val) > 64 ? \$val : $val',
292
+ ValueConvInv => '$val',
293
+ );
294
+
295
+ # PrintConv for SampleFormat (0x153)
296
+ my %sampleFormat = (
297
+ 1 => 'Unsigned', # unsigned integer
298
+ 2 => 'Signed', # two's complement signed integer
299
+ 3 => 'Float', # IEEE floating point
300
+ 4 => 'Undefined',
301
+ 5 => 'Complex int', # complex integer (ref 3)
302
+ 6 => 'Complex float', # complex IEEE floating point (ref 3)
303
+ );
304
+
305
+ # main EXIF tag table
306
+ %Image::ExifTool::Exif::Main = (
307
+ GROUPS => { 0 => 'EXIF', 1 => 'IFD0', 2 => 'Image'},
308
+ WRITE_PROC => \&WriteExif,
309
+ WRITE_GROUP => 'ExifIFD', # default write group
310
+ SET_GROUP1 => 1, # set group1 name to directory name for all tags in table
311
+ 0x1 => {
312
+ Name => 'InteropIndex',
313
+ Description => 'Interoperability Index',
314
+ PrintConv => {
315
+ R98 => 'R98 - DCF basic file (sRGB)',
316
+ R03 => 'R03 - DCF option file (Adobe RGB)',
317
+ THM => 'THM - DCF thumbnail file',
318
+ },
319
+ },
320
+ 0x2 => { #5
321
+ Name => 'InteropVersion',
322
+ Description => 'Interoperability Version',
323
+ RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
324
+ },
325
+ 0x0b => { #PH
326
+ Name => 'ProcessingSoftware',
327
+ Notes => 'used by ACD Systems Digital Imaging',
328
+ },
329
+ 0xfe => {
330
+ Name => 'SubfileType',
331
+ # set priority directory if this is the full resolution image
332
+ DataMember => 'SubfileType',
333
+ RawConv => '$self->SetPriorityDir() if $val eq "0"; $$self{SubfileType} = $val',
334
+ PrintConv => \%subfileType,
335
+ },
336
+ 0xff => {
337
+ Name => 'OldSubfileType',
338
+ # set priority directory if this is the full resolution image
339
+ RawConv => '$self->SetPriorityDir() if $val eq "1"; $val',
340
+ PrintConv => {
341
+ 1 => 'Full-resolution image',
342
+ 2 => 'Reduced-resolution image',
343
+ 3 => 'Single page of multi-page image',
344
+ },
345
+ },
346
+ 0x100 => {
347
+ Name => 'ImageWidth',
348
+ # even though Group 1 is set dynamically we need to register IFD1 once
349
+ # so it will show up in the group lists
350
+ Groups => { 1 => 'IFD1' },
351
+ # Note: priority 0 tags automatically have their priority increased for the
352
+ # priority direcory (the directory with a SubfileType of "Full-resolution image")
353
+ Priority => 0,
354
+ },
355
+ 0x101 => {
356
+ Name => 'ImageHeight',
357
+ Notes => 'called ImageLength by the EXIF spec.',
358
+ Priority => 0,
359
+ },
360
+ 0x102 => {
361
+ Name => 'BitsPerSample',
362
+ Priority => 0,
363
+ },
364
+ 0x103 => {
365
+ Name => 'Compression',
366
+ DataMember => 'Compression',
367
+ SeparateTable => 'Compression',
368
+ RawConv => q{
369
+ Image::ExifTool::Exif::IdentifyRawFile($self, $val);
370
+ return $$self{Compression} = $val;
371
+ },
372
+ PrintConv => \%compression,
373
+ Priority => 0,
374
+ },
375
+ 0x106 => {
376
+ Name => 'PhotometricInterpretation',
377
+ PrintConv => \%photometricInterpretation,
378
+ Priority => 0,
379
+ },
380
+ 0x107 => {
381
+ Name => 'Thresholding',
382
+ PrintConv => {
383
+ 1 => 'No dithering or halftoning',
384
+ 2 => 'Ordered dither or halftone',
385
+ 3 => 'Randomized dither',
386
+ },
387
+ },
388
+ 0x108 => 'CellWidth',
389
+ 0x109 => 'CellLength',
390
+ 0x10a => {
391
+ Name => 'FillOrder',
392
+ PrintConv => {
393
+ 1 => 'Normal',
394
+ 2 => 'Reversed',
395
+ },
396
+ },
397
+ 0x10d => 'DocumentName',
398
+ 0x10e => {
399
+ Name => 'ImageDescription',
400
+ Priority => 0,
401
+ },
402
+ 0x10f => {
403
+ Name => 'Make',
404
+ Groups => { 2 => 'Camera' },
405
+ DataMember => 'Make',
406
+ # remove trailing blanks and save as an ExifTool member variable
407
+ RawConv => '$val =~ s/\s+$//; $$self{Make} = $val',
408
+ # NOTE: trailing "blanks" (spaces) are removed from all EXIF tags which
409
+ # may be "unknown" (filled with spaces) according to the EXIF spec.
410
+ # This allows conditional replacement with "exiftool -TAG-= -TAG=VALUE".
411
+ # - also removed are any other trailing whitespace characters
412
+ },
413
+ 0x110 => {
414
+ Name => 'Model',
415
+ Description => 'Camera Model Name',
416
+ Groups => { 2 => 'Camera' },
417
+ DataMember => 'Model',
418
+ # remove trailing blanks and save as an ExifTool member variable
419
+ RawConv => '$val =~ s/\s+$//; $$self{Model} = $val',
420
+ },
421
+ 0x111 => [
422
+ {
423
+ Condition => q[
424
+ $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
425
+ $$self{Model} =~ /^DiMAGE A200/
426
+ ],
427
+ Name => 'StripOffsets',
428
+ IsOffset => 1,
429
+ OffsetPair => 0x117, # point to associated byte counts
430
+ # A200 stores this information in the wrong byte order!!
431
+ ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
432
+ ByteOrder => 'LittleEndian',
433
+ },
434
+ {
435
+ Condition => q[
436
+ ($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
437
+ ($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
438
+ ],
439
+ Name => 'StripOffsets',
440
+ IsOffset => 1,
441
+ OffsetPair => 0x117, # point to associated byte counts
442
+ ValueConv => 'length($val) > 32 ? \$val : $val',
443
+ },
444
+ {
445
+ Condition => '$$self{DIR_NAME} eq "IFD0"',
446
+ Name => 'PreviewImageStart',
447
+ IsOffset => 1,
448
+ OffsetPair => 0x117,
449
+ Notes => q{
450
+ PreviewImageStart in IFD0 of CR2 images and SubIFD1 of DNG images, and
451
+ JpgFromRawStart in SubIFD2 of DNG images
452
+ },
453
+ DataTag => 'PreviewImage',
454
+ Writable => 'int32u',
455
+ WriteGroup => 'IFD0',
456
+ WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
457
+ Protected => 2,
458
+ },
459
+ {
460
+ Condition => '$$self{DIR_NAME} eq "SubIFD1"',
461
+ Name => 'PreviewImageStart',
462
+ IsOffset => 1,
463
+ OffsetPair => 0x117,
464
+ DataTag => 'PreviewImage',
465
+ Writable => 'int32u',
466
+ WriteGroup => 'SubIFD1',
467
+ WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
468
+ Protected => 2,
469
+ },
470
+ {
471
+ Name => 'JpgFromRawStart',
472
+ IsOffset => 1,
473
+ OffsetPair => 0x117,
474
+ DataTag => 'JpgFromRaw',
475
+ Writable => 'int32u',
476
+ WriteGroup => 'SubIFD2',
477
+ WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
478
+ Protected => 2,
479
+ },
480
+ ],
481
+ 0x112 => {
482
+ Name => 'Orientation',
483
+ PrintConv => \%orientation,
484
+ Priority => 0, # so PRIORITY_DIR takes precedence
485
+ },
486
+ 0x115 => {
487
+ Name => 'SamplesPerPixel',
488
+ Priority => 0,
489
+ },
490
+ 0x116 => {
491
+ Name => 'RowsPerStrip',
492
+ Priority => 0,
493
+ },
494
+ 0x117 => [
495
+ {
496
+ Condition => q[
497
+ $$self{TIFF_TYPE} eq 'MRW' and $$self{DIR_NAME} eq 'IFD0' and
498
+ $$self{Model} =~ /^DiMAGE A200/
499
+ ],
500
+ Name => 'StripByteCounts',
501
+ OffsetPair => 0x111, # point to associated offset
502
+ # A200 stores this information in the wrong byte order!!
503
+ ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
504
+ ByteOrder => 'LittleEndian',
505
+ },
506
+ {
507
+ Condition => q[
508
+ ($$self{TIFF_TYPE} ne 'CR2' or $$self{DIR_NAME} ne 'IFD0') and
509
+ ($$self{TIFF_TYPE} ne 'DNG' or $$self{DIR_NAME} !~ /^SubIFD[12]$/)
510
+ ],
511
+ Name => 'StripByteCounts',
512
+ OffsetPair => 0x111, # point to associated offset
513
+ ValueConv => 'length($val) > 32 ? \$val : $val',
514
+ },
515
+ {
516
+ Condition => '$$self{DIR_NAME} eq "IFD0"',
517
+ Name => 'PreviewImageLength',
518
+ OffsetPair => 0x111,
519
+ Notes => q{
520
+ PreviewImageLength in IFD0 of CR2 images and SubIFD1 of DNG images, and
521
+ JpgFromRawLength in SubIFD2 of DNG images
522
+ },
523
+ DataTag => 'PreviewImage',
524
+ Writable => 'int32u',
525
+ WriteGroup => 'IFD0',
526
+ WriteCondition => '$$self{TIFF_TYPE} eq "CR2"',
527
+ Protected => 2,
528
+ },
529
+ {
530
+ Condition => '$$self{DIR_NAME} eq "SubIFD1"',
531
+ Name => 'PreviewImageLength',
532
+ OffsetPair => 0x111,
533
+ DataTag => 'PreviewImage',
534
+ Writable => 'int32u',
535
+ WriteGroup => 'SubIFD1',
536
+ WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
537
+ Protected => 2,
538
+ },
539
+ {
540
+ Name => 'JpgFromRawLength',
541
+ OffsetPair => 0x111,
542
+ DataTag => 'JpgFromRaw',
543
+ Writable => 'int32u',
544
+ WriteGroup => 'SubIFD2',
545
+ WriteCondition => '$$self{TIFF_TYPE} eq "DNG"',
546
+ Protected => 2,
547
+ },
548
+ ],
549
+ 0x118 => 'MinSampleValue',
550
+ 0x119 => 'MaxSampleValue',
551
+ 0x11a => {
552
+ Name => 'XResolution',
553
+ Priority => 0, # so PRIORITY_DIR takes precedence
554
+ },
555
+ 0x11b => {
556
+ Name => 'YResolution',
557
+ Priority => 0,
558
+ },
559
+ 0x11c => {
560
+ Name => 'PlanarConfiguration',
561
+ PrintConv => {
562
+ 1 => 'Chunky',
563
+ 2 => 'Planar',
564
+ },
565
+ Priority => 0,
566
+ },
567
+ 0x11d => 'PageName',
568
+ 0x11e => 'XPosition',
569
+ 0x11f => 'YPosition',
570
+ 0x120 => {
571
+ Name => 'FreeOffsets',
572
+ IsOffset => 1,
573
+ OffsetPair => 0x121,
574
+ ValueConv => 'length($val) > 32 ? \$val : $val',
575
+ },
576
+ 0x121 => {
577
+ Name => 'FreeByteCounts',
578
+ OffsetPair => 0x120,
579
+ ValueConv => 'length($val) > 32 ? \$val : $val',
580
+ },
581
+ 0x122 => {
582
+ Name => 'GrayResponseUnit',
583
+ PrintConv => { #3
584
+ 1 => 0.1,
585
+ 2 => 0.001,
586
+ 3 => 0.0001,
587
+ 4 => 0.00001,
588
+ 5 => 0.000001,
589
+ },
590
+ },
591
+ 0x123 => {
592
+ Name => 'GrayResponseCurve',
593
+ Binary => 1,
594
+ },
595
+ 0x124 => {
596
+ Name => 'T4Options',
597
+ PrintConv => { BITMASK => {
598
+ 0 => '2-Dimensional encoding',
599
+ 1 => 'Uncompressed',
600
+ 2 => 'Fill bits added',
601
+ } }, #3
602
+ },
603
+ 0x125 => {
604
+ Name => 'T6Options',
605
+ PrintConv => { BITMASK => {
606
+ 1 => 'Uncompressed',
607
+ } }, #3
608
+ },
609
+ 0x128 => {
610
+ Name => 'ResolutionUnit',
611
+ Notes => 'the value 1 is not standard EXIF',
612
+ PrintConv => {
613
+ 1 => 'None',
614
+ 2 => 'inches',
615
+ 3 => 'cm',
616
+ },
617
+ Priority => 0,
618
+ },
619
+ 0x129 => 'PageNumber',
620
+ 0x12c => 'ColorResponseUnit', #9
621
+ 0x12d => {
622
+ Name => 'TransferFunction',
623
+ Binary => 1,
624
+ },
625
+ 0x131 => {
626
+ Name => 'Software',
627
+ RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
628
+ },
629
+ 0x132 => {
630
+ Name => 'ModifyDate',
631
+ Groups => { 2 => 'Time' },
632
+ Notes => 'called DateTime by the EXIF spec.',
633
+ PrintConv => '$self->ConvertDateTime($val)',
634
+ },
635
+ 0x13b => {
636
+ Name => 'Artist',
637
+ Groups => { 2 => 'Author' },
638
+ Notes => 'becomes a list-type tag when the MWG module is loaded',
639
+ RawConv => '$val =~ s/\s+$//; $val', # trim trailing blanks
640
+ },
641
+ 0x13c => 'HostComputer',
642
+ 0x13d => {
643
+ Name => 'Predictor',
644
+ PrintConv => {
645
+ 1 => 'None',
646
+ 2 => 'Horizontal differencing',
647
+ },
648
+ },
649
+ 0x13e => {
650
+ Name => 'WhitePoint',
651
+ Groups => { 2 => 'Camera' },
652
+ },
653
+ 0x13f => {
654
+ Name => 'PrimaryChromaticities',
655
+ Priority => 0,
656
+ },
657
+ 0x140 => {
658
+ Name => 'ColorMap',
659
+ Format => 'binary',
660
+ Binary => 1,
661
+ },
662
+ 0x141 => 'HalftoneHints',
663
+ 0x142 => 'TileWidth',
664
+ 0x143 => 'TileLength',
665
+ 0x144 => {
666
+ Name => 'TileOffsets',
667
+ IsOffset => 1,
668
+ OffsetPair => 0x145,
669
+ ValueConv => 'length($val) > 32 ? \$val : $val',
670
+ },
671
+ 0x145 => {
672
+ Name => 'TileByteCounts',
673
+ OffsetPair => 0x144,
674
+ ValueConv => 'length($val) > 32 ? \$val : $val',
675
+ },
676
+ 0x146 => 'BadFaxLines', #3
677
+ 0x147 => { #3
678
+ Name => 'CleanFaxData',
679
+ PrintConv => {
680
+ 0 => 'Clean',
681
+ 1 => 'Regenerated',
682
+ 2 => 'Unclean',
683
+ },
684
+ },
685
+ 0x148 => 'ConsecutiveBadFaxLines', #3
686
+ 0x14a => [
687
+ {
688
+ Name => 'SubIFD',
689
+ # use this opportunity to identify an ARW image, and if so we
690
+ # must decide if this is a SubIFD or the A100 raw data
691
+ # (use SubfileType, Compression and FILE_TYPE to identify ARW/SR2,
692
+ # then call SetARW to finish the job)
693
+ Condition => q{
694
+ $$self{DIR_NAME} ne 'IFD0' or $$self{FILE_TYPE} ne 'TIFF' or
695
+ $$self{Make} !~ /^SONY/ or
696
+ not $$self{SubfileType} or $$self{SubfileType} != 1 or
697
+ not $$self{Compression} or $$self{Compression} != 6 or
698
+ not require Image::ExifTool::Sony or
699
+ Image::ExifTool::Sony::SetARW($self, $valPt)
700
+ },
701
+ Groups => { 1 => 'SubIFD' },
702
+ Flags => 'SubIFD',
703
+ SubDirectory => {
704
+ Start => '$val',
705
+ MaxSubdirs => 10, # (have seen 5 in a DNG 1.4 image)
706
+ },
707
+ },
708
+ { #16
709
+ Name => 'A100DataOffset',
710
+ Notes => 'the data offset in original Sony DSLR-A100 ARW images',
711
+ DataMember => 'A100DataOffset',
712
+ RawConv => '$$self{A100DataOffset} = $val',
713
+ IsOffset => 1,
714
+ Protected => 2,
715
+ },
716
+ ],
717
+ 0x14c => {
718
+ Name => 'InkSet',
719
+ PrintConv => { #3
720
+ 1 => 'CMYK',
721
+ 2 => 'Not CMYK',
722
+ },
723
+ },
724
+ 0x14d => 'InkNames', #3
725
+ 0x14e => 'NumberofInks', #3
726
+ 0x150 => 'DotRange',
727
+ 0x151 => 'TargetPrinter',
728
+ 0x152 => {
729
+ Name => 'ExtraSamples',
730
+ PrintConv => { #20
731
+ 0 => 'Unspecified',
732
+ 1 => 'Associated Alpha',
733
+ 2 => 'Unassociated Alpha',
734
+ },
735
+ },
736
+ 0x153 => {
737
+ Name => 'SampleFormat',
738
+ Notes => 'SamplesPerPixel values',
739
+ PrintConvColumns => 2,
740
+ PrintConv => [ \%sampleFormat, \%sampleFormat, \%sampleFormat, \%sampleFormat ],
741
+ },
742
+ 0x154 => 'SMinSampleValue',
743
+ 0x155 => 'SMaxSampleValue',
744
+ 0x156 => 'TransferRange',
745
+ 0x157 => 'ClipPath', #3
746
+ 0x158 => 'XClipPathUnits', #3
747
+ 0x159 => 'YClipPathUnits', #3
748
+ 0x15a => { #3
749
+ Name => 'Indexed',
750
+ PrintConv => { 0 => 'Not indexed', 1 => 'Indexed' },
751
+ },
752
+ 0x15b => {
753
+ Name => 'JPEGTables',
754
+ Binary => 1,
755
+ },
756
+ 0x15f => { #10
757
+ Name => 'OPIProxy',
758
+ PrintConv => {
759
+ 0 => 'Higher resolution image does not exist',
760
+ 1 => 'Higher resolution image exists',
761
+ },
762
+ },
763
+ # 0x181 => 'Decode', #20 (typo! - should be 0x1b1, ref 21)
764
+ # 0x182 => 'DefaultImageColor', #20 (typo! - should be 0x1b2, ref 21)
765
+ 0x190 => { #3
766
+ Name => 'GlobalParametersIFD',
767
+ Groups => { 1 => 'GlobParamIFD' },
768
+ Flags => 'SubIFD',
769
+ SubDirectory => {
770
+ DirName => 'GlobParamIFD',
771
+ Start => '$val',
772
+ MaxSubdirs => 1,
773
+ },
774
+ },
775
+ 0x191 => { #3
776
+ Name => 'ProfileType',
777
+ PrintConv => { 0 => 'Unspecified', 1 => 'Group 3 FAX' },
778
+ },
779
+ 0x192 => { #3
780
+ Name => 'FaxProfile',
781
+ PrintConv => {
782
+ 0 => 'Unknown',
783
+ 1 => 'Minimal B&W lossless, S',
784
+ 2 => 'Extended B&W lossless, F',
785
+ 3 => 'Lossless JBIG B&W, J',
786
+ 4 => 'Lossy color and grayscale, C',
787
+ 5 => 'Lossless color and grayscale, L',
788
+ 6 => 'Mixed raster content, M',
789
+ 7 => 'Profile T', #20
790
+ 255 => 'Multi Profiles', #20
791
+ },
792
+ },
793
+ 0x193 => { #3
794
+ Name => 'CodingMethods',
795
+ PrintConv => { BITMASK => {
796
+ 0 => 'Unspecified compression',
797
+ 1 => 'Modified Huffman',
798
+ 2 => 'Modified Read',
799
+ 3 => 'Modified MR',
800
+ 4 => 'JBIG',
801
+ 5 => 'Baseline JPEG',
802
+ 6 => 'JBIG color',
803
+ } },
804
+ },
805
+ 0x194 => 'VersionYear', #3
806
+ 0x195 => 'ModeNumber', #3
807
+ 0x1b1 => 'Decode', #3
808
+ 0x1b2 => 'DefaultImageColor', #3 (changed to ImageBaseColor, ref 21)
809
+ 0x1b3 => 'T82Options', #20
810
+ 0x1b5 => { #19
811
+ Name => 'JPEGTables',
812
+ Binary => 1,
813
+ },
814
+ 0x200 => {
815
+ Name => 'JPEGProc',
816
+ PrintConv => {
817
+ 1 => 'Baseline',
818
+ 14 => 'Lossless',
819
+ },
820
+ },
821
+ 0x201 => [
822
+ {
823
+ Name => 'ThumbnailOffset',
824
+ Notes => q{
825
+ ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
826
+ images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
827
+ PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images;
828
+ JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and
829
+ OtherImageStart in everything else
830
+ },
831
+ # thumbnail is found in IFD1 of JPEG and TIFF images, and
832
+ # IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos
833
+ Condition => q{
834
+ $$self{DIR_NAME} eq 'IFD1' or
835
+ ($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/)
836
+ },
837
+ IsOffset => 1,
838
+ OffsetPair => 0x202,
839
+ DataTag => 'ThumbnailImage',
840
+ Writable => 'int32u',
841
+ WriteGroup => 'IFD1',
842
+ # according to the EXIF spec. a JPEG-compressed thumbnail image may not
843
+ # be stored in a TIFF file, but these TIFF-based RAW image formats
844
+ # use IFD1 for a JPEG-compressed thumbnail: CR2, ARW, SR2 and PEF.
845
+ # (SRF also stores a JPEG image in IFD1, but it is actually a preview
846
+ # and we don't yet write SRF anyway)
847
+ WriteCondition => q{
848
+ $$self{FILE_TYPE} ne "TIFF" or
849
+ $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
850
+ },
851
+ Protected => 2,
852
+ },
853
+ {
854
+ Name => 'ThumbnailOffset',
855
+ # thumbnail in IFD0 of MRW images (Minolta A200)
856
+ # and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100)
857
+ Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/',
858
+ IsOffset => 1,
859
+ OffsetPair => 0x202,
860
+ # A200 uses the wrong base offset for this pointer!!
861
+ WrongBase => '$$self{Model} =~ /^DiMAGE A200/ ? $$self{MRW_WrongBase} : undef',
862
+ DataTag => 'ThumbnailImage',
863
+ Writable => 'int32u',
864
+ WriteGroup => 'IFD0',
865
+ WriteCondition => '$$self{FILE_TYPE} =~ /^(MRW|NRW)$/',
866
+ Protected => 2,
867
+ },
868
+ {
869
+ Name => 'ThumbnailOffset',
870
+ # in SubIFD of IFD1 in Samsung SRW images
871
+ Condition => q{
872
+ $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
873
+ $$self{PATH}[-2] eq 'IFD1'
874
+ },
875
+ IsOffset => 1,
876
+ OffsetPair => 0x202,
877
+ DataTag => 'ThumbnailImage',
878
+ Writable => 'int32u',
879
+ WriteGroup => 'SubIFD',
880
+ WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
881
+ Protected => 2,
882
+ },
883
+ {
884
+ Name => 'PreviewImageStart',
885
+ Condition => '$$self{DIR_NAME} eq "MakerNotes"',
886
+ IsOffset => 1,
887
+ OffsetPair => 0x202,
888
+ DataTag => 'PreviewImage',
889
+ Writable => 'int32u',
890
+ WriteGroup => 'MakerNotes',
891
+ # (no WriteCondition necessary because MakerNotes won't be created)
892
+ Protected => 2,
893
+ },
894
+ {
895
+ Name => 'PreviewImageStart',
896
+ # PreviewImage in IFD0 of ARW and SR2 files for all models
897
+ Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
898
+ IsOffset => 1,
899
+ OffsetPair => 0x202,
900
+ DataTag => 'PreviewImage',
901
+ Writable => 'int32u',
902
+ WriteGroup => 'IFD0',
903
+ WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
904
+ Protected => 2,
905
+ },
906
+ {
907
+ Name => 'JpgFromRawStart',
908
+ Condition => '$$self{DIR_NAME} eq "SubIFD"',
909
+ IsOffset => 1,
910
+ OffsetPair => 0x202,
911
+ DataTag => 'JpgFromRaw',
912
+ Writable => 'int32u',
913
+ WriteGroup => 'SubIFD',
914
+ # JpgFromRaw is in SubIFD of NEF, NRW and SRW files
915
+ WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
916
+ Protected => 2,
917
+ },
918
+ {
919
+ Name => 'JpgFromRawStart',
920
+ Condition => '$$self{DIR_NAME} eq "IFD2"',
921
+ IsOffset => 1,
922
+ OffsetPair => 0x202,
923
+ DataTag => 'JpgFromRaw',
924
+ Writable => 'int32u',
925
+ WriteGroup => 'IFD2',
926
+ # JpgFromRaw is in IFD2 of PEF files
927
+ WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
928
+ Protected => 2,
929
+ },
930
+ {
931
+ Name => 'OtherImageStart',
932
+ Condition => '$$self{DIR_NAME} eq "SubIFD1"',
933
+ IsOffset => 1,
934
+ OffsetPair => 0x202,
935
+ DataTag => 'OtherImage',
936
+ Writable => 'int32u',
937
+ WriteGroup => 'SubIFD1',
938
+ Protected => 2,
939
+ Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
940
+ },
941
+ {
942
+ Name => 'OtherImageStart',
943
+ Condition => '$$self{DIR_NAME} eq "SubIFD2"',
944
+ IsOffset => 1,
945
+ OffsetPair => 0x202,
946
+ DataTag => 'OtherImage',
947
+ Writable => 'int32u',
948
+ WriteGroup => 'SubIFD2',
949
+ Protected => 2,
950
+ Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
951
+ },
952
+ {
953
+ Name => 'OtherImageStart',
954
+ IsOffset => 1,
955
+ OffsetPair => 0x202,
956
+ },
957
+ ],
958
+ 0x202 => [
959
+ {
960
+ Name => 'ThumbnailLength',
961
+ Notes => q{
962
+ ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
963
+ images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
964
+ PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
965
+ JpgFromRawLength in SubIFD of NEF images, and IFD2 of PEF images; and
966
+ OtherImageLength in everything else
967
+ },
968
+ Condition => q{
969
+ $$self{DIR_NAME} eq 'IFD1' or
970
+ ($$self{DIR_NAME} eq 'IFD0' and $$self{FILE_TYPE} =~ /^(RIFF|MOV)$/)
971
+ },
972
+ OffsetPair => 0x201,
973
+ DataTag => 'ThumbnailImage',
974
+ Writable => 'int32u',
975
+ WriteGroup => 'IFD1',
976
+ WriteCondition => q{
977
+ $$self{FILE_TYPE} ne "TIFF" or
978
+ $$self{TIFF_TYPE} =~ /^(CR2|ARW|SR2|PEF)$/
979
+ },
980
+ Protected => 2,
981
+ },
982
+ {
983
+ Name => 'ThumbnailLength',
984
+ # thumbnail in IFD0 of MRW images (Minolta A200)
985
+ # and IFD0 of NRW images (Nikon Coolpix P6000,P7000,P7100)
986
+ Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(MRW|NRW)$/',
987
+ OffsetPair => 0x201,
988
+ DataTag => 'ThumbnailImage',
989
+ Writable => 'int32u',
990
+ WriteGroup => 'IFD0',
991
+ WriteCondition => '$$self{FILE_TYPE} =~ /^(MRW|NRW)$/',
992
+ Protected => 2,
993
+ },
994
+ {
995
+ Name => 'ThumbnailLength',
996
+ # in SubIFD of IFD1 in Samsung SRW images
997
+ Condition => q{
998
+ $$self{TIFF_TYPE} eq 'SRW' and $$self{DIR_NAME} eq 'SubIFD' and
999
+ $$self{PATH}[-2] eq 'IFD1'
1000
+ },
1001
+ OffsetPair => 0x201,
1002
+ DataTag => 'ThumbnailImage',
1003
+ Writable => 'int32u',
1004
+ WriteGroup => 'SubIFD',
1005
+ WriteCondition => '$$self{TIFF_TYPE} eq "SRW"',
1006
+ Protected => 2,
1007
+ },
1008
+ {
1009
+ Name => 'PreviewImageLength',
1010
+ Condition => '$$self{DIR_NAME} eq "MakerNotes"',
1011
+ OffsetPair => 0x201,
1012
+ DataTag => 'PreviewImage',
1013
+ Writable => 'int32u',
1014
+ WriteGroup => 'MakerNotes',
1015
+ # (no WriteCondition necessary because MakerNotes won't be created)
1016
+ Protected => 2,
1017
+ },
1018
+ {
1019
+ Name => 'PreviewImageLength',
1020
+ # PreviewImage in IFD0 of ARW and SR2 files for all models
1021
+ Condition => '$$self{DIR_NAME} eq "IFD0" and $$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
1022
+ OffsetPair => 0x201,
1023
+ DataTag => 'PreviewImage',
1024
+ Writable => 'int32u',
1025
+ WriteGroup => 'IFD0',
1026
+ WriteCondition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
1027
+ Protected => 2,
1028
+ },
1029
+ {
1030
+ Name => 'JpgFromRawLength',
1031
+ Condition => '$$self{DIR_NAME} eq "SubIFD"',
1032
+ OffsetPair => 0x201,
1033
+ DataTag => 'JpgFromRaw',
1034
+ Writable => 'int32u',
1035
+ WriteGroup => 'SubIFD',
1036
+ WriteCondition => '$$self{TIFF_TYPE} =~ /^(NEF|NRW|SRW)$/',
1037
+ Protected => 2,
1038
+ },
1039
+ {
1040
+ Name => 'JpgFromRawLength',
1041
+ Condition => '$$self{DIR_NAME} eq "IFD2"',
1042
+ OffsetPair => 0x201,
1043
+ DataTag => 'JpgFromRaw',
1044
+ Writable => 'int32u',
1045
+ WriteGroup => 'IFD2',
1046
+ WriteCondition => '$$self{TIFF_TYPE} eq "PEF"',
1047
+ Protected => 2,
1048
+ },
1049
+ {
1050
+ Name => 'OtherImageLength',
1051
+ Condition => '$$self{DIR_NAME} eq "SubIFD1"',
1052
+ OffsetPair => 0x201,
1053
+ DataTag => 'OtherImage',
1054
+ Writable => 'int32u',
1055
+ WriteGroup => 'SubIFD1',
1056
+ Protected => 2,
1057
+ Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
1058
+ },
1059
+ {
1060
+ Name => 'OtherImageLength',
1061
+ Condition => '$$self{DIR_NAME} eq "SubIFD2"',
1062
+ OffsetPair => 0x201,
1063
+ DataTag => 'OtherImage',
1064
+ Writable => 'int32u',
1065
+ WriteGroup => 'SubIFD2',
1066
+ Protected => 2,
1067
+ Permanent => 1, # (don't add/delete this tag: makes WriteCondition unnecessary)
1068
+ },
1069
+ {
1070
+ Name => 'OtherImageLength',
1071
+ OffsetPair => 0x201,
1072
+ },
1073
+ ],
1074
+ 0x203 => 'JPEGRestartInterval',
1075
+ 0x205 => 'JPEGLosslessPredictors',
1076
+ 0x206 => 'JPEGPointTransforms',
1077
+ 0x207 => {
1078
+ Name => 'JPEGQTables',
1079
+ IsOffset => 1,
1080
+ # this tag is not supported for writing, so define an
1081
+ # invalid offset pair to cause a "No size tag" error to be
1082
+ # generated if we try to write a file containing this tag
1083
+ OffsetPair => -1,
1084
+ },
1085
+ 0x208 => {
1086
+ Name => 'JPEGDCTables',
1087
+ IsOffset => 1,
1088
+ OffsetPair => -1, # (see comment for JPEGQTables)
1089
+ },
1090
+ 0x209 => {
1091
+ Name => 'JPEGACTables',
1092
+ IsOffset => 1,
1093
+ OffsetPair => -1, # (see comment for JPEGQTables)
1094
+ },
1095
+ 0x211 => {
1096
+ Name => 'YCbCrCoefficients',
1097
+ Priority => 0,
1098
+ },
1099
+ 0x212 => {
1100
+ Name => 'YCbCrSubSampling',
1101
+ PrintConvColumns => 2,
1102
+ PrintConv => \%Image::ExifTool::JPEG::yCbCrSubSampling,
1103
+ Priority => 0,
1104
+ },
1105
+ 0x213 => {
1106
+ Name => 'YCbCrPositioning',
1107
+ PrintConv => {
1108
+ 1 => 'Centered',
1109
+ 2 => 'Co-sited',
1110
+ },
1111
+ Priority => 0,
1112
+ },
1113
+ 0x214 => {
1114
+ Name => 'ReferenceBlackWhite',
1115
+ Priority => 0,
1116
+ },
1117
+ 0x22f => 'StripRowCounts',
1118
+ 0x2bc => {
1119
+ Name => 'ApplicationNotes', # (writable directory!)
1120
+ Writable => 'int8u',
1121
+ Format => 'undef',
1122
+ Flags => [ 'Binary', 'Protected' ],
1123
+ # this could be an XMP block
1124
+ SubDirectory => {
1125
+ DirName => 'XMP',
1126
+ TagTable => 'Image::ExifTool::XMP::Main',
1127
+ },
1128
+ },
1129
+ 0x3e7 => 'USPTOMiscellaneous', #20
1130
+ 0x1000 => 'RelatedImageFileFormat', #5
1131
+ 0x1001 => 'RelatedImageWidth', #5
1132
+ 0x1002 => { #5
1133
+ Name => 'RelatedImageHeight',
1134
+ Notes => 'called RelatedImageLength by the DCF spec.',
1135
+ },
1136
+ # (0x474x tags written by MicrosoftPhoto)
1137
+ 0x4746 => 'Rating', #PH
1138
+ 0x4747 => { # (written by Digital Image Pro)
1139
+ Name => 'XP_DIP_XML',
1140
+ Format => 'undef',
1141
+ # the following reference indicates this is Unicode:
1142
+ # http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/ce6edcbb-8fc2-40c6-ad98-85f5d835ddfb
1143
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1144
+ },
1145
+ 0x4748 => {
1146
+ Name => 'StitchInfo',
1147
+ SubDirectory => {
1148
+ TagTable => 'Image::ExifTool::Microsoft::Stitch',
1149
+ ByteOrder => 'LittleEndian', #PH (NC)
1150
+ },
1151
+ },
1152
+ 0x4749 => 'RatingPercent', #PH
1153
+ 0x800d => 'ImageID', #10
1154
+ 0x80a3 => { Name => 'WangTag1', Binary => 1 }, #20
1155
+ 0x80a4 => { Name => 'WangAnnotation', Binary => 1 },
1156
+ 0x80a5 => { Name => 'WangTag3', Binary => 1 }, #20
1157
+ 0x80a6 => { #20
1158
+ Name => 'WangTag4',
1159
+ PrintConv => 'length($val) <= 64 ? $val : \$val',
1160
+ },
1161
+ 0x80e3 => 'Matteing', #9
1162
+ 0x80e4 => 'DataType', #9
1163
+ 0x80e5 => 'ImageDepth', #9
1164
+ 0x80e6 => 'TileDepth', #9
1165
+ 0x827d => 'Model2',
1166
+ 0x828d => 'CFARepeatPatternDim', #12
1167
+ 0x828e => {
1168
+ Name => 'CFAPattern2', #12
1169
+ Format => 'int8u', # (written incorrectly as 'undef' in Nikon NRW images)
1170
+ },
1171
+ 0x828f => { #12
1172
+ Name => 'BatteryLevel',
1173
+ Groups => { 2 => 'Camera' },
1174
+ },
1175
+ 0x8290 => {
1176
+ Name => 'KodakIFD',
1177
+ Groups => { 1 => 'KodakIFD' },
1178
+ Flags => 'SubIFD',
1179
+ Notes => 'used in various types of Kodak images',
1180
+ SubDirectory => {
1181
+ TagTable => 'Image::ExifTool::Kodak::IFD',
1182
+ DirName => 'KodakIFD',
1183
+ Start => '$val',
1184
+ MaxSubdirs => 1,
1185
+ },
1186
+ },
1187
+ 0x8298 => {
1188
+ Name => 'Copyright',
1189
+ Groups => { 2 => 'Author' },
1190
+ Format => 'undef',
1191
+ Notes => q{
1192
+ may contain copyright notices for photographer and editor, separated by a
1193
+ newline in ExifTool
1194
+ },
1195
+ # internally the strings are separated by a null character in this format:
1196
+ # Photographer only: photographer + NULL
1197
+ # Both: photographer + NULL + editor + NULL
1198
+ # Editor only: SPACE + NULL + editor + NULL
1199
+ # (this is done as a RawConv so conditional replaces will work properly)
1200
+ RawConv => sub {
1201
+ my ($val, $self) = @_;
1202
+ $val =~ s/ *\0/\n/; # translate first NULL to a newline, removing trailing blanks
1203
+ $val =~ s/ *\0.*//s; # truncate at second NULL and remove trailing blanks
1204
+ $val =~ s/\n$//; # remove trailing newline if it exists
1205
+ # decode if necessary (note: this is the only non-'string' EXIF value like this)
1206
+ my $enc = $self->Options('CharsetEXIF');
1207
+ $val = $self->Decode($val,$enc) if $enc;
1208
+ return $val;
1209
+ },
1210
+ },
1211
+ 0x829a => {
1212
+ Name => 'ExposureTime',
1213
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1214
+ },
1215
+ 0x829d => {
1216
+ Name => 'FNumber',
1217
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
1218
+ },
1219
+ 0x82a5 => { #3
1220
+ Name => 'MDFileTag',
1221
+ Notes => 'tags 0x82a5-0x82ac are used in Molecular Dynamics GEL files',
1222
+ },
1223
+ 0x82a6 => 'MDScalePixel', #3
1224
+ 0x82a7 => 'MDColorTable', #3
1225
+ 0x82a8 => 'MDLabName', #3
1226
+ 0x82a9 => 'MDSampleInfo', #3
1227
+ 0x82aa => 'MDPrepDate', #3
1228
+ 0x82ab => 'MDPrepTime', #3
1229
+ 0x82ac => 'MDFileUnits', #3
1230
+ 0x830e => 'PixelScale',
1231
+ 0x8335 => 'AdventScale', #20
1232
+ 0x8336 => 'AdventRevision', #20
1233
+ 0x835c => 'UIC1Tag', #23
1234
+ 0x835d => 'UIC2Tag', #23
1235
+ 0x835e => 'UIC3Tag', #23
1236
+ 0x835f => 'UIC4Tag', #23
1237
+ 0x83bb => { #12
1238
+ Name => 'IPTC-NAA', # (writable directory! -- but see note below)
1239
+ # this should actually be written as 'undef' (see
1240
+ # http://www.awaresystems.be/imaging/tiff/tifftags/iptc.html),
1241
+ # but Photoshop writes it as int32u and Nikon Capture won't read
1242
+ # anything else, so we do the same thing here... Doh!
1243
+ Format => 'undef', # convert binary values as undef
1244
+ Writable => 'int32u', # but write int32u format code in IFD
1245
+ WriteGroup => 'IFD0',
1246
+ Flags => [ 'Binary', 'Protected' ],
1247
+ SubDirectory => {
1248
+ DirName => 'IPTC',
1249
+ TagTable => 'Image::ExifTool::IPTC::Main',
1250
+ },
1251
+ # Note: This directory may be written as a block via the IPTC-NAA tag,
1252
+ # but this technique is not recommended. Instead, it is better to
1253
+ # write the Extra IPTC tag and let ExifTool decide where it should go.
1254
+ },
1255
+ 0x847e => 'IntergraphPacketData', #3
1256
+ 0x847f => 'IntergraphFlagRegisters', #3
1257
+ 0x8480 => 'IntergraphMatrix',
1258
+ 0x8481 => 'INGRReserved', #20
1259
+ 0x8482 => {
1260
+ Name => 'ModelTiePoint',
1261
+ Groups => { 2 => 'Location' },
1262
+ },
1263
+ 0x84e0 => 'Site', #9
1264
+ 0x84e1 => 'ColorSequence', #9
1265
+ 0x84e2 => 'IT8Header', #9
1266
+ 0x84e3 => { #9
1267
+ Name => 'RasterPadding',
1268
+ PrintConv => { #20
1269
+ 0 => 'Byte',
1270
+ 1 => 'Word',
1271
+ 2 => 'Long Word',
1272
+ 9 => 'Sector',
1273
+ 10 => 'Long Sector',
1274
+ },
1275
+ },
1276
+ 0x84e4 => 'BitsPerRunLength', #9
1277
+ 0x84e5 => 'BitsPerExtendedRunLength', #9
1278
+ 0x84e6 => 'ColorTable', #9
1279
+ 0x84e7 => { #9
1280
+ Name => 'ImageColorIndicator',
1281
+ PrintConv => { #20
1282
+ 0 => 'Unspecified Image Color',
1283
+ 1 => 'Specified Image Color',
1284
+ },
1285
+ },
1286
+ 0x84e8 => { #9
1287
+ Name => 'BackgroundColorIndicator',
1288
+ PrintConv => { #20
1289
+ 0 => 'Unspecified Background Color',
1290
+ 1 => 'Specified Background Color',
1291
+ },
1292
+ },
1293
+ 0x84e9 => 'ImageColorValue', #9
1294
+ 0x84ea => 'BackgroundColorValue', #9
1295
+ 0x84eb => 'PixelIntensityRange', #9
1296
+ 0x84ec => 'TransparencyIndicator', #9
1297
+ 0x84ed => 'ColorCharacterization', #9
1298
+ 0x84ee => { #9
1299
+ Name => 'HCUsage',
1300
+ PrintConv => { #20
1301
+ 0 => 'CT',
1302
+ 1 => 'Line Art',
1303
+ 2 => 'Trap',
1304
+ },
1305
+ },
1306
+ 0x84ef => 'TrapIndicator', #17
1307
+ 0x84f0 => 'CMYKEquivalent', #17
1308
+ 0x8546 => { #11
1309
+ Name => 'SEMInfo',
1310
+ Notes => 'found in some scanning electron microscope images',
1311
+ },
1312
+ 0x8568 => {
1313
+ Name => 'AFCP_IPTC',
1314
+ SubDirectory => {
1315
+ # must change directory name so we don't create this directory
1316
+ DirName => 'AFCP_IPTC',
1317
+ TagTable => 'Image::ExifTool::IPTC::Main',
1318
+ },
1319
+ },
1320
+ 0x85b8 => 'PixelMagicJBIGOptions', #20
1321
+ 0x85d8 => {
1322
+ Name => 'ModelTransform',
1323
+ Groups => { 2 => 'Location' },
1324
+ },
1325
+ 0x8602 => { #16
1326
+ Name => 'WB_GRGBLevels',
1327
+ Notes => 'found in IFD0 of Leaf MOS images',
1328
+ },
1329
+ # 0x8603 - Leaf CatchLight color matrix (ref 16)
1330
+ 0x8606 => {
1331
+ Name => 'LeafData',
1332
+ Format => 'undef', # avoid converting huge block to string of int8u's!
1333
+ SubDirectory => {
1334
+ DirName => 'LeafIFD',
1335
+ TagTable => 'Image::ExifTool::Leaf::Main',
1336
+ },
1337
+ },
1338
+ 0x8649 => { #19
1339
+ Name => 'PhotoshopSettings',
1340
+ Format => 'binary',
1341
+ SubDirectory => {
1342
+ DirName => 'Photoshop',
1343
+ TagTable => 'Image::ExifTool::Photoshop::Main',
1344
+ },
1345
+ },
1346
+ 0x8769 => {
1347
+ Name => 'ExifOffset',
1348
+ Groups => { 1 => 'ExifIFD' },
1349
+ SubIFD => 2,
1350
+ SubDirectory => {
1351
+ DirName => 'ExifIFD',
1352
+ Start => '$val',
1353
+ },
1354
+ },
1355
+ 0x8773 => {
1356
+ Name => 'ICC_Profile',
1357
+ SubDirectory => {
1358
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
1359
+ },
1360
+ },
1361
+ 0x877f => { #20
1362
+ Name => 'TIFF_FXExtensions',
1363
+ PrintConv => { BITMASK => {
1364
+ 0 => 'Resolution/Image Width',
1365
+ 1 => 'N Layer Profile M',
1366
+ 2 => 'Shared Data',
1367
+ 3 => 'B&W JBIG2',
1368
+ 4 => 'JBIG2 Profile M',
1369
+ }},
1370
+ },
1371
+ 0x8780 => { #20
1372
+ Name => 'MultiProfiles',
1373
+ PrintConv => { BITMASK => {
1374
+ 0 => 'Profile S',
1375
+ 1 => 'Profile F',
1376
+ 2 => 'Profile J',
1377
+ 3 => 'Profile C',
1378
+ 4 => 'Profile L',
1379
+ 5 => 'Profile M',
1380
+ 6 => 'Profile T',
1381
+ 7 => 'Resolution/Image Width',
1382
+ 8 => 'N Layer Profile M',
1383
+ 9 => 'Shared Data',
1384
+ 10 => 'JBIG2 Profile M',
1385
+ }},
1386
+ },
1387
+ 0x8781 => { #22
1388
+ Name => 'SharedData',
1389
+ IsOffset => 1,
1390
+ # this tag is not supported for writing, so define an
1391
+ # invalid offset pair to cause a "No size tag" error to be
1392
+ # generated if we try to write a file containing this tag
1393
+ OffsetPair => -1,
1394
+ },
1395
+ 0x8782 => 'T88Options', #20
1396
+ 0x87ac => 'ImageLayer',
1397
+ 0x87af => {
1398
+ Name => 'GeoTiffDirectory',
1399
+ Format => 'binary',
1400
+ Binary => 1,
1401
+ },
1402
+ 0x87b0 => {
1403
+ Name => 'GeoTiffDoubleParams',
1404
+ Format => 'binary',
1405
+ Binary => 1,
1406
+ },
1407
+ 0x87b1 => {
1408
+ Name => 'GeoTiffAsciiParams',
1409
+ Binary => 1,
1410
+ },
1411
+ 0x8822 => {
1412
+ Name => 'ExposureProgram',
1413
+ Groups => { 2 => 'Camera' },
1414
+ Notes => 'the value of 9 is not standard EXIF, but is used by the Canon EOS 7D',
1415
+ PrintConv => {
1416
+ 0 => 'Not Defined',
1417
+ 1 => 'Manual',
1418
+ 2 => 'Program AE',
1419
+ 3 => 'Aperture-priority AE',
1420
+ 4 => 'Shutter speed priority AE',
1421
+ 5 => 'Creative (Slow speed)',
1422
+ 6 => 'Action (High speed)',
1423
+ 7 => 'Portrait',
1424
+ 8 => 'Landscape',
1425
+ 9 => 'Bulb', #25
1426
+ },
1427
+ },
1428
+ 0x8824 => {
1429
+ Name => 'SpectralSensitivity',
1430
+ Groups => { 2 => 'Camera' },
1431
+ },
1432
+ 0x8825 => {
1433
+ Name => 'GPSInfo',
1434
+ Groups => { 1 => 'GPS' },
1435
+ Flags => 'SubIFD',
1436
+ SubDirectory => {
1437
+ DirName => 'GPS',
1438
+ TagTable => 'Image::ExifTool::GPS::Main',
1439
+ Start => '$val',
1440
+ MaxSubdirs => 1,
1441
+ },
1442
+ },
1443
+ 0x8827 => {
1444
+ Name => 'ISO',
1445
+ Notes => q{
1446
+ called ISOSpeedRatings by EXIF 2.2, then PhotographicSensitivity by the EXIF
1447
+ 2.3 spec.
1448
+ },
1449
+ PrintConv => '$val=~s/\s+/, /g; $val',
1450
+ },
1451
+ 0x8828 => {
1452
+ Name => 'Opto-ElectricConvFactor',
1453
+ Notes => 'called OECF by the EXIF spec.',
1454
+ Binary => 1,
1455
+ },
1456
+ 0x8829 => 'Interlace', #12
1457
+ 0x882a => 'TimeZoneOffset', #12
1458
+ 0x882b => 'SelfTimerMode', #12
1459
+ 0x8830 => { #24
1460
+ Name => 'SensitivityType',
1461
+ Notes => 'applies to EXIF:ISO tag',
1462
+ PrintConv => {
1463
+ 0 => 'Unknown',
1464
+ 1 => 'Standard Output Sensitivity',
1465
+ 2 => 'Recommended Exposure Index',
1466
+ 3 => 'ISO Speed',
1467
+ 4 => 'Standard Output Sensitivity and Recommended Exposure Index',
1468
+ 5 => 'Standard Output Sensitivity and ISO Speed',
1469
+ 6 => 'Recommended Exposure Index and ISO Speed',
1470
+ 7 => 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed',
1471
+ },
1472
+ },
1473
+ 0x8831 => 'StandardOutputSensitivity', #24
1474
+ 0x8832 => 'RecommendedExposureIndex', #24
1475
+ 0x8833 => 'ISOSpeed', #24
1476
+ 0x8834 => { #24
1477
+ Name => 'ISOSpeedLatitudeyyy',
1478
+ Description => 'ISO Speed Latitude yyy',
1479
+ },
1480
+ 0x8835 => { #24
1481
+ Name => 'ISOSpeedLatitudezzz',
1482
+ Description => 'ISO Speed Latitude zzz',
1483
+ },
1484
+ 0x885c => 'FaxRecvParams', #9
1485
+ 0x885d => 'FaxSubAddress', #9
1486
+ 0x885e => 'FaxRecvTime', #9
1487
+ 0x888a => { #PH
1488
+ Name => 'LeafSubIFD',
1489
+ Format => 'int32u', # Leaf incorrectly uses 'undef' format!
1490
+ Groups => { 1 => 'LeafSubIFD' },
1491
+ Flags => 'SubIFD',
1492
+ SubDirectory => {
1493
+ TagTable => 'Image::ExifTool::Leaf::SubIFD',
1494
+ Start => '$val',
1495
+ },
1496
+ },
1497
+ 0x9000 => {
1498
+ Name => 'ExifVersion',
1499
+ RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
1500
+ },
1501
+ 0x9003 => {
1502
+ Name => 'DateTimeOriginal',
1503
+ Description => 'Date/Time Original',
1504
+ Groups => { 2 => 'Time' },
1505
+ Notes => 'date/time when original image was taken',
1506
+ PrintConv => '$self->ConvertDateTime($val)',
1507
+ },
1508
+ 0x9004 => {
1509
+ Name => 'CreateDate',
1510
+ Groups => { 2 => 'Time' },
1511
+ Notes => 'called DateTimeDigitized by the EXIF spec.',
1512
+ PrintConv => '$self->ConvertDateTime($val)',
1513
+ },
1514
+ 0x9101 => {
1515
+ Name => 'ComponentsConfiguration',
1516
+ Format => 'int8u',
1517
+ PrintConvColumns => 2,
1518
+ PrintConv => {
1519
+ 0 => '-',
1520
+ 1 => 'Y',
1521
+ 2 => 'Cb',
1522
+ 3 => 'Cr',
1523
+ 4 => 'R',
1524
+ 5 => 'G',
1525
+ 6 => 'B',
1526
+ OTHER => sub {
1527
+ my ($val, $inv, $conv) = @_;
1528
+ my @a = split /,?\s+/, $val;
1529
+ if ($inv) {
1530
+ my %invConv;
1531
+ $invConv{lc $$conv{$_}} = $_ foreach keys %$conv;
1532
+ # strings like "YCbCr" and "RGB" still work for writing
1533
+ @a = $a[0] =~ /(Y|Cb|Cr|R|G|B)/g if @a == 1;
1534
+ foreach (@a) {
1535
+ $_ = $invConv{lc $_};
1536
+ return undef unless defined $_;
1537
+ }
1538
+ push @a, 0 while @a < 4;
1539
+ } else {
1540
+ foreach (@a) {
1541
+ $_ = $$conv{$_} || "Err ($_)";
1542
+ }
1543
+ }
1544
+ return join ', ', @a;
1545
+ },
1546
+ },
1547
+ },
1548
+ 0x9102 => 'CompressedBitsPerPixel',
1549
+ 0x9201 => {
1550
+ Name => 'ShutterSpeedValue',
1551
+ Notes => 'displayed in seconds, but stored as an APEX value',
1552
+ Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
1553
+ ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
1554
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1555
+ },
1556
+ 0x9202 => {
1557
+ Name => 'ApertureValue',
1558
+ Notes => 'displayed as an F number, but stored as an APEX value',
1559
+ ValueConv => '2 ** ($val / 2)',
1560
+ PrintConv => 'sprintf("%.1f",$val)',
1561
+ },
1562
+ # Wikipedia: BrightnessValue = Bv = Av + Tv - Sv
1563
+ # ExifTool: LightValue = LV = Av + Tv - Sv + 5 (5 is the Sv for ISO 100 in Exif usage)
1564
+ 0x9203 => 'BrightnessValue',
1565
+ 0x9204 => {
1566
+ Name => 'ExposureCompensation',
1567
+ Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
1568
+ Notes => 'called ExposureBiasValue by the EXIF spec.',
1569
+ PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
1570
+ },
1571
+ 0x9205 => {
1572
+ Name => 'MaxApertureValue',
1573
+ Notes => 'displayed as an F number, but stored as an APEX value',
1574
+ Groups => { 2 => 'Camera' },
1575
+ ValueConv => '2 ** ($val / 2)',
1576
+ PrintConv => 'sprintf("%.1f",$val)',
1577
+ },
1578
+ 0x9206 => {
1579
+ Name => 'SubjectDistance',
1580
+ Groups => { 2 => 'Camera' },
1581
+ PrintConv => '$val =~ /^(inf|undef)$/ ? $val : "${val} m"',
1582
+ },
1583
+ 0x9207 => {
1584
+ Name => 'MeteringMode',
1585
+ Groups => { 2 => 'Camera' },
1586
+ PrintConv => {
1587
+ 0 => 'Unknown',
1588
+ 1 => 'Average',
1589
+ 2 => 'Center-weighted average',
1590
+ 3 => 'Spot',
1591
+ 4 => 'Multi-spot',
1592
+ 5 => 'Multi-segment',
1593
+ 6 => 'Partial',
1594
+ 255 => 'Other',
1595
+ },
1596
+ },
1597
+ 0x9208 => {
1598
+ Name => 'LightSource',
1599
+ Groups => { 2 => 'Camera' },
1600
+ SeparateTable => 'LightSource',
1601
+ PrintConv => \%lightSource,
1602
+ },
1603
+ 0x9209 => {
1604
+ Name => 'Flash',
1605
+ Groups => { 2 => 'Camera' },
1606
+ Flags => 'PrintHex',
1607
+ SeparateTable => 'Flash',
1608
+ PrintConv => \%flash,
1609
+ },
1610
+ 0x920a => {
1611
+ Name => 'FocalLength',
1612
+ Groups => { 2 => 'Camera' },
1613
+ PrintConv => 'sprintf("%.1f mm",$val)',
1614
+ },
1615
+ # Note: tags 0x920b-0x9217 are duplicates of 0xa20b-0xa217
1616
+ # (The TIFF standard uses 0xa2xx, but you'll find both in images)
1617
+ 0x920b => { #12
1618
+ Name => 'FlashEnergy',
1619
+ Groups => { 2 => 'Camera' },
1620
+ },
1621
+ 0x920c => 'SpatialFrequencyResponse', #12 (not in Fuji images - PH)
1622
+ 0x920d => 'Noise', #12
1623
+ 0x920e => 'FocalPlaneXResolution', #12
1624
+ 0x920f => 'FocalPlaneYResolution', #12
1625
+ 0x9210 => { #12
1626
+ Name => 'FocalPlaneResolutionUnit',
1627
+ Groups => { 2 => 'Camera' },
1628
+ PrintConv => {
1629
+ 1 => 'None',
1630
+ 2 => 'inches',
1631
+ 3 => 'cm',
1632
+ 4 => 'mm',
1633
+ 5 => 'um',
1634
+ },
1635
+ },
1636
+ 0x9211 => 'ImageNumber', #12
1637
+ 0x9212 => { #12
1638
+ Name => 'SecurityClassification',
1639
+ PrintConv => {
1640
+ T => 'Top Secret',
1641
+ S => 'Secret',
1642
+ C => 'Confidential',
1643
+ R => 'Restricted',
1644
+ U => 'Unclassified',
1645
+ },
1646
+ },
1647
+ 0x9213 => 'ImageHistory', #12
1648
+ 0x9214 => {
1649
+ Name => 'SubjectArea',
1650
+ Groups => { 2 => 'Camera' },
1651
+ },
1652
+ 0x9215 => 'ExposureIndex', #12
1653
+ 0x9216 => 'TIFF-EPStandardID', #12
1654
+ 0x9217 => { #12
1655
+ Name => 'SensingMethod',
1656
+ Groups => { 2 => 'Camera' },
1657
+ Notes => 'values 1 and 6 are not standard EXIF',
1658
+ PrintConv => {
1659
+ 1 => 'Monochrome area', #12 (not standard EXIF)
1660
+ 2 => 'One-chip color area',
1661
+ 3 => 'Two-chip color area',
1662
+ 4 => 'Three-chip color area',
1663
+ 5 => 'Color sequential area',
1664
+ 6 => 'Monochrome linear', #12 (not standard EXIF)
1665
+ 7 => 'Trilinear',
1666
+ 8 => 'Color sequential linear',
1667
+ },
1668
+ },
1669
+ 0x923a => 'CIP3DataFile', #20
1670
+ 0x923b => 'CIP3Sheet', #20
1671
+ 0x923c => 'CIP3Side', #20
1672
+ 0x923f => 'StoNits', #9
1673
+ # handle maker notes as a conditional list
1674
+ 0x927c => \@Image::ExifTool::MakerNotes::Main,
1675
+ 0x9286 => {
1676
+ Name => 'UserComment',
1677
+ # I have seen other applications write it incorrectly as 'string' or 'int8u'
1678
+ Format => 'undef',
1679
+ RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1)',
1680
+ },
1681
+ 0x9290 => {
1682
+ Name => 'SubSecTime',
1683
+ Groups => { 2 => 'Time' },
1684
+ ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
1685
+ },
1686
+ 0x9291 => {
1687
+ Name => 'SubSecTimeOriginal',
1688
+ Groups => { 2 => 'Time' },
1689
+ ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
1690
+ },
1691
+ 0x9292 => {
1692
+ Name => 'SubSecTimeDigitized',
1693
+ Groups => { 2 => 'Time' },
1694
+ ValueConv => '$val=~s/ +$//; $val', # trim trailing blanks
1695
+ },
1696
+ # The following 3 tags are found in MSOffice TIFF images
1697
+ # References:
1698
+ # http://social.msdn.microsoft.com/Forums/en-US/os_standocs/thread/03086d55-294a-49d5-967a-5303d34c40f8/
1699
+ # http://blogs.msdn.com/openspecification/archive/2009/12/08/details-of-three-tiff-tag-extensions-that-microsoft-office-document-imaging-modi-software-may-write-into-the-tiff-files-it-generates.aspx
1700
+ # http://www.microsoft.com/downloads/details.aspx?FamilyID=0dbc435d-3544-4f4b-9092-2f2643d64a39&displaylang=en#filelist
1701
+ 0x932f => 'MSDocumentText',
1702
+ 0x9330 => {
1703
+ Name => 'MSPropertySetStorage',
1704
+ Binary => 1,
1705
+ },
1706
+ 0x9331 => {
1707
+ Name => 'MSDocumentTextPosition',
1708
+ Binary => 1, # (just in case -- don't know what format this is)
1709
+ },
1710
+ 0x935c => { #3/19
1711
+ Name => 'ImageSourceData',
1712
+ Binary => 1,
1713
+ Protected => 1, # (because this can be hundreds of megabytes)
1714
+ },
1715
+ 0x9c9b => {
1716
+ Name => 'XPTitle',
1717
+ Format => 'undef',
1718
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1719
+ },
1720
+ 0x9c9c => {
1721
+ Name => 'XPComment',
1722
+ Format => 'undef',
1723
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1724
+ },
1725
+ 0x9c9d => {
1726
+ Name => 'XPAuthor',
1727
+ Groups => { 2 => 'Author' },
1728
+ Format => 'undef',
1729
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1730
+ },
1731
+ 0x9c9e => {
1732
+ Name => 'XPKeywords',
1733
+ Format => 'undef',
1734
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1735
+ },
1736
+ 0x9c9f => {
1737
+ Name => 'XPSubject',
1738
+ Format => 'undef',
1739
+ ValueConv => '$self->Decode($val,"UCS2","II")',
1740
+ },
1741
+ 0xa000 => {
1742
+ Name => 'FlashpixVersion',
1743
+ RawConv => '$val=~s/\0+$//; $val', # (some idiots add null terminators)
1744
+ },
1745
+ 0xa001 => {
1746
+ Name => 'ColorSpace',
1747
+ Notes => q{
1748
+ the value of 0x2 is not standard EXIF. Instead, an Adobe RGB image is
1749
+ indicated by "Uncalibrated" with an InteropIndex of "R03". The values
1750
+ 0xfffd and 0xfffe are also non-standard, and are used by some Sony cameras
1751
+ },
1752
+ PrintHex => 1,
1753
+ PrintConv => {
1754
+ 1 => 'sRGB',
1755
+ 2 => 'Adobe RGB',
1756
+ 0xffff => 'Uncalibrated',
1757
+ # Sony uses these definitions: (ref JD)
1758
+ # 0xffff => 'Adobe RGB', (conflicts with Uncalibrated)
1759
+ 0xfffe => 'ICC Profile',
1760
+ 0xfffd => 'Wide Gamut RGB',
1761
+ },
1762
+ },
1763
+ 0xa002 => {
1764
+ Name => 'ExifImageWidth',
1765
+ Notes => 'called PixelXDimension by the EXIF spec.',
1766
+ },
1767
+ 0xa003 => {
1768
+ Name => 'ExifImageHeight',
1769
+ Notes => 'called PixelYDimension by the EXIF spec.',
1770
+ },
1771
+ 0xa004 => 'RelatedSoundFile',
1772
+ 0xa005 => {
1773
+ Name => 'InteropOffset',
1774
+ Groups => { 1 => 'InteropIFD' },
1775
+ Flags => 'SubIFD',
1776
+ Description => 'Interoperability Offset',
1777
+ SubDirectory => {
1778
+ DirName => 'InteropIFD',
1779
+ Start => '$val',
1780
+ MaxSubdirs => 1,
1781
+ },
1782
+ },
1783
+ 0xa20b => {
1784
+ Name => 'FlashEnergy',
1785
+ Groups => { 2 => 'Camera' },
1786
+ },
1787
+ 0xa20c => {
1788
+ Name => 'SpatialFrequencyResponse',
1789
+ PrintConv => 'Image::ExifTool::Exif::PrintSFR($val)',
1790
+ },
1791
+ 0xa20d => 'Noise',
1792
+ 0xa20e => { Name => 'FocalPlaneXResolution', Groups => { 2 => 'Camera' } },
1793
+ 0xa20f => { Name => 'FocalPlaneYResolution', Groups => { 2 => 'Camera' } },
1794
+ 0xa210 => {
1795
+ Name => 'FocalPlaneResolutionUnit',
1796
+ Groups => { 2 => 'Camera' },
1797
+ Notes => 'values 1, 4 and 5 are not standard EXIF',
1798
+ PrintConv => {
1799
+ 1 => 'None', # (not standard EXIF)
1800
+ 2 => 'inches',
1801
+ 3 => 'cm',
1802
+ 4 => 'mm', # (not standard EXIF)
1803
+ 5 => 'um', # (not standard EXIF)
1804
+ },
1805
+ },
1806
+ 0xa211 => 'ImageNumber',
1807
+ 0xa212 => 'SecurityClassification',
1808
+ 0xa213 => 'ImageHistory',
1809
+ 0xa214 => {
1810
+ Name => 'SubjectLocation',
1811
+ Groups => { 2 => 'Camera' },
1812
+ },
1813
+ 0xa215 => 'ExposureIndex',
1814
+ 0xa216 => 'TIFF-EPStandardID',
1815
+ 0xa217 => {
1816
+ Name => 'SensingMethod',
1817
+ Groups => { 2 => 'Camera' },
1818
+ PrintConv => {
1819
+ 1 => 'Not defined',
1820
+ 2 => 'One-chip color area',
1821
+ 3 => 'Two-chip color area',
1822
+ 4 => 'Three-chip color area',
1823
+ 5 => 'Color sequential area',
1824
+ 7 => 'Trilinear',
1825
+ 8 => 'Color sequential linear',
1826
+ },
1827
+ },
1828
+ 0xa300 => {
1829
+ Name => 'FileSource',
1830
+ PrintConv => {
1831
+ 1 => 'Film Scanner',
1832
+ 2 => 'Reflection Print Scanner',
1833
+ 3 => 'Digital Camera',
1834
+ # handle the case where Sigma incorrectly gives this tag a count of 4
1835
+ "\3\0\0\0" => 'Sigma Digital Camera',
1836
+ },
1837
+ },
1838
+ 0xa301 => {
1839
+ Name => 'SceneType',
1840
+ PrintConv => {
1841
+ 1 => 'Directly photographed',
1842
+ },
1843
+ },
1844
+ 0xa302 => {
1845
+ Name => 'CFAPattern',
1846
+ RawConv => 'Image::ExifTool::Exif::DecodeCFAPattern($self, $val)',
1847
+ PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
1848
+ },
1849
+ 0xa401 => {
1850
+ Name => 'CustomRendered',
1851
+ PrintConv => {
1852
+ 0 => 'Normal',
1853
+ 1 => 'Custom',
1854
+ },
1855
+ },
1856
+ 0xa402 => {
1857
+ Name => 'ExposureMode',
1858
+ Groups => { 2 => 'Camera' },
1859
+ PrintConv => {
1860
+ 0 => 'Auto',
1861
+ 1 => 'Manual',
1862
+ 2 => 'Auto bracket',
1863
+ # have seen 3 from Samsung EX1 and NX200 - PH
1864
+ },
1865
+ },
1866
+ 0xa403 => {
1867
+ Name => 'WhiteBalance',
1868
+ Groups => { 2 => 'Camera' },
1869
+ # set Priority to zero to keep this WhiteBalance from overriding the
1870
+ # MakerNotes WhiteBalance, since the MakerNotes WhiteBalance and is more
1871
+ # accurate and contains more information (if it exists)
1872
+ Priority => 0,
1873
+ PrintConv => {
1874
+ 0 => 'Auto',
1875
+ 1 => 'Manual',
1876
+ },
1877
+ },
1878
+ 0xa404 => {
1879
+ Name => 'DigitalZoomRatio',
1880
+ Groups => { 2 => 'Camera' },
1881
+ },
1882
+ 0xa405 => {
1883
+ Name => 'FocalLengthIn35mmFormat',
1884
+ Notes => 'called FocalLengthIn35mmFilm by the EXIF spec.',
1885
+ Groups => { 2 => 'Camera' },
1886
+ PrintConv => '"$val mm"',
1887
+ },
1888
+ 0xa406 => {
1889
+ Name => 'SceneCaptureType',
1890
+ Groups => { 2 => 'Camera' },
1891
+ PrintConv => {
1892
+ 0 => 'Standard',
1893
+ 1 => 'Landscape',
1894
+ 2 => 'Portrait',
1895
+ 3 => 'Night',
1896
+ },
1897
+ },
1898
+ 0xa407 => {
1899
+ Name => 'GainControl',
1900
+ Groups => { 2 => 'Camera' },
1901
+ PrintConv => {
1902
+ 0 => 'None',
1903
+ 1 => 'Low gain up',
1904
+ 2 => 'High gain up',
1905
+ 3 => 'Low gain down',
1906
+ 4 => 'High gain down',
1907
+ },
1908
+ },
1909
+ 0xa408 => {
1910
+ Name => 'Contrast',
1911
+ Groups => { 2 => 'Camera' },
1912
+ PrintConv => {
1913
+ 0 => 'Normal',
1914
+ 1 => 'Low',
1915
+ 2 => 'High',
1916
+ },
1917
+ },
1918
+ 0xa409 => {
1919
+ Name => 'Saturation',
1920
+ Groups => { 2 => 'Camera' },
1921
+ PrintConv => {
1922
+ 0 => 'Normal',
1923
+ 1 => 'Low',
1924
+ 2 => 'High',
1925
+ },
1926
+ },
1927
+ 0xa40a => {
1928
+ Name => 'Sharpness',
1929
+ Groups => { 2 => 'Camera' },
1930
+ PrintConv => {
1931
+ 0 => 'Normal',
1932
+ 1 => 'Soft',
1933
+ 2 => 'Hard',
1934
+ },
1935
+ },
1936
+ 0xa40b => {
1937
+ Name => 'DeviceSettingDescription',
1938
+ Groups => { 2 => 'Camera' },
1939
+ Binary => 1,
1940
+ },
1941
+ 0xa40c => {
1942
+ Name => 'SubjectDistanceRange',
1943
+ Groups => { 2 => 'Camera' },
1944
+ PrintConv => {
1945
+ 0 => 'Unknown',
1946
+ 1 => 'Macro',
1947
+ 2 => 'Close',
1948
+ 3 => 'Distant',
1949
+ },
1950
+ },
1951
+ # 0xa40d - int16u: 0 (GE E1486 TW)
1952
+ # 0xa40e - int16u: 1 (GE E1486 TW)
1953
+ 0xa420 => 'ImageUniqueID',
1954
+ 0xa430 => { #24
1955
+ Name => 'OwnerName',
1956
+ Notes => 'called CameraOwnerName by the EXIF spec.',
1957
+ },
1958
+ 0xa431 => { #24
1959
+ Name => 'SerialNumber',
1960
+ Notes => 'called BodySerialNumber by the EXIF spec.',
1961
+ },
1962
+ 0xa432 => { #24
1963
+ Name => 'LensInfo',
1964
+ Notes => q{
1965
+ 4 rational values giving focal and aperture ranges, called LensSpecification
1966
+ by the EXIF spec.
1967
+ },
1968
+ # convert to the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
1969
+ PrintConv => \&Image::ExifTool::Exif::PrintLensInfo,
1970
+ },
1971
+ 0xa433 => 'LensMake', #24
1972
+ 0xa434 => 'LensModel', #24
1973
+ 0xa435 => 'LensSerialNumber', #24
1974
+ 0xa480 => 'GDALMetadata', #3
1975
+ 0xa481 => 'GDALNoData', #3
1976
+ 0xa500 => 'Gamma',
1977
+ 0xafc0 => 'ExpandSoftware', #JD (Opanda)
1978
+ 0xafc1 => 'ExpandLens', #JD (Opanda)
1979
+ 0xafc2 => 'ExpandFilm', #JD (Opanda)
1980
+ 0xafc3 => 'ExpandFilterLens', #JD (Opanda)
1981
+ 0xafc4 => 'ExpandScanner', #JD (Opanda)
1982
+ 0xafc5 => 'ExpandFlashLamp', #JD (Opanda)
1983
+ #
1984
+ # Windows Media Photo / HD Photo (WDP/HDP) tags
1985
+ #
1986
+ 0xbc01 => { #13
1987
+ Name => 'PixelFormat',
1988
+ PrintHex => 1,
1989
+ Format => 'undef',
1990
+ Notes => q{
1991
+ tags 0xbc** are used in Windows HD Photo (HDP and WDP) images. The actual
1992
+ PixelFormat values are 16-byte GUID's but the leading 15 bytes,
1993
+ '6fddc324-4e03-4bfe-b1853-d77768dc9', have been removed below to avoid
1994
+ unnecessary clutter
1995
+ },
1996
+ ValueConv => q{
1997
+ require Image::ExifTool::ASF;
1998
+ $val = Image::ExifTool::ASF::GetGUID($val);
1999
+ # GUID's are too long, so remove redundant information
2000
+ $val =~ s/^6fddc324-4e03-4bfe-b185-3d77768dc9//i and $val = hex($val);
2001
+ return $val;
2002
+ },
2003
+ PrintConv => {
2004
+ 0x0d => '24-bit RGB',
2005
+ 0x0c => '24-bit BGR',
2006
+ 0x0e => '32-bit BGR',
2007
+ 0x15 => '48-bit RGB',
2008
+ 0x12 => '48-bit RGB Fixed Point',
2009
+ 0x3b => '48-bit RGB Half',
2010
+ 0x18 => '96-bit RGB Fixed Point',
2011
+ 0x1b => '128-bit RGB Float',
2012
+ 0x0f => '32-bit BGRA',
2013
+ 0x16 => '64-bit RGBA',
2014
+ 0x1d => '64-bit RGBA Fixed Point',
2015
+ 0x3a => '64-bit RGBA Half',
2016
+ 0x1e => '128-bit RGBA Fixed Point',
2017
+ 0x19 => '128-bit RGBA Float',
2018
+ 0x10 => '32-bit PBGRA',
2019
+ 0x17 => '64-bit PRGBA',
2020
+ 0x1a => '128-bit PRGBA Float',
2021
+ 0x1c => '32-bit CMYK',
2022
+ 0x2c => '40-bit CMYK Alpha',
2023
+ 0x1f => '64-bit CMYK',
2024
+ 0x2d => '80-bit CMYK Alpha',
2025
+ 0x20 => '24-bit 3 Channels',
2026
+ 0x21 => '32-bit 4 Channels',
2027
+ 0x22 => '40-bit 5 Channels',
2028
+ 0x23 => '48-bit 6 Channels',
2029
+ 0x24 => '56-bit 7 Channels',
2030
+ 0x25 => '64-bit 8 Channels',
2031
+ 0x2e => '32-bit 3 Channels Alpha',
2032
+ 0x2f => '40-bit 4 Channels Alpha',
2033
+ 0x30 => '48-bit 5 Channels Alpha',
2034
+ 0x31 => '56-bit 6 Channels Alpha',
2035
+ 0x32 => '64-bit 7 Channels Alpha',
2036
+ 0x33 => '72-bit 8 Channels Alpha',
2037
+ 0x26 => '48-bit 3 Channels',
2038
+ 0x27 => '64-bit 4 Channels',
2039
+ 0x28 => '80-bit 5 Channels',
2040
+ 0x29 => '96-bit 6 Channels',
2041
+ 0x2a => '112-bit 7 Channels',
2042
+ 0x2b => '128-bit 8 Channels',
2043
+ 0x34 => '64-bit 3 Channels Alpha',
2044
+ 0x35 => '80-bit 4 Channels Alpha',
2045
+ 0x36 => '96-bit 5 Channels Alpha',
2046
+ 0x37 => '112-bit 6 Channels Alpha',
2047
+ 0x38 => '128-bit 7 Channels Alpha',
2048
+ 0x39 => '144-bit 8 Channels Alpha',
2049
+ 0x08 => '8-bit Gray',
2050
+ 0x0b => '16-bit Gray',
2051
+ 0x13 => '16-bit Gray Fixed Point',
2052
+ 0x3e => '16-bit Gray Half',
2053
+ 0x3f => '32-bit Gray Fixed Point',
2054
+ 0x11 => '32-bit Gray Float',
2055
+ 0x05 => 'Black & White',
2056
+ 0x09 => '16-bit BGR555',
2057
+ 0x0a => '16-bit BGR565',
2058
+ 0x13 => '32-bit BGR101010',
2059
+ 0x3d => '32-bit RGBE',
2060
+ },
2061
+ },
2062
+ 0xbc02 => { #13
2063
+ Name => 'Transformation',
2064
+ PrintConv => {
2065
+ 0 => 'Horizontal (normal)',
2066
+ 1 => 'Mirror vertical',
2067
+ 2 => 'Mirror horizontal',
2068
+ 3 => 'Rotate 180',
2069
+ 4 => 'Rotate 90 CW',
2070
+ 5 => 'Mirror horizontal and rotate 90 CW',
2071
+ 6 => 'Mirror horizontal and rotate 270 CW',
2072
+ 7 => 'Rotate 270 CW',
2073
+ },
2074
+ },
2075
+ 0xbc03 => { #13
2076
+ Name => 'Uncompressed',
2077
+ PrintConv => { 0 => 'No', 1 => 'Yes' },
2078
+ },
2079
+ 0xbc04 => { #13
2080
+ Name => 'ImageType',
2081
+ PrintConv => { BITMASK => {
2082
+ 0 => 'Preview',
2083
+ 1 => 'Page',
2084
+ } },
2085
+ },
2086
+ 0xbc80 => 'ImageWidth', #13
2087
+ 0xbc81 => 'ImageHeight', #13
2088
+ 0xbc82 => 'WidthResolution', #13
2089
+ 0xbc83 => 'HeightResolution', #13
2090
+ 0xbcc0 => { #13
2091
+ Name => 'ImageOffset',
2092
+ IsOffset => 1,
2093
+ OffsetPair => 0xbcc1, # point to associated byte count
2094
+ },
2095
+ 0xbcc1 => { #13
2096
+ Name => 'ImageByteCount',
2097
+ OffsetPair => 0xbcc0, # point to associated offset
2098
+ },
2099
+ 0xbcc2 => { #13
2100
+ Name => 'AlphaOffset',
2101
+ IsOffset => 1,
2102
+ OffsetPair => 0xbcc3, # point to associated byte count
2103
+ },
2104
+ 0xbcc3 => { #13
2105
+ Name => 'AlphaByteCount',
2106
+ OffsetPair => 0xbcc2, # point to associated offset
2107
+ },
2108
+ 0xbcc4 => { #13
2109
+ Name => 'ImageDataDiscard',
2110
+ PrintConv => {
2111
+ 0 => 'Full Resolution',
2112
+ 1 => 'Flexbits Discarded',
2113
+ 2 => 'HighPass Frequency Data Discarded',
2114
+ 3 => 'Highpass and LowPass Frequency Data Discarded',
2115
+ },
2116
+ },
2117
+ 0xbcc5 => { #13
2118
+ Name => 'AlphaDataDiscard',
2119
+ PrintConv => {
2120
+ 0 => 'Full Resolution',
2121
+ 1 => 'Flexbits Discarded',
2122
+ 2 => 'HighPass Frequency Data Discarded',
2123
+ 3 => 'Highpass and LowPass Frequency Data Discarded',
2124
+ },
2125
+ },
2126
+ #
2127
+ 0xc427 => 'OceScanjobDesc', #3
2128
+ 0xc428 => 'OceApplicationSelector', #3
2129
+ 0xc429 => 'OceIDNumber', #3
2130
+ 0xc42a => 'OceImageLogic', #3
2131
+ 0xc44f => { Name => 'Annotations', Binary => 1 }, #7/19
2132
+ 0xc4a5 => {
2133
+ Name => 'PrintIM', # (writable directory!)
2134
+ # must set Writable here so this tag will be saved with MakerNotes option
2135
+ Writable => 'undef',
2136
+ WriteGroup => 'IFD0',
2137
+ Binary => 1,
2138
+ # (don't make Binary/Protected because we can't copy individual PrintIM tags anyway)
2139
+ Description => 'Print Image Matching',
2140
+ SubDirectory => {
2141
+ TagTable => 'Image::ExifTool::PrintIM::Main',
2142
+ },
2143
+ PrintConvInv => '$val =~ /^PrintIM/ ? $val : undef', # quick validation
2144
+ },
2145
+ 0xc573 => { #PH
2146
+ Name => 'OriginalFileName',
2147
+ Notes => 'used by some obscure software', # (possibly Swizzy Photosmacker?)
2148
+ # (it is a 'string', but obscure, so don't make it writable)
2149
+ },
2150
+ 0xc580 => { #20
2151
+ Name => 'USPTOOriginalContentType',
2152
+ PrintConv => {
2153
+ 0 => 'Text or Drawing',
2154
+ 1 => 'Grayscale',
2155
+ 2 => 'Color',
2156
+ },
2157
+ },
2158
+ #
2159
+ # DNG tags 0xc6XX and 0xc7XX (ref 2 unless otherwise stated)
2160
+ #
2161
+ 0xc612 => {
2162
+ Name => 'DNGVersion',
2163
+ Notes => 'tags 0xc612-0xc7b5 are used in DNG images unless otherwise noted',
2164
+ DataMember => 'DNGVersion',
2165
+ RawConv => '$$self{DNGVersion} = $val',
2166
+ PrintConv => '$val =~ tr/ /./; $val',
2167
+ },
2168
+ 0xc613 => {
2169
+ Name => 'DNGBackwardVersion',
2170
+ PrintConv => '$val =~ tr/ /./; $val',
2171
+ },
2172
+ 0xc614 => 'UniqueCameraModel',
2173
+ 0xc615 => {
2174
+ Name => 'LocalizedCameraModel',
2175
+ Format => 'string',
2176
+ PrintConv => '$self->Printable($val, 0)',
2177
+ },
2178
+ 0xc616 => {
2179
+ Name => 'CFAPlaneColor',
2180
+ PrintConv => q{
2181
+ my @cols = qw(Red Green Blue Cyan Magenta Yellow White);
2182
+ my @vals = map { $cols[$_] || "Unknown($_)" } split(' ', $val);
2183
+ return join(',', @vals);
2184
+ },
2185
+ },
2186
+ 0xc617 => {
2187
+ Name => 'CFALayout',
2188
+ PrintConv => {
2189
+ 1 => 'Rectangular',
2190
+ 2 => 'Even columns offset down 1/2 row',
2191
+ 3 => 'Even columns offset up 1/2 row',
2192
+ 4 => 'Even rows offset right 1/2 column',
2193
+ 5 => 'Even rows offset left 1/2 column',
2194
+ # the following are new for DNG 1.3:
2195
+ 6 => 'Even rows offset up by 1/2 row, even columns offset left by 1/2 column',
2196
+ 7 => 'Even rows offset up by 1/2 row, even columns offset right by 1/2 column',
2197
+ 8 => 'Even rows offset down by 1/2 row, even columns offset left by 1/2 column',
2198
+ 9 => 'Even rows offset down by 1/2 row, even columns offset right by 1/2 column',
2199
+ },
2200
+ },
2201
+ 0xc618 => { Name => 'LinearizationTable', Binary => 1 },
2202
+ 0xc619 => 'BlackLevelRepeatDim',
2203
+ 0xc61a => 'BlackLevel',
2204
+ 0xc61b => { Name => 'BlackLevelDeltaH', %longBin },
2205
+ 0xc61c => { Name => 'BlackLevelDeltaV', %longBin },
2206
+ 0xc61d => 'WhiteLevel',
2207
+ 0xc61e => 'DefaultScale',
2208
+ 0xc61f => 'DefaultCropOrigin',
2209
+ 0xc620 => 'DefaultCropSize',
2210
+ 0xc621 => 'ColorMatrix1',
2211
+ 0xc622 => 'ColorMatrix2',
2212
+ 0xc623 => 'CameraCalibration1',
2213
+ 0xc624 => 'CameraCalibration2',
2214
+ 0xc625 => 'ReductionMatrix1',
2215
+ 0xc626 => 'ReductionMatrix2',
2216
+ 0xc627 => 'AnalogBalance',
2217
+ 0xc628 => 'AsShotNeutral',
2218
+ 0xc629 => 'AsShotWhiteXY',
2219
+ 0xc62a => 'BaselineExposure',
2220
+ 0xc62b => 'BaselineNoise',
2221
+ 0xc62c => 'BaselineSharpness',
2222
+ 0xc62d => 'BayerGreenSplit',
2223
+ 0xc62e => 'LinearResponseLimit',
2224
+ 0xc62f => {
2225
+ Name => 'CameraSerialNumber',
2226
+ Groups => { 2 => 'Camera' },
2227
+ },
2228
+ 0xc630 => {
2229
+ Name => 'DNGLensInfo',
2230
+ Groups => { 2 => 'Camera' },
2231
+ PrintConv =>\&PrintLensInfo,
2232
+ },
2233
+ 0xc631 => 'ChromaBlurRadius',
2234
+ 0xc632 => 'AntiAliasStrength',
2235
+ 0xc633 => 'ShadowScale',
2236
+ 0xc634 => [
2237
+ {
2238
+ Condition => '$$self{TIFF_TYPE} =~ /^(ARW|SR2)$/',
2239
+ Name => 'SR2Private',
2240
+ Groups => { 1 => 'SR2' },
2241
+ Flags => 'SubIFD',
2242
+ Format => 'int32u',
2243
+ # some utilites have problems unless this is int8u format:
2244
+ # - Adobe Camera Raw 5.3 gives an error
2245
+ # - Apple Preview 10.5.8 gets the wrong white balance
2246
+ FixFormat => 'int8u', # (stupid Sony)
2247
+ SubDirectory => {
2248
+ DirName => 'SR2Private',
2249
+ TagTable => 'Image::ExifTool::Sony::SR2Private',
2250
+ Start => '$val',
2251
+ },
2252
+ },
2253
+ {
2254
+ Condition => '$$valPt =~ /^Adobe\0/',
2255
+ Name => 'DNGAdobeData',
2256
+ Flags => [ 'Binary', 'Protected' ],
2257
+ Writable => 'undef', # (writable directory!) (to make it possible to delete this mess)
2258
+ WriteGroup => 'IFD0',
2259
+ NestedHtmlDump => 1,
2260
+ SubDirectory => { TagTable => 'Image::ExifTool::DNG::AdobeData' },
2261
+ Format => 'undef', # written incorrectly as int8u (change to undef for speed)
2262
+ },
2263
+ {
2264
+ # Pentax/Samsung models that write AOC maker notes in JPG images:
2265
+ # K-5,K-7,K-m,K-x,K-r,K10D,K20D,K100D,K110D,K200D,K2000,GX10,GX20
2266
+ # (Note: the following expression also appears in WriteExif.pl)
2267
+ Condition => q{
2268
+ $$valPt =~ /^(PENTAX |SAMSUNG)\0/ and
2269
+ $$self{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/
2270
+ },
2271
+ Name => 'MakerNotePentax',
2272
+ MakerNotes => 1, # (causes "MakerNotes header" to be identified in HtmlDump output)
2273
+ Binary => 1,
2274
+ # Note: Don't make this block-writable for a few reasons:
2275
+ # 1) It would be dangerous (possibly confusing Pentax software)
2276
+ # 2) It is a different format from the JPEG version of MakerNotePentax
2277
+ # 3) It is converted to JPEG format by RebuildMakerNotes() when copying
2278
+ SubDirectory => {
2279
+ TagTable => 'Image::ExifTool::Pentax::Main',
2280
+ Start => '$valuePtr + 10',
2281
+ Base => '$start - 10',
2282
+ ByteOrder => 'Unknown', # easier to do this than read byteorder word
2283
+ },
2284
+ Format => 'undef', # written incorrectly as int8u (change to undef for speed)
2285
+ },
2286
+ {
2287
+ # must duplicate the above tag with a different name for more recent
2288
+ # Pentax models which use the "PENTAX" instead of the "AOC" maker notes
2289
+ # in JPG images (needed when copying maker notes from DNG to JPG)
2290
+ Condition => '$$valPt =~ /^(PENTAX |SAMSUNG)\0/',
2291
+ Name => 'MakerNotePentax5',
2292
+ MakerNotes => 1,
2293
+ Binary => 1,
2294
+ SubDirectory => {
2295
+ TagTable => 'Image::ExifTool::Pentax::Main',
2296
+ Start => '$valuePtr + 10',
2297
+ Base => '$start - 10',
2298
+ ByteOrder => 'Unknown',
2299
+ },
2300
+ Format => 'undef',
2301
+ },
2302
+ {
2303
+ Name => 'DNGPrivateData',
2304
+ Flags => [ 'Binary', 'Protected' ],
2305
+ Format => 'undef',
2306
+ Writable => 'undef',
2307
+ WriteGroup => 'IFD0',
2308
+ },
2309
+ ],
2310
+ 0xc635 => {
2311
+ Name => 'MakerNoteSafety',
2312
+ PrintConv => {
2313
+ 0 => 'Unsafe',
2314
+ 1 => 'Safe',
2315
+ },
2316
+ },
2317
+ 0xc640 => { #15
2318
+ Name => 'RawImageSegmentation',
2319
+ # (int16u[3], not writable)
2320
+ Notes => q{
2321
+ used in segmented Canon CR2 images. 3 numbers: 1. Number of segments minus
2322
+ one; 2. Pixel width of segments except last; 3. Pixel width of last segment
2323
+ },
2324
+ },
2325
+ 0xc65a => {
2326
+ Name => 'CalibrationIlluminant1',
2327
+ SeparateTable => 'LightSource',
2328
+ PrintConv => \%lightSource,
2329
+ },
2330
+ 0xc65b => {
2331
+ Name => 'CalibrationIlluminant2',
2332
+ SeparateTable => 'LightSource',
2333
+ PrintConv => \%lightSource,
2334
+ },
2335
+ 0xc65c => 'BestQualityScale',
2336
+ 0xc65d => {
2337
+ Name => 'RawDataUniqueID',
2338
+ Format => 'undef',
2339
+ ValueConv => 'uc(unpack("H*",$val))',
2340
+ },
2341
+ 0xc660 => { #3
2342
+ Name => 'AliasLayerMetadata',
2343
+ Notes => 'used by Alias Sketchbook Pro',
2344
+ },
2345
+ 0xc68b => {
2346
+ Name => 'OriginalRawFileName',
2347
+ Format => 'string', # sometimes written as int8u
2348
+ },
2349
+ 0xc68c => {
2350
+ Name => 'OriginalRawFileData', # (writable directory!)
2351
+ Writable => 'undef', # must be defined here so tag will be extracted if specified
2352
+ WriteGroup => 'IFD0',
2353
+ Flags => [ 'Binary', 'Protected' ],
2354
+ SubDirectory => {
2355
+ TagTable => 'Image::ExifTool::DNG::OriginalRaw',
2356
+ },
2357
+ },
2358
+ 0xc68d => 'ActiveArea',
2359
+ 0xc68e => 'MaskedAreas',
2360
+ 0xc68f => {
2361
+ Name => 'AsShotICCProfile',
2362
+ Binary => 1,
2363
+ Writable => 'undef', # must be defined here so tag will be extracted if specified
2364
+ SubDirectory => {
2365
+ DirName => 'AsShotICCProfile',
2366
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
2367
+ },
2368
+ },
2369
+ 0xc690 => 'AsShotPreProfileMatrix',
2370
+ 0xc691 => {
2371
+ Name => 'CurrentICCProfile',
2372
+ Binary => 1,
2373
+ Writable => 'undef', # must be defined here so tag will be extracted if specified
2374
+ SubDirectory => {
2375
+ DirName => 'CurrentICCProfile',
2376
+ TagTable => 'Image::ExifTool::ICC_Profile::Main',
2377
+ },
2378
+ },
2379
+ 0xc692 => 'CurrentPreProfileMatrix',
2380
+ 0xc6bf => 'ColorimetricReference',
2381
+ 0xc6d2 => { #JD (Panasonic DMC-TZ5)
2382
+ # this text is UTF-8 encoded (hooray!) - PH (TZ5)
2383
+ Name => 'PanasonicTitle',
2384
+ Format => 'string', # written incorrectly as 'undef'
2385
+ Notes => 'proprietary Panasonic tag used for baby/pet name, etc',
2386
+ # panasonic always records this tag (64 zero bytes),
2387
+ # so ignore it unless it contains valid information
2388
+ RawConv => 'length($val) ? $val : undef',
2389
+ ValueConv => '$self->Decode($val, "UTF8")',
2390
+ },
2391
+ 0xc6d3 => { #PH (Panasonic DMC-FS7)
2392
+ Name => 'PanasonicTitle2',
2393
+ Format => 'string', # written incorrectly as 'undef'
2394
+ Notes => 'proprietary Panasonic tag used for baby/pet name with age',
2395
+ # panasonic always records this tag (128 zero bytes),
2396
+ # so ignore it unless it contains valid information
2397
+ RawConv => 'length($val) ? $val : undef',
2398
+ ValueConv => '$self->Decode($val, "UTF8")',
2399
+ },
2400
+ 0xc6f3 => 'CameraCalibrationSig',
2401
+ 0xc6f4 => 'ProfileCalibrationSig',
2402
+ 0xc6f5 => {
2403
+ Name => 'ProfileIFD', # (ExtraCameraProfiles)
2404
+ Groups => { 1 => 'ProfileIFD' },
2405
+ Flags => 'SubIFD',
2406
+ SubDirectory => {
2407
+ ProcessProc => \&ProcessTiffIFD,
2408
+ WriteProc => \&ProcessTiffIFD,
2409
+ DirName => 'ProfileIFD',
2410
+ Start => '$val',
2411
+ Base => '$start', # offsets relative to start of TIFF-like header
2412
+ MaxSubdirs => 10,
2413
+ Magic => 0x4352, # magic number for TIFF-like header
2414
+ },
2415
+ },
2416
+ 0xc6f6 => 'AsShotProfileName',
2417
+ 0xc6f7 => 'NoiseReductionApplied',
2418
+ 0xc6f8 => 'ProfileName',
2419
+ 0xc6f9 => 'ProfileHueSatMapDims',
2420
+ 0xc6fa => { Name => 'ProfileHueSatMapData1', %longBin },
2421
+ 0xc6fb => { Name => 'ProfileHueSatMapData2', %longBin },
2422
+ 0xc6fc => {
2423
+ Name => 'ProfileToneCurve',
2424
+ Binary => 1,
2425
+ },
2426
+ 0xc6fd => {
2427
+ Name => 'ProfileEmbedPolicy',
2428
+ PrintConv => {
2429
+ 0 => 'Allow Copying',
2430
+ 1 => 'Embed if Used',
2431
+ 2 => 'Never Embed',
2432
+ 3 => 'No Restrictions',
2433
+ },
2434
+ },
2435
+ 0xc6fe => 'ProfileCopyright',
2436
+ 0xc714 => 'ForwardMatrix1',
2437
+ 0xc715 => 'ForwardMatrix2',
2438
+ 0xc716 => 'PreviewApplicationName',
2439
+ 0xc717 => 'PreviewApplicationVersion',
2440
+ 0xc718 => 'PreviewSettingsName',
2441
+ 0xc719 => {
2442
+ Name => 'PreviewSettingsDigest',
2443
+ Format => 'undef',
2444
+ ValueConv => 'unpack("H*", $val)',
2445
+ },
2446
+ 0xc71a => 'PreviewColorSpace',
2447
+ 0xc71b => {
2448
+ Name => 'PreviewDateTime',
2449
+ Groups => { 2 => 'Time' },
2450
+ ValueConv => q{
2451
+ require Image::ExifTool::XMP;
2452
+ return Image::ExifTool::XMP::ConvertXMPDate($val);
2453
+ },
2454
+ },
2455
+ 0xc71c => {
2456
+ Name => 'RawImageDigest',
2457
+ Format => 'undef',
2458
+ ValueConv => 'unpack("H*", $val)',
2459
+ },
2460
+ 0xc71d => {
2461
+ Name => 'OriginalRawFileDigest',
2462
+ Format => 'undef',
2463
+ ValueConv => 'unpack("H*", $val)',
2464
+ },
2465
+ 0xc71e => 'SubTileBlockSize',
2466
+ 0xc71f => 'RowInterleaveFactor',
2467
+ 0xc725 => 'ProfileLookTableDims',
2468
+ 0xc726 => {
2469
+ Name => 'ProfileLookTableData',
2470
+ Binary => 1,
2471
+ },
2472
+ 0xc740 => { # DNG 1.3
2473
+ Name => 'OpcodeList1',
2474
+ Binary => 1,
2475
+ # opcodes:
2476
+ # 1 => 'WarpRectilinear',
2477
+ # 2 => 'WarpFisheye',
2478
+ # 3 => 'FixVignetteRadial',
2479
+ # 4 => 'FixBadPixelsConstant',
2480
+ # 5 => 'FixBadPixelsList',
2481
+ # 6 => 'TrimBounds',
2482
+ # 7 => 'MapTable',
2483
+ # 8 => 'MapPolynomial',
2484
+ # 9 => 'GainMap',
2485
+ # 10 => 'DeltaPerRow',
2486
+ # 11 => 'DeltaPerColumn',
2487
+ # 12 => 'ScalePerRow',
2488
+ # 13 => 'ScalePerColumn',
2489
+ },
2490
+ 0xc741 => { # DNG 1.3
2491
+ Name => 'OpcodeList2',
2492
+ Binary => 1,
2493
+ },
2494
+ 0xc74e => { # DNG 1.3
2495
+ Name => 'OpcodeList3',
2496
+ Binary => 1,
2497
+ },
2498
+ 0xc761 => 'NoiseProfile', # DNG 1.3
2499
+ 0xc763 => { #28
2500
+ Name => 'TimeCodes',
2501
+ ValueConv => q{
2502
+ my @a = split ' ', $val;
2503
+ my @v;
2504
+ push @v, join('.', map { sprintf('%.2x',$_) } splice(@a,0,8)) while @a >= 8;
2505
+ join ' ', @v;
2506
+ },
2507
+ # Note: Currently ignore the flags:
2508
+ # byte 0 0x80 - color frame
2509
+ # byte 0 0x40 - drop frame
2510
+ # byte 1 0x80 - field phase
2511
+ PrintConv => q{
2512
+ my @a = map hex, split /[. ]+/, $val;
2513
+ my @v;
2514
+ while (@a >= 8) {
2515
+ my $str = sprintf("%.2x:%.2x:%.2x.%.2x", $a[3]&0x3f,
2516
+ $a[2]&0x7f, $a[1]&0x7f, $a[0]&0x3f);
2517
+ if ($a[3] & 0x80) { # date+timezone exist if BGF2 is set
2518
+ my $tz = $a[7] & 0x3f;
2519
+ my $bz = sprintf('%.2x', $tz);
2520
+ $bz = 100 if $bz =~ /[a-f]/i; # not BCD
2521
+ if ($bz < 26) {
2522
+ $tz = ($bz < 13 ? 0 : 26) - $bz;
2523
+ } elsif ($bz == 32) {
2524
+ $tz = 12.75;
2525
+ } elsif ($bz >= 28 and $bz <= 31) {
2526
+ $tz = 0; # UTC
2527
+ } elsif ($bz < 100) {
2528
+ undef $tz; # undefined or user-defined
2529
+ } elsif ($tz < 0x20) {
2530
+ $tz = (($tz < 0x10 ? 10 : 20) - $tz) - 0.5;
2531
+ } else {
2532
+ $tz = (($tz < 0x30 ? 53 : 63) - $tz) + 0.5;
2533
+ }
2534
+ if ($a[7] & 0x80) { # MJD format (/w UTC time)
2535
+ my ($h,$m,$s,$f) = split /[:.]/, $str;
2536
+ my $jday = sprintf('%x%.2x%.2x', reverse @a[4..6]);
2537
+ $str = ConvertUnixTime(($jday - 40587) * 24 * 3600
2538
+ + ((($h+$tz) * 60) + $m) * 60 + $s) . ".$f";
2539
+ $str =~ s/^(\d+):(\d+):(\d+) /$1-$2-${3}T/;
2540
+ } else { # YYMMDD (Note: CinemaDNG 1.1 example seems wrong)
2541
+ my $yr = sprintf('%.2x',$a[6]) + 1900;
2542
+ $yr += 100 if $yr < 1970;
2543
+ $str = sprintf('%d-%.2x-%.2xT%s',$yr,$a[5],$a[4],$str);
2544
+ }
2545
+ $str .= TimeZoneString($tz*60) if defined $tz;
2546
+ }
2547
+ push @v, $str;
2548
+ splice @a, 0, 8;
2549
+ }
2550
+ join ' ', @v;
2551
+ },
2552
+ },
2553
+ 0xc764 => { #28
2554
+ Name => 'FrameRate',
2555
+ PrintConv => 'int($val * 1000 + 0.5) / 1000',
2556
+ },
2557
+ 0xc772 => { #28
2558
+ Name => 'TStop',
2559
+ PrintConv => 'join("-", map { sprintf("%.2f",$_) } split " ", $val)',
2560
+ },
2561
+ 0xc789 => 'ReelName', #28
2562
+ 0xc791 => 'OriginalDefaultFinalSize', # DNG 1.4
2563
+ 0xc792 => { # DNG 1.4
2564
+ Name => 'OriginalBestQualitySize',
2565
+ Notes => 'called OriginalBestQualityFinalSize by the DNG spec',
2566
+ },
2567
+ 0xc793 => 'OriginalDefaultCropSize', # DNG 1.4
2568
+ 0xc7a1 => 'CameraLabel', #28
2569
+ 0xc7a3 => { # DNG 1.4
2570
+ Name => 'ProfileHueSatMapEncoding',
2571
+ PrintConv => {
2572
+ 0 => 'Linear',
2573
+ 1 => 'sRGB',
2574
+ },
2575
+ },
2576
+ 0xc7a4 => { # DNG 1.4
2577
+ Name => 'ProfileLookTableEncoding',
2578
+ PrintConv => {
2579
+ 0 => 'Linear',
2580
+ 1 => 'sRGB',
2581
+ },
2582
+ },
2583
+ 0xc7a5 => 'BaselineExposureOffset', # DNG 1.4
2584
+ 0xc7a6 => { # DNG 1.4
2585
+ Name => 'DefaultBlackRender',
2586
+ PrintConv => {
2587
+ 0 => 'Auto',
2588
+ 1 => 'None',
2589
+ },
2590
+ },
2591
+ 0xc7a7 => { # DNG 1.4
2592
+ Name => 'NewRawImageDigest',
2593
+ Format => 'undef',
2594
+ ValueConv => 'unpack("H*", $val)',
2595
+ },
2596
+ 0xc7a8 => 'RawToPreviewGain', # DNG 1.4
2597
+ # 0xc7aa - undocumented DNG tag written by LR4 (int32u[1] - val=256, related to fast load data?)
2598
+ 0xc7b5 => 'DefaultUserCrop', # DNG 1.4
2599
+ 0xea1c => { #13
2600
+ Name => 'Padding',
2601
+ Binary => 1,
2602
+ Writable => 'undef',
2603
+ # must start with 0x1c 0xea by the WM Photo specification
2604
+ # (not sure what should happen if padding is only 1 byte)
2605
+ # (why does MicrosoftPhoto write "1c ea 00 00 00 08"?)
2606
+ RawConvInv => '$val=~s/^../\x1c\xea/s; $val',
2607
+ },
2608
+ 0xea1d => {
2609
+ Name => 'OffsetSchema',
2610
+ Notes => "Microsoft's ill-conceived maker note offset difference",
2611
+ # From the Microsoft documentation:
2612
+ #
2613
+ # Any time the "Maker Note" is relocated by Windows, the Exif MakerNote
2614
+ # tag (37500) is updated automatically to reference the new location. In
2615
+ # addition, Windows records the offset (or difference) between the old and
2616
+ # new locations in the Exif OffsetSchema tag (59933). If the "Maker Note"
2617
+ # contains relative references, the developer can add the value in
2618
+ # OffsetSchema to the original references to find the correct information.
2619
+ #
2620
+ # My recommendation is for other developers to ignore this tag because the
2621
+ # information it contains is unreliable. It will be wrong if the image has
2622
+ # been subsequently edited by another application that doesn't recognize the
2623
+ # new Microsoft tag.
2624
+ #
2625
+ # The new tag unfortunately only gives the difference between the new maker
2626
+ # note offset and the original offset. Instead, it should have been designed
2627
+ # to store the original offset. The new offset may change if the image is
2628
+ # edited, which will invalidate the tag as currently written. If instead the
2629
+ # original offset had been stored, the new difference could be easily
2630
+ # calculated because the new maker note offset is known.
2631
+ #
2632
+ # I exchanged emails with a Microsoft technical representative, pointing out
2633
+ # this problem shortly after they released the update (Feb 2007), but so far
2634
+ # they have taken no steps to address this.
2635
+ },
2636
+
2637
+ # tags in the range 0xfde8-0xfe58 have been observed in PS7 files
2638
+ # generated from RAW images. They are all strings with the
2639
+ # tag name at the start of the string. To accomodate these types
2640
+ # of tags, all tags with values above 0xf000 are handled specially
2641
+ # by ProcessExif().
2642
+
2643
+ 0xfe00 => {
2644
+ Name => 'KDC_IFD',
2645
+ Groups => { 1 => 'KDC_IFD' },
2646
+ Flags => 'SubIFD',
2647
+ Notes => 'used in some Kodak KDC images',
2648
+ SubDirectory => {
2649
+ TagTable => 'Image::ExifTool::Kodak::KDC_IFD',
2650
+ DirName => 'KDC_IFD',
2651
+ Start => '$val',
2652
+ },
2653
+ },
2654
+ );
2655
+
2656
+ # EXIF Composite tags (plus other more general Composite tags)
2657
+ %Image::ExifTool::Exif::Composite = (
2658
+ GROUPS => { 2 => 'Image' },
2659
+ ImageSize => {
2660
+ Require => {
2661
+ 0 => 'ImageWidth',
2662
+ 1 => 'ImageHeight',
2663
+ },
2664
+ Desire => {
2665
+ 2 => 'ExifImageWidth',
2666
+ 3 => 'ExifImageHeight',
2667
+ },
2668
+ # use ExifImageWidth/Height only for Canon and Phase One TIFF-base RAW images
2669
+ ValueConv => q{
2670
+ return "$val[2]x$val[3]" if $val[2] and $val[3] and
2671
+ $$self{TIFF_TYPE} =~ /^(CR2|Canon 1D RAW|IIQ|EIP)$/;
2672
+ return "$val[0]x$val[1]";
2673
+ },
2674
+ },
2675
+ # pick the best shutter speed value
2676
+ ShutterSpeed => {
2677
+ Desire => {
2678
+ 0 => 'ExposureTime',
2679
+ 1 => 'ShutterSpeedValue',
2680
+ 2 => 'BulbDuration',
2681
+ },
2682
+ ValueConv => '($val[2] and $val[2]>0) ? $val[2] : (defined($val[0]) ? $val[0] : $val[1])',
2683
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2684
+ },
2685
+ Aperture => {
2686
+ Desire => {
2687
+ 0 => 'FNumber',
2688
+ 1 => 'ApertureValue',
2689
+ },
2690
+ RawConv => '($val[0] || $val[1]) ? $val : undef',
2691
+ ValueConv => '$val[0] || $val[1]',
2692
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
2693
+ },
2694
+ LightValue => {
2695
+ Notes => 'calculated LV -- similar to exposure value but normalized to ISO 100',
2696
+ Require => {
2697
+ 0 => 'Aperture',
2698
+ 1 => 'ShutterSpeed',
2699
+ 2 => 'ISO',
2700
+ },
2701
+ ValueConv => 'Image::ExifTool::Exif::CalculateLV($val[0],$val[1],$prt[2])',
2702
+ PrintConv => 'sprintf("%.1f",$val)',
2703
+ },
2704
+ FocalLength35efl => { #26/PH
2705
+ Description => 'Focal Length',
2706
+ Notes => 'this value may be incorrect if the image has been resized',
2707
+ Groups => { 2 => 'Camera' },
2708
+ Require => {
2709
+ 0 => 'FocalLength',
2710
+ },
2711
+ Desire => {
2712
+ 1 => 'ScaleFactor35efl',
2713
+ },
2714
+ ValueConv => 'ToFloat(@val); ($val[0] || 0) * ($val[1] || 1)',
2715
+ PrintConv => '$val[1] ? sprintf("%.1f mm (35 mm equivalent: %.1f mm)", $val[0], $val) : sprintf("%.1f mm", $val)',
2716
+ },
2717
+ ScaleFactor35efl => { #26/PH
2718
+ Description => 'Scale Factor To 35 mm Equivalent',
2719
+ Notes => q{
2720
+ this value and any derived values may be incorrect if the image has been
2721
+ resized
2722
+ },
2723
+ Groups => { 2 => 'Camera' },
2724
+ Desire => {
2725
+ 0 => 'FocalLength',
2726
+ 1 => 'FocalLengthIn35mmFormat',
2727
+ 2 => 'Composite:DigitalZoom',
2728
+ 3 => 'FocalPlaneDiagonal',
2729
+ 4 => 'SensorSize',
2730
+ 5 => 'FocalPlaneXSize',
2731
+ 6 => 'FocalPlaneYSize',
2732
+ 7 => 'FocalPlaneResolutionUnit',
2733
+ 8 => 'FocalPlaneXResolution',
2734
+ 9 => 'FocalPlaneYResolution',
2735
+ 10 => 'ExifImageWidth',
2736
+ 11 => 'ExifImageHeight',
2737
+ 12 => 'CanonImageWidth',
2738
+ 13 => 'CanonImageHeight',
2739
+ 14 => 'ImageWidth',
2740
+ 15 => 'ImageHeight',
2741
+ },
2742
+ ValueConv => 'Image::ExifTool::Exif::CalcScaleFactor35efl($self, @val)',
2743
+ PrintConv => 'sprintf("%.1f", $val)',
2744
+ },
2745
+ CircleOfConfusion => {
2746
+ Notes => q{
2747
+ calculated as D/1440, where D is the focal plane diagonal in mm. This value
2748
+ may be incorrect if the image has been resized
2749
+ },
2750
+ Groups => { 2 => 'Camera' },
2751
+ Require => 'ScaleFactor35efl',
2752
+ ValueConv => 'sqrt(24*24+36*36) / ($val * 1440)',
2753
+ PrintConv => 'sprintf("%.3f mm",$val)',
2754
+ },
2755
+ HyperfocalDistance => {
2756
+ Notes => 'this value may be incorrect if the image has been resized',
2757
+ Groups => { 2 => 'Camera' },
2758
+ Require => {
2759
+ 0 => 'FocalLength',
2760
+ 1 => 'Aperture',
2761
+ 2 => 'CircleOfConfusion',
2762
+ },
2763
+ ValueConv => q{
2764
+ ToFloat(@val);
2765
+ return 'inf' unless $val[1] and $val[2];
2766
+ return $val[0] * $val[0] / ($val[1] * $val[2] * 1000);
2767
+ },
2768
+ PrintConv => 'sprintf("%.2f m", $val)',
2769
+ },
2770
+ DOF => {
2771
+ Description => 'Depth Of Field',
2772
+ Notes => 'this value may be incorrect if the image has been resized',
2773
+ Require => {
2774
+ 0 => 'FocalLength',
2775
+ 1 => 'Aperture',
2776
+ 2 => 'CircleOfConfusion',
2777
+ },
2778
+ Desire => {
2779
+ 3 => 'FocusDistance', # focus distance in metres (0 is infinity)
2780
+ 4 => 'SubjectDistance',
2781
+ 5 => 'ObjectDistance',
2782
+ },
2783
+ ValueConv => q{
2784
+ ToFloat(@val);
2785
+ my ($d, $f) = ($val[3], $val[0]);
2786
+ if (defined $d) {
2787
+ $d or $d = 1e10; # (use large number for infinity)
2788
+ } else {
2789
+ $d = $val[4] || $val[5];
2790
+ return undef unless defined $d;
2791
+ }
2792
+ return 0 unless $f and $val[2];
2793
+ my $t = $val[1] * $val[2] * ($d * 1000 - $f) / ($f * $f);
2794
+ my @v = ($d / (1 + $t), $d / (1 - $t));
2795
+ $v[1] < 0 and $v[1] = 0; # 0 means 'inf'
2796
+ return join(' ',@v);
2797
+ },
2798
+ PrintConv => q{
2799
+ $val =~ tr/,/./; # in case locale is whacky
2800
+ my @v = split ' ', $val;
2801
+ $v[1] or return sprintf("inf (%.2f m - inf)", $v[0]);
2802
+ my $dof = $v[1] - $v[0];
2803
+ my $fmt = ($dof>0 and $dof<0.02) ? "%.3f" : "%.2f";
2804
+ return sprintf("$fmt m ($fmt - $fmt)",$dof,$v[0],$v[1]);
2805
+ },
2806
+ },
2807
+ FOV => {
2808
+ Description => 'Field Of View',
2809
+ Notes => q{
2810
+ calculated for the long image dimension. This value may be incorrect for
2811
+ fisheye lenses, or if the image has been resized
2812
+ },
2813
+ Require => {
2814
+ 0 => 'FocalLength',
2815
+ 1 => 'ScaleFactor35efl',
2816
+ },
2817
+ Desire => {
2818
+ 2 => 'FocusDistance', # (multiply by 1000 to convert to mm)
2819
+ },
2820
+ # ref http://www.bobatkins.com/photography/technical/field_of_view.html
2821
+ # (calculations below apply to rectilinear lenses only, not fisheye)
2822
+ ValueConv => q{
2823
+ ToFloat(@val);
2824
+ return undef unless $val[0] and $val[1];
2825
+ my $corr = 1;
2826
+ if ($val[2]) {
2827
+ my $d = 1000 * $val[2] - $val[0];
2828
+ $corr += $val[0]/$d if $d > 0;
2829
+ }
2830
+ my $fd2 = atan2(36, 2*$val[0]*$val[1]*$corr);
2831
+ my @fov = ( $fd2 * 360 / 3.14159 );
2832
+ if ($val[2] and $val[2] > 0 and $val[2] < 10000) {
2833
+ push @fov, 2 * $val[2] * sin($fd2) / cos($fd2);
2834
+ }
2835
+ return join(' ', @fov);
2836
+ },
2837
+ PrintConv => q{
2838
+ my @v = split(' ',$val);
2839
+ my $str = sprintf("%.1f deg", $v[0]);
2840
+ $str .= sprintf(" (%.2f m)", $v[1]) if $v[1];
2841
+ return $str;
2842
+ },
2843
+ },
2844
+ # generate DateTimeOriginal from Date and Time Created if not extracted already
2845
+ DateTimeOriginal => {
2846
+ Condition => 'not defined $$self{VALUE}{DateTimeOriginal}',
2847
+ Description => 'Date/Time Original',
2848
+ Groups => { 2 => 'Time' },
2849
+ Desire => {
2850
+ 0 => 'DateTimeCreated',
2851
+ 1 => 'DateCreated',
2852
+ 2 => 'TimeCreated',
2853
+ },
2854
+ RawConv => '($val[1] and $val[2]) ? $val : undef',
2855
+ ValueConv => q{
2856
+ return $val[0] if $val[0] and $val[0]=~/ /;
2857
+ return "$val[1] $val[2]";
2858
+ },
2859
+ PrintConv => '$self->ConvertDateTime($val)',
2860
+ },
2861
+ ThumbnailImage => {
2862
+ Writable => 1,
2863
+ WriteCheck => '$self->CheckImage(\$val)',
2864
+ WriteAlso => {
2865
+ # (the 0xfeedfeed values are translated in the Exif write routine)
2866
+ ThumbnailOffset => 'defined $val ? 0xfeedfeed : undef',
2867
+ ThumbnailLength => 'defined $val ? 0xfeedfeed : undef',
2868
+ },
2869
+ Require => {
2870
+ 0 => 'ThumbnailOffset',
2871
+ 1 => 'ThumbnailLength',
2872
+ },
2873
+ # retrieve the thumbnail from our EXIF data
2874
+ RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ThumbnailImage")',
2875
+ },
2876
+ PreviewImage => {
2877
+ Writable => 1,
2878
+ WriteCheck => '$self->CheckImage(\$val)',
2879
+ DelCheck => '$val = ""; return undef', # can't delete, so set to empty string
2880
+ WriteAlso => {
2881
+ PreviewImageStart => 'defined $val ? 0xfeedfeed : undef',
2882
+ PreviewImageLength => 'defined $val ? 0xfeedfeed : undef',
2883
+ PreviewImageValid => 'defined $val and length $val ? 1 : 0',
2884
+ },
2885
+ Require => {
2886
+ 0 => 'PreviewImageStart',
2887
+ 1 => 'PreviewImageLength',
2888
+ },
2889
+ Desire => {
2890
+ 2 => 'PreviewImageValid',
2891
+ # (DNG and A100 ARW may be have 2 preview images)
2892
+ 3 => 'PreviewImageStart (1)',
2893
+ 4 => 'PreviewImageLength (1)',
2894
+ },
2895
+ # note: extract 2nd preview, but ignore double-referenced preview
2896
+ # (in A100 ARW images, the 2nd PreviewImageLength from IFD0 may be wrong anyway)
2897
+ RawConv => q{
2898
+ if ($val[3] and $val[4] and $val[0] ne $val[3]) {
2899
+ my %val = (
2900
+ 0 => 'PreviewImageStart (1)',
2901
+ 1 => 'PreviewImageLength (1)',
2902
+ 2 => 'PreviewImageValid',
2903
+ );
2904
+ $self->FoundTag($tagInfo, \%val);
2905
+ }
2906
+ return undef if defined $val[2] and not $val[2];
2907
+ return Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],'PreviewImage');
2908
+ },
2909
+ },
2910
+ JpgFromRaw => {
2911
+ Writable => 1,
2912
+ WriteCheck => '$self->CheckImage(\$val)',
2913
+ WriteAlso => {
2914
+ JpgFromRawStart => 'defined $val ? 0xfeedfeed : undef',
2915
+ JpgFromRawLength => 'defined $val ? 0xfeedfeed : undef',
2916
+ },
2917
+ Require => {
2918
+ 0 => 'JpgFromRawStart',
2919
+ 1 => 'JpgFromRawLength',
2920
+ },
2921
+ RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"JpgFromRaw")',
2922
+ },
2923
+ OtherImage => {
2924
+ Writable => 1,
2925
+ WriteCheck => '$self->CheckImage(\$val)',
2926
+ DelCheck => '$val = ""; return undef', # can't delete, so set to empty string
2927
+ WriteAlso => {
2928
+ OtherImageStart => 'defined $val ? 0xfeedfeed : undef',
2929
+ OtherImageLength => 'defined $val ? 0xfeedfeed : undef',
2930
+ },
2931
+ Require => {
2932
+ 0 => 'OtherImageStart',
2933
+ 1 => 'OtherImageLength',
2934
+ },
2935
+ # retrieve the thumbnail from our EXIF data
2936
+ RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"OtherImage")',
2937
+ },
2938
+ PreviewImageSize => {
2939
+ Require => {
2940
+ 0 => 'PreviewImageWidth',
2941
+ 1 => 'PreviewImageHeight',
2942
+ },
2943
+ ValueConv => '"$val[0]x$val[1]"',
2944
+ },
2945
+ SubSecDateTimeOriginal => {
2946
+ Description => 'Date/Time Original',
2947
+ Groups => { 2 => 'Time' },
2948
+ Require => {
2949
+ 0 => 'EXIF:DateTimeOriginal',
2950
+ 1 => 'SubSecTimeOriginal',
2951
+ },
2952
+ # be careful here just in case there is a timezone following the seconds
2953
+ RawConv => '$val[1]=~/\d/ ? $val : undef',
2954
+ ValueConv => q{
2955
+ $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
2956
+ },
2957
+ PrintConv => '$self->ConvertDateTime($val)',
2958
+ },
2959
+ SubSecCreateDate => {
2960
+ Description => 'Create Date',
2961
+ Groups => { 2 => 'Time' },
2962
+ Require => {
2963
+ 0 => 'EXIF:CreateDate',
2964
+ 1 => 'SubSecTimeDigitized',
2965
+ },
2966
+ RawConv => '$val[1]=~/\d/ ? $val : undef',
2967
+ ValueConv => q{
2968
+ $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
2969
+ },
2970
+ PrintConv => '$self->ConvertDateTime($val)',
2971
+ },
2972
+ SubSecModifyDate => {
2973
+ Description => 'Modify Date',
2974
+ Groups => { 2 => 'Time' },
2975
+ Require => {
2976
+ 0 => 'EXIF:ModifyDate',
2977
+ 1 => 'SubSecTime',
2978
+ },
2979
+ RawConv => '$val[1]=~/\d/ ? $val : undef',
2980
+ ValueConv => q{
2981
+ $_ = $val[0]; s/( \d{2}:\d{2}:\d{2})/$1\.$val[1]/; $_;
2982
+ },
2983
+ PrintConv => '$self->ConvertDateTime($val)',
2984
+ },
2985
+ CFAPattern => {
2986
+ Require => {
2987
+ 0 => 'CFARepeatPatternDim',
2988
+ 1 => 'CFAPattern2',
2989
+ },
2990
+ # generate CFAPattern
2991
+ ValueConv => q{
2992
+ my @a = split / /, $val[0];
2993
+ my @b = split / /, $val[1];
2994
+ return '?' unless @a==2 and @b==$a[0]*$a[1];
2995
+ return "$a[0] $a[1] @b";
2996
+ },
2997
+ PrintConv => 'Image::ExifTool::Exif::PrintCFAPattern($val)',
2998
+ },
2999
+ RedBalance => {
3000
+ Groups => { 2 => 'Camera' },
3001
+ Desire => {
3002
+ 0 => 'WB_RGGBLevels',
3003
+ 1 => 'WB_RGBGLevels',
3004
+ 2 => 'WB_RBGGLevels',
3005
+ 3 => 'WB_GRBGLevels',
3006
+ 4 => 'WB_GRGBLevels',
3007
+ 5 => 'WB_GBRGLevels',
3008
+ 6 => 'WB_RGBLevels',
3009
+ 7 => 'WB_GRBLevels',
3010
+ 8 => 'WB_RBLevels',
3011
+ 9 => 'WBRedLevel', # red
3012
+ 10 => 'WBGreenLevel',
3013
+ },
3014
+ ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(0,@val)',
3015
+ PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
3016
+ },
3017
+ BlueBalance => {
3018
+ Groups => { 2 => 'Camera' },
3019
+ Desire => {
3020
+ 0 => 'WB_RGGBLevels',
3021
+ 1 => 'WB_RGBGLevels',
3022
+ 2 => 'WB_RBGGLevels',
3023
+ 3 => 'WB_GRBGLevels',
3024
+ 4 => 'WB_GRGBLevels',
3025
+ 5 => 'WB_GBRGLevels',
3026
+ 6 => 'WB_RGBLevels',
3027
+ 7 => 'WB_GRBLevels',
3028
+ 8 => 'WB_RBLevels',
3029
+ 9 => 'WBBlueLevel', # blue
3030
+ 10 => 'WBGreenLevel',
3031
+ },
3032
+ ValueConv => 'Image::ExifTool::Exif::RedBlueBalance(1,@val)',
3033
+ PrintConv => 'int($val * 1e6 + 0.5) * 1e-6',
3034
+ },
3035
+ GPSPosition => {
3036
+ Groups => { 2 => 'Location' },
3037
+ Require => {
3038
+ 0 => 'GPSLatitude',
3039
+ 1 => 'GPSLongitude',
3040
+ },
3041
+ ValueConv => '"$val[0] $val[1]"',
3042
+ PrintConv => '"$prt[0], $prt[1]"',
3043
+ },
3044
+ LensID => {
3045
+ Groups => { 2 => 'Camera' },
3046
+ Require => {
3047
+ 0 => 'LensType',
3048
+ },
3049
+ Desire => {
3050
+ 1 => 'FocalLength',
3051
+ 2 => 'MaxAperture',
3052
+ 3 => 'MaxApertureValue',
3053
+ 4 => 'MinFocalLength',
3054
+ 5 => 'MaxFocalLength',
3055
+ 6 => 'LensModel',
3056
+ 7 => 'LensFocalRange',
3057
+ 8 => 'LensSpec',
3058
+ 9 => 'LensType2',
3059
+ },
3060
+ Notes => q{
3061
+ attempt to identify the actual lens from all lenses with a given LensType.
3062
+ Applies only to LensType values with a lookup table. May be configured
3063
+ by adding user-defined lenses
3064
+ },
3065
+ # this LensID is only valid if the LensType has a PrintConv or is a model name
3066
+ RawConv => q{
3067
+ return $val if ref $$self{TAG_INFO}{LensType}{PrintConv} eq "HASH" or
3068
+ $val[0] =~ /(mm|\d\/F)/;
3069
+ return undef;
3070
+ },
3071
+ ValueConv => '$val',
3072
+ PrintConv => q{
3073
+ my $pcv;
3074
+ # use LensType2 instead of LensType if available and valid (Sony E-mount lenses)
3075
+ if ($val[9] and $val[9] & 0x8000) {
3076
+ $val[0] = $val[9];
3077
+ $prt[0] = $prt[9];
3078
+ $pcv = $$self{TAG_INFO}{LensType2}{PrintConv};
3079
+ }
3080
+ Image::ExifTool::Exif::PrintLensID($self, $prt[0], $pcv, $prt[8], @val);
3081
+ },
3082
+ },
3083
+ );
3084
+
3085
+ # table for unknown IFD entries
3086
+ %Image::ExifTool::Exif::Unknown = (
3087
+ GROUPS => { 0 => 'EXIF', 1 => 'UnknownIFD', 2 => 'Image'},
3088
+ WRITE_PROC => \&WriteExif,
3089
+ );
3090
+
3091
+ # add our composite tags
3092
+ Image::ExifTool::AddCompositeTags('Image::ExifTool::Exif');
3093
+
3094
+
3095
+ #------------------------------------------------------------------------------
3096
+ # AutoLoad our writer routines when necessary
3097
+ #
3098
+ sub AUTOLOAD
3099
+ {
3100
+ return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
3101
+ }
3102
+
3103
+ #------------------------------------------------------------------------------
3104
+ # Identify RAW file type for some TIFF-based formats using Compression value
3105
+ # Inputs: 0) ExifTool object reference, 1) Compression value
3106
+ # - sets TIFF_TYPE and FileType if identified
3107
+ sub IdentifyRawFile($$)
3108
+ {
3109
+ my ($et, $comp) = @_;
3110
+ if ($$et{FILE_TYPE} eq 'TIFF' and not $$et{IdentifiedRawFile}) {
3111
+ if ($compression{$comp} and $compression{$comp} =~ /^\w+ ([A-Z]{3}) Compressed$/) {
3112
+ $et->OverrideFileType($$et{TIFF_TYPE} = $1);
3113
+ $$et{IdentifiedRawFile} = 1;
3114
+ }
3115
+ }
3116
+ }
3117
+
3118
+ #------------------------------------------------------------------------------
3119
+ # Calculate LV (Light Value)
3120
+ # Inputs: 0) Aperture, 1) ShutterSpeed, 2) ISO
3121
+ # Returns: LV value (and converts input values to floating point if necessary)
3122
+ sub CalculateLV($$$)
3123
+ {
3124
+ local $_;
3125
+ # do validity checks on arguments
3126
+ return undef unless @_ >= 3;
3127
+ foreach (@_) {
3128
+ return undef unless $_ and /([+-]?(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?)/ and $1 > 0;
3129
+ $_ = $1; # extract float from any other garbage
3130
+ }
3131
+ # (A light value of 0 is defined as f/1.0 at 1 second with ISO 100)
3132
+ return (2*log($_[0]) - log($_[1]) - log($_[2]/100)) / log(2);
3133
+ }
3134
+
3135
+ #------------------------------------------------------------------------------
3136
+ # Calculate scale factor for 35mm effective focal length (ref 26/PH)
3137
+ # Inputs: 0) ExifTool object ref
3138
+ # 1) Focal length
3139
+ # 2) Focal length in 35mm format
3140
+ # 3) Canon digital zoom factor
3141
+ # 4) Focal plane diagonal size (in mm)
3142
+ # 5) Sensor size (X and Y in mm)
3143
+ # 6/7) Focal plane X/Y size (in mm)
3144
+ # 8) focal plane resolution units (1=None,2=inches,3=cm,4=mm,5=um)
3145
+ # 9/10) Focal plane X/Y resolution
3146
+ # 11/12,13/14...) Image width/height in order of precedence (first valid pair is used)
3147
+ # Returns: 35mm conversion factor (or undefined if it can't be calculated)
3148
+ sub CalcScaleFactor35efl
3149
+ {
3150
+ my $et = shift;
3151
+ my $res = $_[7]; # save resolution units (in case they have been converted to string)
3152
+ my $sensXY = $_[4];
3153
+ Image::ExifTool::ToFloat(@_);
3154
+ my $focal = shift;
3155
+ my $foc35 = shift;
3156
+
3157
+ return $foc35 / $focal if $focal and $foc35;
3158
+
3159
+ my $digz = shift || 1;
3160
+ my $diag = shift;
3161
+ my $sens = shift;
3162
+ # calculate Canon sensor size using a dedicated algorithm
3163
+ if ($$et{Make} eq 'Canon') {
3164
+ require Image::ExifTool::Canon;
3165
+ my $canonDiag = Image::ExifTool::Canon::CalcSensorDiag(
3166
+ $$et{RATIONAL}{FocalPlaneXResolution},
3167
+ $$et{RATIONAL}{FocalPlaneYResolution},
3168
+ );
3169
+ $diag = $canonDiag if $canonDiag;
3170
+ }
3171
+ unless ($diag and Image::ExifTool::IsFloat($diag)) {
3172
+ if ($sens and $sensXY =~ / (\d+(\.?\d*)?)$/) {
3173
+ $diag = sqrt($sens * $sens + $1 * $1);
3174
+ } else {
3175
+ undef $diag;
3176
+ my $xsize = shift;
3177
+ my $ysize = shift;
3178
+ if ($xsize and $ysize) {
3179
+ # validate by checking aspect ratio because FocalPlaneX/YSize is not reliable
3180
+ my $a = $xsize / $ysize;
3181
+ if (abs($a-1.3333) < .1 or abs($a-1.5) < .1) {
3182
+ $diag = sqrt($xsize * $xsize + $ysize * $ysize);
3183
+ }
3184
+ }
3185
+ }
3186
+ unless ($diag) {
3187
+ # get number of mm in units (assume inches unless otherwise specified)
3188
+ my %lkup = ( 3=>10, 4=>1, 5=>0.001 , cm=>10, mm=>1, um=>0.001 );
3189
+ my $units = $lkup{ shift() || $res || '' } || 25.4;
3190
+ my $x_res = shift || return undef;
3191
+ my $y_res = shift || return undef;
3192
+ Image::ExifTool::IsFloat($x_res) and $x_res != 0 or return undef;
3193
+ Image::ExifTool::IsFloat($y_res) and $y_res != 0 or return undef;
3194
+ my ($w, $h);
3195
+ for (;;) {
3196
+ @_ < 2 and return undef;
3197
+ $w = shift;
3198
+ $h = shift;
3199
+ next unless $w and $h;
3200
+ my $a = $w / $h;
3201
+ last if $a > 0.5 and $a < 2; # stop if we get a reasonable value
3202
+ }
3203
+ # calculate focal plane size in mm
3204
+ $w *= $units / $x_res;
3205
+ $h *= $units / $y_res;
3206
+ $diag = sqrt($w*$w+$h*$h);
3207
+ # make sure size is reasonable
3208
+ return undef unless $diag > 1 and $diag < 100;
3209
+ }
3210
+ }
3211
+ return sqrt(36*36+24*24) * $digz / $diag;
3212
+ }
3213
+
3214
+ #------------------------------------------------------------------------------
3215
+ # Print exposure compensation fraction
3216
+ sub PrintFraction($)
3217
+ {
3218
+ my $val = shift;
3219
+ my $str;
3220
+ if (defined $val) {
3221
+ $val *= 1.00001; # avoid round-off errors
3222
+ if (not $val) {
3223
+ $str = '0';
3224
+ } elsif (int($val)/$val > 0.999) {
3225
+ $str = sprintf("%+d", int($val));
3226
+ } elsif ((int($val*2))/($val*2) > 0.999) {
3227
+ $str = sprintf("%+d/2", int($val * 2));
3228
+ } elsif ((int($val*3))/($val*3) > 0.999) {
3229
+ $str = sprintf("%+d/3", int($val * 3));
3230
+ } else {
3231
+ $str = sprintf("%+.3g", $val);
3232
+ }
3233
+ }
3234
+ return $str;
3235
+ }
3236
+
3237
+ #------------------------------------------------------------------------------
3238
+ # Convert fraction or number to floating point value (or 'undef' or 'inf')
3239
+ sub ConvertFraction($)
3240
+ {
3241
+ my $val = shift;
3242
+ if ($val =~ m{([-+]?\d+)/(\d+)}) {
3243
+ $val = $2 ? $1 / $2 : ($1 ? 'inf' : 'undef');
3244
+ }
3245
+ return $val;
3246
+ }
3247
+
3248
+ #------------------------------------------------------------------------------
3249
+ # Convert EXIF text to something readable
3250
+ # Inputs: 0) ExifTool object reference, 1) EXIF text,
3251
+ # 2) flag to apply CharsetEXIF to ASCII text
3252
+ # Returns: text encoded according to Charset option (with trailing spaces removed)
3253
+ sub ConvertExifText($$;$)
3254
+ {
3255
+ my ($et, $val, $asciiFlex) = @_;
3256
+ return $val if length($val) < 8;
3257
+ my $id = substr($val, 0, 8);
3258
+ my $str = substr($val, 8);
3259
+ # Note: allow spaces instead of nulls in the ID codes because
3260
+ # it is fairly common for camera manufacturers to get this wrong
3261
+ # (also handle Canon ZoomBrowser EX 4.5 null followed by 7 bytes of garbage)
3262
+ if ($id =~ /^(ASCII)?(\0|[\0 ]+$)/) {
3263
+ # truncate at null terminator (shouldn't have a null based on the
3264
+ # EXIF spec, but it seems that few people actually read the spec)
3265
+ $str =~ s/\0.*//s;
3266
+ # allow ASCII text to contain any other specified encoding
3267
+ if ($asciiFlex) {
3268
+ my $enc = $et->Options('CharsetEXIF');
3269
+ $str = $et->Decode($str, $enc) if $enc;
3270
+ }
3271
+ # by the EXIF spec, the following string should be "UNICODE\0", but
3272
+ # apparently Kodak sometimes uses "Unicode\0" in the APP3 "Meta" information.
3273
+ # However, unfortunately Ricoh uses "Unicode\0" in the RR30 EXIF UserComment
3274
+ # when the text is actually ASCII, so only recognize uppercase "UNICODE\0".
3275
+ } elsif ($id =~ /^UNICODE[\0 ]$/) {
3276
+ # MicrosoftPhoto writes as little-endian even in big-endian EXIF,
3277
+ # so we must guess at the true byte ordering
3278
+ $str = $et->Decode($str, 'UTF16', 'Unknown');
3279
+ } elsif ($id =~ /^JIS[\0 ]{5}$/) {
3280
+ $str = $et->Decode($str, 'JIS', 'Unknown');
3281
+ } else {
3282
+ $et->Warn('Invalid EXIF text encoding');
3283
+ $str = $id . $str;
3284
+ }
3285
+ $str =~ s/ +$//; # trim trailing blanks
3286
+ return $str;
3287
+ }
3288
+
3289
+ #------------------------------------------------------------------------------
3290
+ # Print conversion for SpatialFrequencyResponse
3291
+ sub PrintSFR($)
3292
+ {
3293
+ my $val = shift;
3294
+ return $val unless length $val > 4;
3295
+ my ($n, $m) = (Get16u(\$val, 0), Get16u(\$val, 2));
3296
+ my @cols = split /\0/, substr($val, 4), $n+1;
3297
+ my $pos = length($val) - 8 * $n * $m;
3298
+ return $val unless @cols == $n+1 and $pos >= 4;
3299
+ pop @cols;
3300
+ my ($i, $j);
3301
+ for ($i=0; $i<$n; ++$i) {
3302
+ my @rows;
3303
+ for ($j=0; $j<$m; ++$j) {
3304
+ push @rows, Image::ExifTool::GetRational64u(\$val, $pos + 8*($i+$j*$n));
3305
+ }
3306
+ $cols[$i] .= '=' . join(',',@rows) . '';
3307
+ }
3308
+ return join '; ', @cols;
3309
+ }
3310
+
3311
+ #------------------------------------------------------------------------------
3312
+ # Print numerical parameter value (with sign, or 'Normal' for zero)
3313
+ # Inputs: 0) value, 1) flag for inverse conversion, 2) conversion hash reference
3314
+ sub PrintParameter($$$)
3315
+ {
3316
+ my ($val, $inv, $conv) = @_;
3317
+ return $val if $inv;
3318
+ if ($val > 0) {
3319
+ if ($val > 0xfff0) { # a negative value in disguise?
3320
+ $val = $val - 0x10000;
3321
+ } else {
3322
+ $val = "+$val";
3323
+ }
3324
+ }
3325
+ return $val;
3326
+ }
3327
+
3328
+ #------------------------------------------------------------------------------
3329
+ # Convert parameter back to standard EXIF value
3330
+ # 0,0.00,etc or "Normal" => 0
3331
+ # -1,-2,etc or "Soft" or "Low" => 1
3332
+ # +1,+2,1,2,etc or "Hard" or "High" => 2
3333
+ sub ConvertParameter($)
3334
+ {
3335
+ my $val = shift;
3336
+ my $isFloat = Image::ExifTool::IsFloat($val);
3337
+ # normal is a value of zero
3338
+ return 0 if $val =~ /\bn/i or ($isFloat and $val == 0);
3339
+ # "soft", "low" or any negative number is a value of 1
3340
+ return 1 if $val =~ /\b(s|l)/i or ($isFloat and $val < 0);
3341
+ # "hard", "high" or any positive number is a value of 2
3342
+ return 2 if $val =~ /\bh/i or $isFloat;
3343
+ return undef;
3344
+ }
3345
+
3346
+ #------------------------------------------------------------------------------
3347
+ # Calculate Red/BlueBalance
3348
+ # Inputs: 0) 0=red, 1=blue, 1-8) WB_RGGB/RGBG/RBGG/GRBG/GRGB/RGB/GRB/RBLevels,
3349
+ # 8) red or blue level, 9) green level
3350
+ my @rggbLookup = (
3351
+ # indices for R, G, G and B components in input value
3352
+ [ 0, 1, 2, 3 ], # 0 RGGB
3353
+ [ 0, 1, 3, 2 ], # 1 RGBG
3354
+ [ 0, 2, 3, 1 ], # 2 RBGG
3355
+ [ 1, 0, 3, 2 ], # 3 GRBG
3356
+ [ 1, 0, 2, 3 ], # 4 GRGB
3357
+ [ 2, 3, 0, 1 ], # 5 GBRG
3358
+ [ 0, 1, 1, 2 ], # 6 RGB
3359
+ [ 1, 0, 0, 2 ], # 7 GRB
3360
+ [ 0, 256, 256, 1 ], # 8 RB (green level is 256)
3361
+ );
3362
+ sub RedBlueBalance($@)
3363
+ {
3364
+ my $blue = shift;
3365
+ my ($i, $val, $levels);
3366
+ for ($i=0; $i<@rggbLookup; ++$i) {
3367
+ $levels = shift or next;
3368
+ my @levels = split ' ', $levels;
3369
+ next if @levels < 2;
3370
+ my $lookup = $rggbLookup[$i];
3371
+ my $g = $$lookup[1]; # get green level or index
3372
+ if ($g < 4) {
3373
+ next if @levels < 3;
3374
+ $g = ($levels[$g] + $levels[$$lookup[2]]) / 2 or next;
3375
+ } elsif ($levels[$$lookup[$blue * 3]] < 4) {
3376
+ $g = 1; # Some Nikon cameras use a scaling factor of 1 (E5700)
3377
+ }
3378
+ $val = $levels[$$lookup[$blue * 3]] / $g;
3379
+ last;
3380
+ }
3381
+ $val = $_[0] / $_[1] if not defined $val and ($_[0] and $_[1]);
3382
+ return $val;
3383
+ }
3384
+
3385
+ #------------------------------------------------------------------------------
3386
+ # Print exposure time as a fraction
3387
+ sub PrintExposureTime($)
3388
+ {
3389
+ my $secs = shift;
3390
+ if ($secs < 0.25001 and $secs > 0) {
3391
+ return sprintf("1/%d",int(0.5 + 1/$secs));
3392
+ }
3393
+ $_ = sprintf("%.1f",$secs);
3394
+ s/\.0$//;
3395
+ return $_;
3396
+ }
3397
+
3398
+ #------------------------------------------------------------------------------
3399
+ # Print FNumber
3400
+ sub PrintFNumber($)
3401
+ {
3402
+ my $val = shift;
3403
+ if (Image::ExifTool::IsFloat($val) and $val > 0) {
3404
+ # round to 1 decimal place, or 2 for values < 1.0
3405
+ $val = sprintf(($val<1 ? "%.2f" : "%.1f"), $val);
3406
+ }
3407
+ return $val;
3408
+ }
3409
+
3410
+ #------------------------------------------------------------------------------
3411
+ # Decode raw CFAPattern value
3412
+ # Inputs: 0) ExifTool ref, 1) binary value
3413
+ # Returns: string of numbers
3414
+ sub DecodeCFAPattern($$)
3415
+ {
3416
+ my ($self, $val) = @_;
3417
+ # some panasonic cameras (SV-AS3, SV-AS30) write this in ascii (very odd)
3418
+ if ($val =~ /^[0-6]+$/) {
3419
+ $self->Warn('Incorrectly formatted CFAPattern', 1);
3420
+ $val =~ tr/0-6/\x00-\x06/;
3421
+ }
3422
+ return $val unless length($val) >= 4;
3423
+ my @a = unpack(GetByteOrder() eq 'II' ? 'v2C*' : 'n2C*', $val);
3424
+ my $end = 2 + $a[0] * $a[1];
3425
+ if ($end > @a) {
3426
+ # try swapping byte order (I have seen this order different than in EXIF)
3427
+ my ($x, $y) = unpack('n2',pack('v2',$a[0],$a[1]));
3428
+ if (@a < 2 + $x * $y) {
3429
+ $self->Warn('Invalid CFAPattern', 1);
3430
+ } else {
3431
+ ($a[0], $a[1]) = ($x, $y);
3432
+ # (can't technically be wrong because the order isn't well defined by the EXIF spec)
3433
+ # $self->Warn('Wrong byte order for CFAPattern');
3434
+ }
3435
+ }
3436
+ return "@a";
3437
+ }
3438
+
3439
+ #------------------------------------------------------------------------------
3440
+ # Print CFA Pattern
3441
+ sub PrintCFAPattern($)
3442
+ {
3443
+ my $val = shift;
3444
+ my @a = split ' ', $val;
3445
+ return '<truncated data>' unless @a >= 2;
3446
+ return '<zero pattern size>' unless $a[0] and $a[1];
3447
+ my $end = 2 + $a[0] * $a[1];
3448
+ return '<invalid pattern size>' if $end > @a;
3449
+ my @cfaColor = qw(Red Green Blue Cyan Magenta Yellow White);
3450
+ my ($pos, $rtnVal) = (2, '[');
3451
+ for (;;) {
3452
+ $rtnVal .= $cfaColor[$a[$pos]] || 'Unknown';
3453
+ last if ++$pos >= $end;
3454
+ ($pos - 2) % $a[1] and $rtnVal .= ',', next;
3455
+ $rtnVal .= '][';
3456
+ }
3457
+ return $rtnVal . ']';
3458
+ }
3459
+
3460
+ #------------------------------------------------------------------------------
3461
+ # Print conversion for lens info
3462
+ # Inputs: 0) string of values (min focal, max focal, min F, max F)
3463
+ # Returns: string in the form "12-20mm f/3.8-4.5" or "50mm f/1.4"
3464
+ sub PrintLensInfo($)
3465
+ {
3466
+ my $val = shift;
3467
+ my @vals = split ' ', $val;
3468
+ return $val unless @vals == 4;
3469
+ my $c = 0;
3470
+ foreach (@vals) {
3471
+ Image::ExifTool::IsFloat($_) and ++$c, next;
3472
+ $_ eq 'inf' and $_ = '?', ++$c, next;
3473
+ $_ eq 'undef' and $_ = '?', ++$c, next;
3474
+ }
3475
+ return $val unless $c == 4;
3476
+ $val = $vals[0];
3477
+ # (the Pentax Q writes zero for upper value of fixed-focal-length lenses)
3478
+ $val .= "-$vals[1]" if $vals[1] and $vals[1] ne $vals[0];
3479
+ $val .= "mm f/$vals[2]";
3480
+ $val .= "-$vals[3]" if $vals[3] and $vals[3] ne $vals[2];
3481
+ return $val;
3482
+ }
3483
+
3484
+ #------------------------------------------------------------------------------
3485
+ # Get lens info from lens model string
3486
+ # Inputs: 0) lens string, 1) flag to allow unknown "?" values
3487
+ # Returns: 0) min focal, 1) max focal, 2) min aperture, 3) max aperture
3488
+ # Notes: returns empty list if lens string could not be parsed
3489
+ sub GetLensInfo($;$)
3490
+ {
3491
+ my ($lens, $unk) = @_;
3492
+ # extract focal length and aperture ranges for this lens
3493
+ my $pat = '\\d+(?:\\.\\d+)?';
3494
+ $pat .= '|\\?' if $unk;
3495
+ return () unless $lens =~ /($pat)(?:-($pat))?\s*mm.*?(?:[fF]\/?\s*)($pat)(?:-($pat))?/;
3496
+ # ($1=short focal, $2=long focal, $3=max aperture wide, $4=max aperture tele)
3497
+ my @a = ($1, $2, $3, $4);
3498
+ $a[1] or $a[1] = $a[0];
3499
+ $a[3] or $a[3] = $a[2];
3500
+ if ($unk) {
3501
+ local $_;
3502
+ $_ eq '?' and $_ = 'undef' foreach @a;
3503
+ }
3504
+ return @a;
3505
+ }
3506
+
3507
+ #------------------------------------------------------------------------------
3508
+ # Attempt to identify the specific lens if multiple lenses have the same LensType
3509
+ # Inputs: 0) ExifTool object ref, 1) LensType print value, 2) PrintConv hash ref,
3510
+ # 3) LensSpec print value, 4) LensType numerical value, 5) FocalLength,
3511
+ # 6) MaxAperture, 7) MaxApertureValue, 8) MinFocalLength, 9) MaxFocalLength,
3512
+ # 10) LensModel, 11) LensFocalRange, 12) LensSpec
3513
+ sub PrintLensID($$@)
3514
+ {
3515
+ my ($et, $lensTypePrt, $printConv, $lensSpecPrt, $lensType, $focalLength,
3516
+ $maxAperture, $maxApertureValue, $shortFocal, $longFocal, $lensModel,
3517
+ $lensFocalRange, $lensSpec) = @_;
3518
+ # the rest of the logic relies on the LensType lookup:
3519
+ return undef unless defined $lensType;
3520
+ # get print conversion hash if necessary
3521
+ $printConv or $printConv = $$et{TAG_INFO}{LensType}{PrintConv};
3522
+ # just copy LensType PrintConv value if it was a lens name
3523
+ # (Olympus or Panasonic -- just exclude things like Nikon and Leaf LensType)
3524
+ unless (ref $printConv eq 'HASH') {
3525
+ return $lensTypePrt if $lensTypePrt =~ /mm/;
3526
+ return $lensTypePrt if $lensTypePrt =~ s/(\d)\/F/$1mm F/;
3527
+ return undef;
3528
+ }
3529
+ # get LensSpec information if available (Sony)
3530
+ my ($sf0, $lf0, $sa0, $la0);
3531
+ if ($lensSpecPrt) {
3532
+ ($sf0, $lf0, $sa0, $la0) = GetLensInfo($lensSpecPrt);
3533
+ undef $sf0 unless $sa0; # (make sure aperture isn't zero)
3534
+ }
3535
+ # use MaxApertureValue if MaxAperture is not available
3536
+ $maxAperture = $maxApertureValue unless $maxAperture;
3537
+ if ($lensFocalRange and $lensFocalRange =~ /^(\d+)(?: (?:to )?(\d+))?$/) {
3538
+ ($shortFocal, $longFocal) = ($1, $2 || $1);
3539
+ }
3540
+ if ($$et{Make} eq 'SONY') {
3541
+ if (($lensType & 0xff00) == 0xef00) {
3542
+ # patch for Metabones Canon adapter on a Sony camera (ref Jos Roost)
3543
+ # (note: the adapter kills the high byte for 2-byte LensType values,
3544
+ # so the reported lens will be incorrect for these)
3545
+ require Image::ExifTool::Canon;
3546
+ $printConv = \%Image::ExifTool::Canon::canonLensTypes;
3547
+ $lensType &= 0xff;
3548
+ $lensTypePrt = $$printConv{$lensType} if $$printConv{$lensType};
3549
+ }
3550
+ } elsif ($shortFocal and $longFocal) {
3551
+ # Canon (and some other makes) include makernote information
3552
+ # which allows better lens identification
3553
+ require Image::ExifTool::Canon;
3554
+ return Image::ExifTool::Canon::PrintLensID($printConv, $lensType,
3555
+ $shortFocal, $longFocal, $maxAperture, $lensModel);
3556
+ }
3557
+ my $lens = $$printConv{$lensType};
3558
+ return ($lensModel || $lensTypePrt) unless $lens;
3559
+ return $lens unless $$printConv{"$lensType.1"};
3560
+ $lens =~ s/ or .*//s; # remove everything after "or"
3561
+ # make list of all possible matching lenses
3562
+ my @lenses = ( $lens );
3563
+ my $i;
3564
+ for ($i=1; $$printConv{"$lensType.$i"}; ++$i) {
3565
+ push @lenses, $$printConv{"$lensType.$i"};
3566
+ }
3567
+ # attempt to determine actual lens
3568
+ my (@matches, @best, @user, $diff);
3569
+ foreach $lens (@lenses) {
3570
+ push @user, $lens if $Image::ExifTool::userLens{$lens};
3571
+ # sf = short focal
3572
+ # lf = long focal
3573
+ # sa = max aperture at short focal
3574
+ # la = max aperture at long focal
3575
+ my ($sf, $lf, $sa, $la) = GetLensInfo($lens);
3576
+ next unless $sf;
3577
+ # check against LensSpec parameters if available
3578
+ if ($sf0) {
3579
+ next if abs($sf - $sf0) > 0.5 or abs($sa - $sa0) > 0.15 or
3580
+ abs($lf - $lf0) > 0.5 or abs($la - $la0) > 0.15;
3581
+ # the basic parameters match, but also check against additional lens features
3582
+ # for Sony E lenses -- the full LensSpec string should match with end of LensType
3583
+ $lensSpecPrt and $lens =~ /\Q$lensSpecPrt\E$/ and @best = ( $lens ), last;
3584
+ # exactly-matching Sony E lens should have been found above, so skip
3585
+ # any not-exactly-matching Sony E-lenses
3586
+ next if $lens =~ /^Sony E /;
3587
+ push @best, $lens;
3588
+ next;
3589
+ }
3590
+ # adjust focal length and aperture if teleconverter is attached (Minolta)
3591
+ if ($lens =~ / \+ .*? (\d+(\.\d+)?)x( |$)/) {
3592
+ $sf *= $1; $lf *= $1;
3593
+ $sa *= $1; $la *= $1;
3594
+ }
3595
+ # see if we can rule out this lens using FocalLength and MaxAperture
3596
+ if ($focalLength) {
3597
+ next if $focalLength < $sf - 0.5;
3598
+ next if $focalLength > $lf + 0.5;
3599
+ }
3600
+ if ($maxAperture) {
3601
+ # it seems that most manufacturers set MaxAperture and MaxApertureValue
3602
+ # to the maximum aperture (smallest F number) for the current focal length
3603
+ # of the lens, so assume that MaxAperture varies with focal length and find
3604
+ # the closest match (this is somewhat contrary to the EXIF specification which
3605
+ # states "The smallest F number of the lens", without mention of focal length)
3606
+ next if $maxAperture < $sa - 0.15; # (0.15 is arbitrary)
3607
+ next if $maxAperture > $la + 0.15;
3608
+ # now determine the best match for this aperture
3609
+ my $aa; # approximate maximum aperture at this focal length
3610
+ if ($sf == $lf or $sa == $la or $focalLength <= $sf) {
3611
+ # either 1) prime lens, 2) fixed-aperture zoom, or 3) zoom at min focal
3612
+ $aa = $sa;
3613
+ } elsif ($focalLength >= $lf) {
3614
+ $aa = $la;
3615
+ } else {
3616
+ # assume a log-log variation of max aperture with focal length
3617
+ # (see http://regex.info/blog/2006-10-05/263)
3618
+ $aa = exp(log($sa) + (log($la)-log($sa)) / (log($lf)-log($sf)) *
3619
+ (log($focalLength)-log($sf)));
3620
+ # a linear relationship between 1/FocalLength and 1/MaxAperture fits Sony better (ref 27)
3621
+ #$aa = 1 / (1/$sa + (1/$focalLength - 1/$sf) * (1/$la - 1/$sa) / (1/$lf - 1/$sf));
3622
+ }
3623
+ my $d = abs($maxAperture - $aa);
3624
+ if (defined $diff) {
3625
+ $d > $diff + 0.15 and next; # (0.15 is arbitrary)
3626
+ $d < $diff - 0.15 and undef @best;
3627
+ }
3628
+ $diff = $d;
3629
+ push @best, $lens;
3630
+ }
3631
+ push @matches, $lens;
3632
+ }
3633
+ if (@user) {
3634
+ # choose the best match if we have more than one
3635
+ if (@user > 1) {
3636
+ my ($try, @good);
3637
+ foreach $try (\@best, \@matches) {
3638
+ $Image::ExifTool::userLens{$_} and push @good, $_ foreach @$try;
3639
+ return join(' or ', @good) if @good;
3640
+ }
3641
+ }
3642
+ return join(' or ', @user);
3643
+ }
3644
+ return join(' or ', @best) if @best;
3645
+ return join(' or ', @matches) if @matches;
3646
+ $lens = $$printConv{$lensType};
3647
+ return $lensModel if $lensModel and $lens =~ / or /; # (ie. Sony NEX-5N)
3648
+ return $lens;
3649
+ }
3650
+
3651
+ #------------------------------------------------------------------------------
3652
+ # translate date into standard EXIF format
3653
+ # Inputs: 0) date
3654
+ # Returns: date in format '2003:10:22'
3655
+ # - bad formats recognized: '2003-10-22','2003/10/22','2003 10 22','20031022'
3656
+ # - removes null terminator if it exists
3657
+ sub ExifDate($)
3658
+ {
3659
+ my $date = shift;
3660
+ $date =~ s/\0$//; # remove any null terminator
3661
+ # separate year:month:day with colons
3662
+ # (have seen many other characters, including nulls, used erroneously)
3663
+ $date =~ s/(\d{4})[^\d]*(\d{2})[^\d]*(\d{2})$/$1:$2:$3/;
3664
+ return $date;
3665
+ }
3666
+
3667
+ #------------------------------------------------------------------------------
3668
+ # translate time into standard EXIF format
3669
+ # Inputs: 0) time
3670
+ # Returns: time in format '10:30:55'
3671
+ # - bad formats recognized: '10 30 55', '103055', '103055+0500'
3672
+ # - removes null terminator if it exists
3673
+ # - leaves time zone intact if specified (ie. '10:30:55+05:00')
3674
+ sub ExifTime($)
3675
+ {
3676
+ my $time = shift;
3677
+ $time =~ tr/ /:/; # use ':' (not ' ') as a separator
3678
+ $time =~ s/\0$//; # remove any null terminator
3679
+ # add separators if they don't exist
3680
+ $time =~ s/^(\d{2})(\d{2})(\d{2})/$1:$2:$3/;
3681
+ $time =~ s/([+-]\d{2})(\d{2})\s*$/$1:$2/; # to timezone too
3682
+ return $time;
3683
+ }
3684
+
3685
+ #------------------------------------------------------------------------------
3686
+ # extract image from file
3687
+ # Inputs: 0) ExifTool object reference, 1) data offset (in file), 2) data length
3688
+ # 3) [optional] tag name
3689
+ # Returns: Reference to Image if specifically requested or "Binary data" message
3690
+ # Returns undef if there was an error loading the image
3691
+ sub ExtractImage($$$$)
3692
+ {
3693
+ my ($et, $offset, $len, $tag) = @_;
3694
+ my $dataPt = \$$et{EXIF_DATA};
3695
+ my $dataPos = $$et{EXIF_POS};
3696
+ my $image;
3697
+
3698
+ # no image if length is zero, and don't try to extract binary from XMP file
3699
+ return undef if not $len or $$et{FILE_TYPE} eq 'XMP';
3700
+
3701
+ # take data from EXIF block if possible
3702
+ if (defined $dataPos and $offset>=$dataPos and $offset+$len<=$dataPos+length($$dataPt)) {
3703
+ $image = substr($$dataPt, $offset-$dataPos, $len);
3704
+ } else {
3705
+ $image = $et->ExtractBinary($offset, $len, $tag);
3706
+ return undef unless defined $image;
3707
+ # patch for incorrect ThumbnailOffset in some Sony DSLR-A100 ARW images
3708
+ if ($tag and $tag eq 'ThumbnailImage' and $$et{TIFF_TYPE} eq 'ARW' and
3709
+ $$et{Model} eq 'DSLR-A100' and $offset < 0x10000 and
3710
+ $image !~ /^(Binary data|\xff\xd8\xff)/)
3711
+ {
3712
+ my $try = $et->ExtractBinary($offset + 0x10000, $len, $tag);
3713
+ if (defined $try and $try =~ /^\xff\xd8\xff/) {
3714
+ $image = $try;
3715
+ $$et{VALUE}{ThumbnailOffset} += 0x10000;
3716
+ $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
3717
+ }
3718
+ }
3719
+ }
3720
+ return $et->ValidateImage(\$image, $tag);
3721
+ }
3722
+
3723
+ #------------------------------------------------------------------------------
3724
+ # Process EXIF directory
3725
+ # Inputs: 0) ExifTool object reference
3726
+ # 1) Reference to directory information hash
3727
+ # 2) Pointer to tag table for this directory
3728
+ # Returns: 1 on success, otherwise returns 0 and sets a Warning
3729
+ sub ProcessExif($$$)
3730
+ {
3731
+ my ($et, $dirInfo, $tagTablePtr) = @_;
3732
+ my $dataPt = $$dirInfo{DataPt};
3733
+ my $dataPos = $$dirInfo{DataPos} || 0;
3734
+ my $dataLen = $$dirInfo{DataLen};
3735
+ my $dirStart = $$dirInfo{DirStart} || 0;
3736
+ my $dirLen = $$dirInfo{DirLen} || $dataLen - $dirStart;
3737
+ my $dirName = $$dirInfo{DirName};
3738
+ my $base = $$dirInfo{Base} || 0;
3739
+ my $firstBase = $base;
3740
+ my $raf = $$dirInfo{RAF};
3741
+ my $verbose = $et->Options('Verbose');
3742
+ my $htmlDump = $$et{HTML_DUMP};
3743
+ my $success = 1;
3744
+ my ($tagKey, $dirSize, $makerAddr, $strEnc);
3745
+ my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
3746
+
3747
+ # set encoding to assume for strings
3748
+ $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
3749
+
3750
+ # ignore non-standard EXIF while in strict MWG compatibility mode
3751
+ if ($Image::ExifTool::MWG::strict and $dirName eq 'IFD0' and
3752
+ $tagTablePtr eq \%Image::ExifTool::Exif::Main and
3753
+ $$et{FILE_TYPE} =~ /^(JPEG|TIFF|PSD)$/)
3754
+ {
3755
+ my $path = $et->MetadataPath();
3756
+ unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
3757
+ $et->Warn("Ignored non-standard EXIF at $path");
3758
+ return 1;
3759
+ }
3760
+ }
3761
+ $verbose = -1 if $htmlDump; # mix htmlDump into verbose so we can test for both at once
3762
+ $dirName eq 'EXIF' and $dirName = $$dirInfo{DirName} = 'IFD0';
3763
+ $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
3764
+ # get a more descriptive name for MakerNote sub-directories
3765
+ my $name = $$dirInfo{Name};
3766
+ $name = $dirName unless $name and $inMakerNotes and $name !~ /^MakerNote/;
3767
+
3768
+ my ($numEntries, $dirEnd);
3769
+ if ($dirStart >= 0 and $dirStart <= $dataLen-2) {
3770
+ # make sure data is large enough (patches bug in Olympus subdirectory lengths)
3771
+ $numEntries = Get16u($dataPt, $dirStart);
3772
+ $dirSize = 2 + 12 * $numEntries;
3773
+ $dirEnd = $dirStart + $dirSize;
3774
+ if ($dirSize > $dirLen) {
3775
+ if ($verbose > 0 and not $$dirInfo{SubIFD}) {
3776
+ my $short = $dirSize - $dirLen;
3777
+ $et->Warn("Short directory size (missing $short bytes)");
3778
+ }
3779
+ undef $dirSize if $dirEnd > $dataLen; # read from file if necessary
3780
+ }
3781
+ }
3782
+ # read IFD from file if necessary
3783
+ unless ($dirSize) {
3784
+ $success = 0;
3785
+ if ($raf) {
3786
+ # read the count of entries in this IFD
3787
+ my $offset = $dirStart + $dataPos;
3788
+ my ($buff, $buf2);
3789
+ if ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
3790
+ my $len = 12 * Get16u(\$buff,0);
3791
+ # also read next IFD pointer if available
3792
+ if ($raf->Read($buf2, $len+4) >= $len) {
3793
+ $buff .= $buf2;
3794
+ # make copy of dirInfo since we're going to modify it
3795
+ my %newDirInfo = %$dirInfo;
3796
+ $dirInfo = \%newDirInfo;
3797
+ # update directory parameters for the newly loaded IFD
3798
+ $dataPt = $$dirInfo{DataPt} = \$buff;
3799
+ $dataPos = $$dirInfo{DataPos} = $offset;
3800
+ $dataLen = $$dirInfo{DataLen} = length $buff;
3801
+ $dirStart = $$dirInfo{DirStart} = 0;
3802
+ $dirLen = $$dirInfo{DirLen} = length $buff;
3803
+ $success = 1;
3804
+ }
3805
+ }
3806
+ }
3807
+ unless ($success) {
3808
+ $et->Warn("Bad $name directory");
3809
+ return 0;
3810
+ }
3811
+ $numEntries = Get16u($dataPt, $dirStart);
3812
+ $dirSize = 2 + 12 * $numEntries;
3813
+ $dirEnd = $dirStart + $dirSize;
3814
+ }
3815
+ $verbose > 0 and $et->VerboseDir($dirName, $numEntries);
3816
+ my $bytesFromEnd = $dataLen - $dirEnd;
3817
+ if ($bytesFromEnd < 4) {
3818
+ unless ($bytesFromEnd==2 or $bytesFromEnd==0) {
3819
+ $et->Warn("Illegal $name directory size ($numEntries entries)");
3820
+ return 0;
3821
+ }
3822
+ }
3823
+ # fix base offset for maker notes if necessary
3824
+ if (defined $$dirInfo{MakerNoteAddr}) {
3825
+ $makerAddr = $$dirInfo{MakerNoteAddr};
3826
+ delete $$dirInfo{MakerNoteAddr};
3827
+ if (Image::ExifTool::MakerNotes::FixBase($et, $dirInfo)) {
3828
+ $base = $$dirInfo{Base};
3829
+ $dataPos = $$dirInfo{DataPos};
3830
+ }
3831
+ }
3832
+ if ($htmlDump) {
3833
+ my $longName = $name eq 'MakerNotes' ? ($$dirInfo{Name} || $name) : $name;
3834
+ if (defined $makerAddr) {
3835
+ my $hdrLen = $dirStart + $dataPos + $base - $makerAddr;
3836
+ $et->HDump($makerAddr, $hdrLen, "MakerNotes header", $longName) if $hdrLen > 0;
3837
+ }
3838
+ unless ($$dirInfo{NoDumpEntryCount}) {
3839
+ $et->HDump($dirStart + $dataPos + $base, 2, "$longName entries",
3840
+ "Entry count: $numEntries");
3841
+ }
3842
+ my $tip;
3843
+ if ($bytesFromEnd >= 4) {
3844
+ my $nxt = ($name =~ /^(.*?)(\d+)$/) ? $1 . ($2 + 1) : 'Next IFD';
3845
+ $tip = sprintf("$nxt offset: 0x%.4x", Get32u($dataPt, $dirEnd));
3846
+ }
3847
+ $et->HDump($dirEnd + $dataPos + $base, 4, "Next IFD", $tip, 0);
3848
+ }
3849
+
3850
+ # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
3851
+ # (must do this before parsing directory or CameraSettings offset will be suspicious)
3852
+ if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') {
3853
+ my $entry = $dirStart + 2 + 12 * ($numEntries - 1);
3854
+ my $fmt = Get16u($dataPt, $entry + 2);
3855
+ if ($fmt < 1 or $fmt > 13) {
3856
+ $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
3857
+ "Bad format type: $fmt", 1);
3858
+ # adjust the number of directory entries
3859
+ --$numEntries;
3860
+ $dirEnd -= 12;
3861
+ }
3862
+ }
3863
+
3864
+ # loop through all entries in an EXIF directory (IFD)
3865
+ my ($index, $valEnd, $offList, $offHash);
3866
+ my $warnCount = 0;
3867
+ for ($index=0; $index<$numEntries; ++$index) {
3868
+ if ($warnCount > 10) {
3869
+ $et->Warn("Too many warnings -- $name parsing aborted", 2) and return 0;
3870
+ }
3871
+ my $entry = $dirStart + 2 + 12 * $index;
3872
+ my $tagID = Get16u($dataPt, $entry);
3873
+ my $format = Get16u($dataPt, $entry+2);
3874
+ my $count = Get32u($dataPt, $entry+4);
3875
+ if ($format < 1 or $format > 13) {
3876
+ $et->HDump($entry+$dataPos+$base,12,"[invalid IFD entry]",
3877
+ "Bad format type: $format", 1);
3878
+ # warn unless the IFD was just padded with zeros
3879
+ if ($format) {
3880
+ $et->Warn("Bad format ($format) for $name entry $index", $inMakerNotes);
3881
+ ++$warnCount;
3882
+ }
3883
+ return 0 unless $index; # assume corrupted IFD if this is our first entry
3884
+ next;
3885
+ }
3886
+ my $formatStr = $formatName[$format]; # get name of this format
3887
+ my $valueDataPt = $dataPt;
3888
+ my $valueDataPos = $dataPos;
3889
+ my $valueDataLen = $dataLen;
3890
+ my $valuePtr = $entry + 8; # pointer to value within $$dataPt
3891
+ my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID);
3892
+ my ($origFormStr, $bad, $rational);
3893
+ # hack to patch incorrect count in Kodak SubIFD3 tags
3894
+ if ($count < 2 and ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount}) {
3895
+ $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos,
3896
+ $numEntries, $tagTablePtr);
3897
+ my $i = $$offHash{Get32u($dataPt, $valuePtr)};
3898
+ if (defined $i and $i < $#$offList) {
3899
+ my $oldCount = $count;
3900
+ $count = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$format]);
3901
+ $origFormStr = $formatName[$format] . '[' . $oldCount . ']' if $oldCount != $count;
3902
+ }
3903
+ }
3904
+ my $size = $count * $formatSize[$format];
3905
+ my $readSize = $size;
3906
+ if ($size > 4) {
3907
+ if ($size > 0x7fffffff) {
3908
+ $et->Warn(sprintf("Invalid size (%u) for %s tag 0x%.4x", $size, $name, $tagID));
3909
+ ++$warnCount;
3910
+ next;
3911
+ }
3912
+ $valuePtr = Get32u($dataPt, $valuePtr);
3913
+ # fix valuePtr if necessary
3914
+ if ($$dirInfo{FixOffsets}) {
3915
+ my $wFlag;
3916
+ $valEnd or $valEnd = $dataPos + $dirEnd + 4;
3917
+ #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
3918
+ eval $$dirInfo{FixOffsets};
3919
+ }
3920
+ my $suspect;
3921
+ # offset shouldn't point into TIFF header
3922
+ $valuePtr < 8 and not $$dirInfo{ZeroOffsetOK} and $suspect = $warnCount;
3923
+ # convert offset to pointer in $$dataPt
3924
+ if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$tagID} eq 'HASH' and
3925
+ $$tagTablePtr{$tagID}{EntryBased}))
3926
+ {
3927
+ $valuePtr += $entry;
3928
+ } else {
3929
+ $valuePtr -= $dataPos;
3930
+ }
3931
+ # value shouldn't overlap our directory
3932
+ $suspect = $warnCount if $valuePtr < $dirEnd and $valuePtr+$size > $dirStart;
3933
+ # load value from file if necessary
3934
+ if ($valuePtr < 0 or $valuePtr+$size > $dataLen) {
3935
+ # get value by seeking in file if we are allowed
3936
+ my $buff;
3937
+ if ($raf) {
3938
+ # avoid loading large binary data unless necessary
3939
+ # (ie. ImageSourceData -- layers in Photoshop TIFF image)
3940
+ while ($size > BINARY_DATA_LIMIT) {
3941
+ if ($tagInfo) {
3942
+ # make large unknown blocks binary data
3943
+ $$tagInfo{Binary} = 1 if $$tagInfo{Unknown};
3944
+ last unless $$tagInfo{Binary}; # must read non-binary data
3945
+ last if $$tagInfo{SubDirectory}; # must read SubDirectory data
3946
+ my $lcTag = lc($$tagInfo{Name});
3947
+ if ($$et{OPTIONS}{Binary} and
3948
+ not $$et{EXCL_TAG_LOOKUP}{$lcTag})
3949
+ {
3950
+ # read binary data if specified unless tagsFromFile won't use it
3951
+ last unless $$et{TAGS_FROM_FILE} and $$tagInfo{Protected};
3952
+ }
3953
+ # must read if tag is specified by name
3954
+ last if $$et{REQ_TAG_LOOKUP}{$lcTag};
3955
+ } else {
3956
+ # must read value if needed for a condition
3957
+ last if defined $tagInfo;
3958
+ }
3959
+ # (note: changing the value without changing $size will cause
3960
+ # a warning in the verbose output, but we need to maintain the
3961
+ # proper size for the htmlDump, so we can't change this)
3962
+ $buff = "Binary data $size bytes";
3963
+ $readSize = length $buff;
3964
+ last;
3965
+ }
3966
+ # read from file if necessary
3967
+ unless (defined $buff or
3968
+ ($raf->Seek($base + $valuePtr + $dataPos,0) and
3969
+ $raf->Read($buff,$size) == $size))
3970
+ {
3971
+ $et->Warn("Error reading value for $name entry $index", $inMakerNotes);
3972
+ return 0 unless $inMakerNotes or $htmlDump;
3973
+ ++$warnCount;
3974
+ $buff = '' unless defined $buff;
3975
+ $readSize = length $buff;
3976
+ $bad = 1;
3977
+ }
3978
+ $valueDataLen = length $buff;
3979
+ $valueDataPt = \$buff;
3980
+ $valueDataPos = $valuePtr + $dataPos;
3981
+ $valuePtr = 0;
3982
+ } else {
3983
+ my ($tagStr, $tmpInfo, $leicaTrailer);
3984
+ if ($tagInfo) {
3985
+ $tagStr = $$tagInfo{Name};
3986
+ $leicaTrailer = $$tagInfo{LeicaTrailer};
3987
+ } elsif (defined $tagInfo) {
3988
+ $tmpInfo = $et->GetTagInfo($tagTablePtr, $tagID, \ '', $formatStr, $count);
3989
+ if ($tmpInfo) {
3990
+ $tagStr = $$tmpInfo{Name};
3991
+ $leicaTrailer = $$tmpInfo{LeicaTrailer};
3992
+ }
3993
+ }
3994
+ if ($tagInfo and $$tagInfo{ChangeBase}) {
3995
+ # adjust base offset for this tag only
3996
+ #### eval ChangeBase ($dirStart,$dataPos)
3997
+ my $newBase = eval $$tagInfo{ChangeBase};
3998
+ $valuePtr += $newBase;
3999
+ }
4000
+ $tagStr or $tagStr = sprintf("tag 0x%.4x",$tagID);
4001
+ # allow PreviewImage to run outside EXIF data
4002
+ if ($tagStr eq 'PreviewImage' and $$et{RAF}) {
4003
+ my $pos = $$et{RAF}->Tell();
4004
+ $buff = $et->ExtractBinary($base + $valuePtr + $dataPos, $size, 'PreviewImage');
4005
+ $$et{RAF}->Seek($pos, 0);
4006
+ $valueDataPt = \$buff;
4007
+ $valueDataPos = $valuePtr + $dataPos;
4008
+ $valueDataLen = $size;
4009
+ $valuePtr = 0;
4010
+ } elsif ($leicaTrailer and $$et{RAF}) {
4011
+ if ($verbose > 0) {
4012
+ $et->VPrint(0, "$$et{INDENT}$index) $tagStr --> (outside APP1 segment)\n");
4013
+ }
4014
+ if ($et->Options('FastScan')) {
4015
+ $et->Warn('Ignored Leica MakerNote trailer');
4016
+ } else {
4017
+ require Image::ExifTool::Fixup;
4018
+ $$et{LeicaTrailer} = {
4019
+ TagInfo => $tagInfo || $tmpInfo,
4020
+ Offset => $base + $valuePtr + $dataPos,
4021
+ Size => $size,
4022
+ Fixup => new Image::ExifTool::Fixup,
4023
+ };
4024
+ }
4025
+ } else {
4026
+ $et->Warn("Bad $name offset for $tagStr");
4027
+ ++$warnCount;
4028
+ }
4029
+ unless (defined $buff) {
4030
+ $valueDataPt = '';
4031
+ $valueDataPos = $valuePtr + $dataPos;
4032
+ $valueDataLen = 0;
4033
+ $valuePtr = 0;
4034
+ $bad = 1;
4035
+ }
4036
+ }
4037
+ }
4038
+ # warn about suspect offsets if they didn't already cause another warning
4039
+ if (defined $suspect and $suspect == $warnCount) {
4040
+ my $tagStr = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
4041
+ if ($et->Warn("Suspicious $name offset for $tagStr", $inMakerNotes)) {
4042
+ ++$warnCount;
4043
+ next unless $verbose;
4044
+ }
4045
+ }
4046
+ }
4047
+ # treat single unknown byte as int8u
4048
+ $formatStr = 'int8u' if $format == 7 and $count == 1;
4049
+
4050
+ my ($val, $subdir, $wrongFormat);
4051
+ if ($tagID > 0xf000 and $tagTablePtr eq \%Image::ExifTool::Exif::Main) {
4052
+ my $oldInfo = $$tagTablePtr{$tagID};
4053
+ if ((not $oldInfo or (ref $oldInfo eq 'HASH' and $$oldInfo{Condition} and
4054
+ not $$oldInfo{PSRaw})) and not $bad)
4055
+ {
4056
+ # handle special case of Photoshop RAW tags (0xfde8-0xfe58)
4057
+ # --> generate tags from the value if possible
4058
+ $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize);
4059
+ if (defined $val and $val =~ /(.*): (.*)/) {
4060
+ my $tag = $1;
4061
+ $val = $2;
4062
+ $tag =~ s/'s//; # remove 's (so "Owner's Name" becomes "OwnerName")
4063
+ $tag =~ tr/a-zA-Z0-9_//cd; # remove unknown characters
4064
+ if ($tag) {
4065
+ $tagInfo = {
4066
+ Name => $tag,
4067
+ Condition => '$$self{TIFF_TYPE} ne "DCR"',
4068
+ ValueConv => '$_=$val;s/^.*: //;$_', # remove descr
4069
+ PSRaw => 1, # (just as flag to avoid adding this again)
4070
+ };
4071
+ AddTagToTable($tagTablePtr, $tagID, $tagInfo);
4072
+ # generate conditional list if a conditional tag already existed
4073
+ $$tagTablePtr{$tagID} = [ $oldInfo, $tagInfo ] if $oldInfo;
4074
+ }
4075
+ }
4076
+ }
4077
+ }
4078
+ if (defined $tagInfo and not $tagInfo) {
4079
+ if ($bad) {
4080
+ undef $tagInfo;
4081
+ } else {
4082
+ # GetTagInfo() required the value for a Condition
4083
+ my $tmpVal = substr($$valueDataPt, $valuePtr, $readSize < 128 ? $readSize : 128);
4084
+ # (use original format name in this call -- $formatStr may have been changed to int8u)
4085
+ $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$tmpVal,
4086
+ $formatName[$format], $count);
4087
+ }
4088
+ }
4089
+ # make sure we are handling the 'ifd' format properly
4090
+ if (($format == 13 or $format == 18) and (not $tagInfo or not $$tagInfo{SubIFD})) {
4091
+ my $str = sprintf('%s tag 0x%.4x IFD format not handled', $dirName, $tagID);
4092
+ $et->Warn($str, $inMakerNotes);
4093
+ }
4094
+ if (defined $tagInfo) {
4095
+ my $readFormat = $$tagInfo{Format};
4096
+ $subdir = $$tagInfo{SubDirectory};
4097
+ # unless otherwise specified, all SubDirectory data except
4098
+ # EXIF SubIFD offsets should be unformatted
4099
+ $readFormat = 'undef' if $subdir and not $$tagInfo{SubIFD} and not $readFormat;
4100
+ # override EXIF format if specified
4101
+ if ($readFormat) {
4102
+ $formatStr = $readFormat;
4103
+ my $newNum = $formatNumber{$formatStr};
4104
+ if ($newNum and $newNum != $format) {
4105
+ $origFormStr = $formatName[$format] . '[' . $count . ']';
4106
+ $format = $newNum;
4107
+ # adjust number of items for new format size
4108
+ $count = int($size / $formatSize[$format]);
4109
+ }
4110
+ }
4111
+ # verify that offset-type values are integral
4112
+ if (($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) and not $intFormat{$formatStr}) {
4113
+ $et->Warn("Wrong format ($formatStr) for $name $$tagInfo{Name}");
4114
+ next unless $verbose;
4115
+ $wrongFormat = 1;
4116
+ }
4117
+ } else {
4118
+ next unless $verbose;
4119
+ }
4120
+ unless ($bad) {
4121
+ # limit maximum length of data to reformat
4122
+ # (avoids long delays when processing some corrupted files)
4123
+ if ($count > 100000 and $formatStr !~ /^(undef|string|binary)$/) {
4124
+ my $tagName = $tagInfo ? $$tagInfo{Name} : sprintf('tag 0x%.4x', $tagID);
4125
+ my $minor = $count > 2000000 ? 0 : 2;
4126
+ next if $et->Warn("Ignoring $dirName $tagName with excessive count", $minor);
4127
+ }
4128
+ # convert according to specified format
4129
+ $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
4130
+ # re-code if necessary
4131
+ if ($strEnc and $formatStr eq 'string' and defined $val) {
4132
+ $val = $et->Decode($val, $strEnc);
4133
+ }
4134
+ }
4135
+
4136
+ if ($verbose) {
4137
+ my $tval = $val;
4138
+ # also show as a rational
4139
+ $tval .= " ($rational)" if defined $rational;
4140
+ if ($htmlDump) {
4141
+ my ($tagName, $colName);
4142
+ if ($tagID == 0x927c and $dirName eq 'ExifIFD') {
4143
+ $tagName = 'MakerNotes';
4144
+ } elsif ($tagInfo) {
4145
+ $tagName = $$tagInfo{Name};
4146
+ } else {
4147
+ $tagName = sprintf("Tag 0x%.4x",$tagID);
4148
+ }
4149
+ my $dname = sprintf("${name}-%.2d", $index);
4150
+ # build our tool tip
4151
+ $size < 0 and $size = $count * $formatSize[$format];
4152
+ my $fstr = "$formatName[$format]\[$count]";
4153
+ $fstr = "$origFormStr read as $fstr" if $origFormStr and $origFormStr ne $fstr;
4154
+ $fstr .= ' <-- WRONG' if $wrongFormat;
4155
+ my $tip = sprintf("Tag ID: 0x%.4x\n", $tagID) .
4156
+ "Format: $fstr\nSize: $size bytes\n";
4157
+ if ($size > 4) {
4158
+ my $offPt = Get32u($dataPt,$entry+8);
4159
+ my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0);
4160
+ $tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
4161
+ # highlight tag name (red for bad size)
4162
+ my $style = ($bad or not defined $tval) ? 'V' : 'H';
4163
+ if ($actPt != $offPt) {
4164
+ $tip .= sprintf("Actual offset: 0x%.4x\n", $actPt);
4165
+ my $sign = $actPt < $offPt ? '-' : '';
4166
+ $tip .= sprintf("Offset base: ${sign}0x%.4x\n", abs($actPt - $offPt));
4167
+ $style = 'F' if $style eq 'H'; # purple for different offsets
4168
+ }
4169
+ $colName = "<span class=$style>$tagName</span>";
4170
+ $colName .= ' <span class=V>(odd)</span>' if $offPt & 0x01;
4171
+ } else {
4172
+ $colName = $tagName;
4173
+ }
4174
+ $colName .= ' <span class=V>(err)</span>' if $wrongFormat;
4175
+ if (not defined $tval) {
4176
+ $tval = '<bad size/offset>';
4177
+ } else {
4178
+ $tval = substr($tval,0,28) . '[...]' if length($tval) > 32;
4179
+ if ($formatStr =~ /^(string|undef|binary)/) {
4180
+ # translate non-printable characters
4181
+ $tval =~ tr/\x00-\x1f\x7f-\xff/./;
4182
+ } elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
4183
+ if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
4184
+ $tval = sprintf('0x%.4x', $tval);
4185
+ my $actPt = $val + $base - ($$et{EXIF_POS} || 0);
4186
+ if ($actPt != $val) {
4187
+ $tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
4188
+ my $sign = $actPt < $val ? '-' : '';
4189
+ $tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val));
4190
+ }
4191
+ } elsif ($$tagInfo{PrintHex}) {
4192
+ $tval = sprintf('0x%x', $tval);
4193
+ }
4194
+ }
4195
+ }
4196
+ $tip .= "Value: $tval";
4197
+ $et->HDump($entry+$dataPos+$base, 12, "$dname $colName", $tip, 1);
4198
+ next if $valueDataLen < 0; # don't process bad pointer entry
4199
+ if ($size > 4) {
4200
+ my $exifDumpPos = $valuePtr + $valueDataPos + $base;
4201
+ my $flag = 0;
4202
+ if ($subdir) {
4203
+ if ($$tagInfo{MakerNotes}) {
4204
+ $flag = 0x04;
4205
+ } elsif ($$tagInfo{NestedHtmlDump}) {
4206
+ $flag = $$tagInfo{NestedHtmlDump} == 2 ? 0x10 : 0x04;
4207
+ }
4208
+ }
4209
+ # add value data block (underlining maker notes data)
4210
+ $et->HDump($exifDumpPos,$size,"$tagName value",'SAME', $flag);
4211
+ }
4212
+ } else {
4213
+ my $fstr = $formatName[$format];
4214
+ $fstr = "$origFormStr read as $fstr" if $origFormStr;
4215
+ $et->VerboseInfo($tagID, $tagInfo,
4216
+ Table => $tagTablePtr,
4217
+ Index => $index,
4218
+ Value => $tval,
4219
+ DataPt => $valueDataPt,
4220
+ DataPos => $valueDataPos + $base,
4221
+ Size => $size,
4222
+ Start => $valuePtr,
4223
+ Format => $fstr,
4224
+ Count => $count,
4225
+ );
4226
+ }
4227
+ next if not $tagInfo or $wrongFormat;
4228
+ }
4229
+ next unless defined $val;
4230
+ #..............................................................................
4231
+ # Handle SubDirectory tag types
4232
+ #
4233
+ if ($subdir) {
4234
+ # don't process empty subdirectories
4235
+ unless ($size) {
4236
+ unless ($$tagInfo{MakerNotes} or $inMakerNotes) {
4237
+ $et->Warn("Empty $$tagInfo{Name} data", 1);
4238
+ }
4239
+ next;
4240
+ }
4241
+ my (@values, $newTagTable, $dirNum, $newByteOrder, $invalid);
4242
+ my $tagStr = $$tagInfo{Name};
4243
+ if ($$subdir{MaxSubdirs}) {
4244
+ @values = split ' ', $val;
4245
+ # limit the number of subdirectories we parse
4246
+ my $over = @values - $$subdir{MaxSubdirs};
4247
+ if ($over > 0) {
4248
+ $et->Warn("Ignoring $over $tagStr directories");
4249
+ splice @values, $$subdir{MaxSubdirs};
4250
+ }
4251
+ $val = shift @values;
4252
+ }
4253
+ if ($$subdir{TagTable}) {
4254
+ $newTagTable = GetTagTable($$subdir{TagTable});
4255
+ $newTagTable or warn("Unknown tag table $$subdir{TagTable}"), next;
4256
+ } else {
4257
+ $newTagTable = $tagTablePtr; # use existing table
4258
+ }
4259
+ # loop through all sub-directories specified by this tag
4260
+ for ($dirNum=0; ; ++$dirNum) {
4261
+ my $subdirBase = $base;
4262
+ my $subdirDataPt = $valueDataPt;
4263
+ my $subdirDataPos = $valueDataPos;
4264
+ my $subdirDataLen = $valueDataLen;
4265
+ my $subdirStart = $valuePtr;
4266
+ if (defined $$subdir{Start}) {
4267
+ # set local $valuePtr relative to file $base for eval
4268
+ my $valuePtr = $subdirStart + $subdirDataPos;
4269
+ #### eval Start ($valuePtr, $val)
4270
+ my $newStart = eval($$subdir{Start});
4271
+ unless (Image::ExifTool::IsInt($newStart)) {
4272
+ $et->Warn("Bad value for $tagStr");
4273
+ last;
4274
+ }
4275
+ # convert back to relative to $subdirDataPt
4276
+ $newStart -= $subdirDataPos;
4277
+ # adjust directory size if necessary
4278
+ unless ($$tagInfo{SubIFD} or $$subdir{BadOffset}) {
4279
+ $size -= $newStart - $subdirStart;
4280
+ }
4281
+ $subdirStart = $newStart;
4282
+ }
4283
+ # this is a pain, but some maker notes are always a specific
4284
+ # byte order, regardless of the byte order of the file
4285
+ my $oldByteOrder = GetByteOrder();
4286
+ $newByteOrder = $$subdir{ByteOrder};
4287
+ if ($newByteOrder) {
4288
+ if ($newByteOrder =~ /^Little/i) {
4289
+ $newByteOrder = 'II';
4290
+ } elsif ($newByteOrder =~ /^Big/i) {
4291
+ $newByteOrder = 'MM';
4292
+ } elsif ($$subdir{OffsetPt}) {
4293
+ undef $newByteOrder;
4294
+ warn "Can't have variable byte ordering for SubDirectories using OffsetPt";
4295
+ last;
4296
+ } elsif ($subdirStart + 2 <= $subdirDataLen) {
4297
+ # attempt to determine the byte ordering by checking
4298
+ # at the number of directory entries. This is an int16u
4299
+ # that should be a reasonable value.
4300
+ my $num = Get16u($subdirDataPt, $subdirStart);
4301
+ if ($num & 0xff00 and ($num>>8) > ($num&0xff)) {
4302
+ # This looks wrong, we shouldn't have this many entries
4303
+ my %otherOrder = ( II=>'MM', MM=>'II' );
4304
+ $newByteOrder = $otherOrder{$oldByteOrder};
4305
+ } else {
4306
+ $newByteOrder = $oldByteOrder;
4307
+ }
4308
+ }
4309
+ } else {
4310
+ $newByteOrder = $oldByteOrder;
4311
+ }
4312
+ # set base offset if necessary
4313
+ if ($$subdir{Base}) {
4314
+ # calculate subdirectory start relative to $base for eval
4315
+ my $start = $subdirStart + $subdirDataPos;
4316
+ #### eval Base ($start,$base)
4317
+ $subdirBase = eval($$subdir{Base}) + $base;
4318
+ }
4319
+ # add offset to the start of the directory if necessary
4320
+ if ($$subdir{OffsetPt}) {
4321
+ #### eval OffsetPt ($valuePtr)
4322
+ my $pos = eval $$subdir{OffsetPt};
4323
+ if ($pos + 4 > $subdirDataLen) {
4324
+ $et->Warn("Bad $tagStr OffsetPt");
4325
+ last;
4326
+ }
4327
+ SetByteOrder($newByteOrder);
4328
+ $subdirStart += Get32u($subdirDataPt, $pos);
4329
+ SetByteOrder($oldByteOrder);
4330
+ }
4331
+ if ($subdirStart < 0 or $subdirStart + 2 > $subdirDataLen) {
4332
+ # convert $subdirStart back to a file offset
4333
+ if ($raf) {
4334
+ # reset SubDirectory buffer (we will load it later)
4335
+ my $buff = '';
4336
+ $subdirDataPt = \$buff;
4337
+ $subdirDataLen = $size = length $buff;
4338
+ } else {
4339
+ my $msg = "Bad $tagStr SubDirectory start";
4340
+ if ($verbose > 0) {
4341
+ if ($subdirStart < 0) {
4342
+ $msg .= " (directory start $subdirStart is before EXIF start)";
4343
+ } else {
4344
+ my $end = $subdirStart + $size;
4345
+ $msg .= " (directory end is $end but EXIF size is only $subdirDataLen)";
4346
+ }
4347
+ }
4348
+ $et->Warn($msg);
4349
+ last;
4350
+ }
4351
+ }
4352
+
4353
+ # must update subdirDataPos if $base changes for this subdirectory
4354
+ $subdirDataPos += $base - $subdirBase;
4355
+
4356
+ # build information hash for new directory
4357
+ my %subdirInfo = (
4358
+ Name => $tagStr,
4359
+ Base => $subdirBase,
4360
+ DataPt => $subdirDataPt,
4361
+ DataPos => $subdirDataPos,
4362
+ DataLen => $subdirDataLen,
4363
+ DirStart => $subdirStart,
4364
+ DirLen => $size,
4365
+ RAF => $raf,
4366
+ Parent => $dirName,
4367
+ DirName => $$subdir{DirName},
4368
+ FixBase => $$subdir{FixBase},
4369
+ FixOffsets => $$subdir{FixOffsets},
4370
+ EntryBased => $$subdir{EntryBased},
4371
+ TagInfo => $tagInfo,
4372
+ SubIFD => $$tagInfo{SubIFD},
4373
+ Subdir => $subdir,
4374
+ );
4375
+ # (remember: some cameras incorrectly write maker notes in IFD0)
4376
+ if ($$tagInfo{MakerNotes}) {
4377
+ # don't parse makernotes if FastScan > 1
4378
+ my $fast = $et->Options('FastScan');
4379
+ last if $fast and $fast > 1;
4380
+ $subdirInfo{MakerNoteAddr} = $valuePtr + $valueDataPos + $base;
4381
+ $subdirInfo{NoFixBase} = 1 if defined $$subdir{Base};
4382
+ }
4383
+ # set directory IFD name from group name of family 1 if it exists,
4384
+ # unless the tag is writable as a block in which case group 1 may
4385
+ # have been set automatically
4386
+ if ($$tagInfo{Groups} and not $$tagInfo{Writable}) {
4387
+ $subdirInfo{DirName} = $$tagInfo{Groups}{1};
4388
+ # number multiple subdirectories
4389
+ $subdirInfo{DirName} =~ s/\d*$/$dirNum/ if $dirNum;
4390
+ }
4391
+ SetByteOrder($newByteOrder); # set byte order for this subdir
4392
+ # validate the subdirectory if necessary
4393
+ my $dirData = $subdirDataPt; # set data pointer to be used in eval
4394
+ #### eval Validate ($val, $dirData, $subdirStart, $size)
4395
+ my $ok = 0;
4396
+ if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
4397
+ $et->Warn("Invalid $tagStr data");
4398
+ $invalid = 1;
4399
+ } else {
4400
+ if (not $subdirInfo{DirName} and $inMakerNotes) {
4401
+ $subdirInfo{DirName} = $$tagInfo{Name};
4402
+ }
4403
+ # process the subdirectory
4404
+ $ok = $et->ProcessDirectory(\%subdirInfo, $newTagTable, $$subdir{ProcessProc});
4405
+ }
4406
+ # print debugging information if there were errors
4407
+ if (not $ok and $verbose > 1 and $subdirStart != $valuePtr) {
4408
+ my $out = $et->Options('TextOut');
4409
+ printf $out "%s (SubDirectory start = 0x%x)\n", $$et{INDENT}, $subdirStart;
4410
+ }
4411
+ SetByteOrder($oldByteOrder); # restore original byte swapping
4412
+
4413
+ @values or last;
4414
+ $val = shift @values; # continue with next subdir
4415
+ }
4416
+ my $doMaker = $et->Options('MakerNotes');
4417
+ next unless $doMaker or $$et{REQ_TAG_LOOKUP}{lc($tagStr)} or
4418
+ $$tagInfo{BlockExtract};
4419
+ # extract as a block if specified
4420
+ if ($$tagInfo{MakerNotes}) {
4421
+ # save maker note byte order (if it was significant and valid)
4422
+ if ($$subdir{ByteOrder} and not $invalid) {
4423
+ $$et{MAKER_NOTE_BYTE_ORDER} =
4424
+ defined ($$et{UnknownByteOrder}) ?
4425
+ $$et{UnknownByteOrder} : $newByteOrder;
4426
+ }
4427
+ if ($doMaker and $doMaker eq '2') {
4428
+ # extract maker notes without rebuilding (no fixup information)
4429
+ delete $$et{MAKER_NOTE_FIXUP};
4430
+ } elsif (not $$tagInfo{NotIFD}) {
4431
+ # this is a pain, but we must rebuild EXIF-typemaker notes to
4432
+ # include all the value data if data was outside the maker notes
4433
+ my %makerDirInfo = (
4434
+ Name => $tagStr,
4435
+ Base => $base,
4436
+ DataPt => $valueDataPt,
4437
+ DataPos => $valueDataPos,
4438
+ DataLen => $valueDataLen,
4439
+ DirStart => $valuePtr,
4440
+ DirLen => $size,
4441
+ RAF => $raf,
4442
+ Parent => $dirName,
4443
+ DirName => 'MakerNotes',
4444
+ FixOffsets => $$subdir{FixOffsets},
4445
+ TagInfo => $tagInfo,
4446
+ );
4447
+ $makerDirInfo{FixBase} = 1 if $$subdir{FixBase};
4448
+ # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP})
4449
+ my $val2 = RebuildMakerNotes($et, $newTagTable, \%makerDirInfo);
4450
+ if (defined $val2) {
4451
+ $val = $val2;
4452
+ } elsif ($size > 4) {
4453
+ $et->Warn('Error rebuilding maker notes (may be corrupt)');
4454
+ }
4455
+ }
4456
+ } else {
4457
+ # extract this directory as a block if specified
4458
+ next unless $$tagInfo{Writable};
4459
+ }
4460
+ }
4461
+ #..............................................................................
4462
+ # convert to absolute offsets if this tag is an offset
4463
+ #### eval IsOffset ($val, $et)
4464
+ if ($$tagInfo{IsOffset} and eval $$tagInfo{IsOffset}) {
4465
+ my $offsetBase = $$tagInfo{IsOffset} eq '2' ? $firstBase : $base;
4466
+ $offsetBase += $$et{BASE};
4467
+ # handle offsets which use a wrong base (Minolta A200)
4468
+ if ($$tagInfo{WrongBase}) {
4469
+ my $self = $et;
4470
+ #### eval WrongBase ($self)
4471
+ $offsetBase += eval $$tagInfo{WrongBase} || 0;
4472
+ }
4473
+ my @vals = split(' ',$val);
4474
+ foreach $val (@vals) {
4475
+ $val += $offsetBase;
4476
+ }
4477
+ $val = join(' ', @vals);
4478
+ }
4479
+ # save the value of this tag
4480
+ $tagKey = $et->FoundTag($tagInfo, $val);
4481
+ if (defined $tagKey) {
4482
+ # set the group 1 name for tags in specified tables
4483
+ $et->SetGroup($tagKey, $dirName) if $$tagTablePtr{SET_GROUP1};
4484
+ # save original components of rational numbers (used when copying)
4485
+ $$et{RATIONAL}{$tagKey} = $rational if defined $rational;
4486
+ }
4487
+ }
4488
+
4489
+ # scan for subsequent IFD's if specified
4490
+ if ($$dirInfo{Multi} and $bytesFromEnd >= 4) {
4491
+ my $offset = Get32u($dataPt, $dirEnd);
4492
+ if ($offset) {
4493
+ my $subdirStart = $offset - $dataPos;
4494
+ # use same directory information for trailing directory,
4495
+ # but change the start location (ProcessDirectory will
4496
+ # test to make sure we don't reprocess the same dir twice)
4497
+ my %newDirInfo = %$dirInfo;
4498
+ $newDirInfo{DirStart} = $subdirStart;
4499
+ # increment IFD number
4500
+ my $ifdNum = $newDirInfo{DirName} =~ s/(\d+)$// ? $1 : 0;
4501
+ $newDirInfo{DirName} .= $ifdNum + 1;
4502
+ # must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats
4503
+ if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) {
4504
+ $$et{INDENT} =~ s/..$//; # keep indent the same
4505
+ my $cur = pop @{$$et{PATH}};
4506
+ $et->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
4507
+ push @{$$et{PATH}}, $cur;
4508
+ } elsif ($verbose or $$et{TIFF_TYPE} eq 'TIFF') {
4509
+ $et->Warn('Ignored bad IFD linked from SubIFD');
4510
+ }
4511
+ }
4512
+ }
4513
+ return $success;
4514
+ }
4515
+
4516
+ 1; # end
4517
+
4518
+ __END__
4519
+
4520
+ =head1 NAME
4521
+
4522
+ Image::ExifTool::Exif - Read EXIF/TIFF meta information
4523
+
4524
+ =head1 SYNOPSIS
4525
+
4526
+ This module is required by Image::ExifTool.
4527
+
4528
+ =head1 DESCRIPTION
4529
+
4530
+ This module contains routines required by Image::ExifTool for processing
4531
+ EXIF and TIFF meta information.
4532
+
4533
+ =head1 AUTHOR
4534
+
4535
+ Copyright 2003-2014, Phil Harvey (phil at owl.phy.queensu.ca)
4536
+
4537
+ This library is free software; you can redistribute it and/or modify it
4538
+ under the same terms as Perl itself.
4539
+
4540
+ =head1 REFERENCES
4541
+
4542
+ =over 4
4543
+
4544
+ =item L<http://www.exif.org/Exif2-2.PDF>
4545
+
4546
+ =item L<http://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf>
4547
+
4548
+ =item L<http://partners.adobe.com/asn/developer/pdfs/tn/TIFF6.pdf>
4549
+
4550
+ =item L<http://partners.adobe.com/public/developer/en/tiff/TIFFPM6.pdf>
4551
+
4552
+ =item L<http://www.adobe.com/products/dng/pdfs/dng_spec.pdf>
4553
+
4554
+ =item L<http://www.awaresystems.be/imaging/tiff/tifftags.html>
4555
+
4556
+ =item L<http://www.remotesensing.org/libtiff/TIFFTechNote2.html>
4557
+
4558
+ =item L<http://www.exif.org/dcf.PDF>
4559
+
4560
+ =item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
4561
+
4562
+ =item L<http://www.fine-view.com/jp/lab/doc/ps6ffspecsv2.pdf>
4563
+
4564
+ =item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html>
4565
+
4566
+ =item L<http://hul.harvard.edu/jhove/tiff-tags.html>
4567
+
4568
+ =item L<http://www.microsoft.com/whdc/xps/wmphoto.mspx>
4569
+
4570
+ =item L<http://www.asmail.be/msg0054681802.html>
4571
+
4572
+ =item L<http://crousseau.free.fr/imgfmt_raw.htm>
4573
+
4574
+ =item L<http://www.cybercom.net/~dcoffin/dcraw/>
4575
+
4576
+ =item L<http://www.digitalpreservation.gov/formats/content/tiff_tags.shtml>
4577
+
4578
+ =item L<http://community.roxen.com/developers/idocs/rfc/rfc3949.html>
4579
+
4580
+ =item L<http://tools.ietf.org/html/draft-ietf-fax-tiff-fx-extension1-01>
4581
+
4582
+ =item L<http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/cinemadng/pdfs/CinemaDNG_Format_Specification_v1_1.pdf>
4583
+
4584
+ =back
4585
+
4586
+ =head1 ACKNOWLEDGEMENTS
4587
+
4588
+ Thanks to Jeremy Brown for the 35efl tags, and Matt Madrid for his help with
4589
+ the XP character code conversions.
4590
+
4591
+ =head1 SEE ALSO
4592
+
4593
+ L<Image::ExifTool::TagNames/EXIF Tags>,
4594
+ L<Image::ExifTool(3pm)|Image::ExifTool>
4595
+
4596
+ =cut