exiftool_vendored 10.04.0 → 10.23.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 (1225) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Image-ExifTool-10.23/Changes +7480 -0
  3. data/bin/Image-ExifTool-10.23/MANIFEST +977 -0
  4. data/bin/Image-ExifTool-10.23/META.yml +28 -0
  5. data/bin/Image-ExifTool-10.23/Makefile.PL +46 -0
  6. data/bin/Image-ExifTool-10.23/README +236 -0
  7. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2iptc.args +0 -0
  8. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2xmp.args +0 -0
  9. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/gps2xmp.args +0 -0
  10. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2exif.args +0 -0
  11. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2xmp.args +0 -0
  12. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptcCore.args +0 -0
  13. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/pdf2xmp.args +0 -0
  14. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2exif.args +0 -0
  15. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2gps.args +0 -0
  16. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2iptc.args +0 -0
  17. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2pdf.args +0 -0
  18. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/convert_regions.config +0 -0
  19. data/bin/Image-ExifTool-10.23/config_files/example.config +343 -0
  20. data/bin/Image-ExifTool-10.23/config_files/gps2utm.config +256 -0
  21. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/photoshop_paths.config +0 -0
  22. data/bin/Image-ExifTool-10.23/config_files/picasa_faces.config +382 -0
  23. data/bin/Image-ExifTool-10.23/exiftool +6311 -0
  24. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx.fmt +0 -0
  25. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx_wpt.fmt +0 -0
  26. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/kml.fmt +0 -0
  27. data/bin/Image-ExifTool-10.23/html/ExifTool.html +2093 -0
  28. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/MIE1.1-20070121.pdf +0 -0
  29. data/bin/Image-ExifTool-10.23/html/Shift.html +173 -0
  30. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AFCP.html +0 -0
  31. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AIFF.html +0 -0
  32. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APE.html +0 -0
  33. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APP12.html +0 -0
  34. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ASF.html +0 -0
  35. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Apple.html +0 -0
  36. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Audible.html +0 -0
  37. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/BMP.html +0 -0
  38. data/bin/Image-ExifTool-10.23/html/TagNames/BPG.html +118 -0
  39. data/bin/Image-ExifTool-10.23/html/TagNames/Canon.html +9534 -0
  40. data/bin/Image-ExifTool-10.23/html/TagNames/CanonCustom.html +2141 -0
  41. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/CanonRaw.html +0 -0
  42. data/bin/Image-ExifTool-10.23/html/TagNames/CanonVRD.html +2020 -0
  43. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Casio.html +0 -0
  44. data/bin/Image-ExifTool-10.23/html/TagNames/Composite.html +736 -0
  45. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DICOM.html +0 -0
  46. data/bin/Image-ExifTool-10.23/html/TagNames/DNG.html +293 -0
  47. data/bin/Image-ExifTool-10.23/html/TagNames/DPX.html +229 -0
  48. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DV.html +0 -0
  49. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DarwinCore.html +0 -0
  50. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DjVu.html +0 -0
  51. data/bin/Image-ExifTool-10.23/html/TagNames/EXE.html +741 -0
  52. data/bin/Image-ExifTool-10.23/html/TagNames/EXIF.html +3394 -0
  53. data/bin/Image-ExifTool-10.23/html/TagNames/Extra.html +469 -0
  54. data/bin/Image-ExifTool-10.23/html/TagNames/FLAC.html +183 -0
  55. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FLIR.html +0 -0
  56. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Flash.html +0 -0
  57. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FlashPix.html +0 -0
  58. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Font.html +0 -0
  59. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FotoStation.html +0 -0
  60. data/bin/Image-ExifTool-10.23/html/TagNames/FujiFilm.html +824 -0
  61. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GE.html +0 -0
  62. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIF.html +0 -0
  63. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIMP.html +0 -0
  64. data/bin/Image-ExifTool-10.23/html/TagNames/GPS.html +230 -0
  65. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GeoTiff.html +0 -0
  66. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/H264.html +0 -0
  67. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HP.html +0 -0
  68. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HTML.html +0 -0
  69. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ICC_Profile.html +0 -0
  70. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ID3.html +0 -0
  71. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/IPTC.html +0 -0
  72. data/bin/Image-ExifTool-10.23/html/TagNames/ISO.html +159 -0
  73. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ITC.html +0 -0
  74. data/bin/Image-ExifTool-10.23/html/TagNames/JFIF.html +62 -0
  75. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JPEG.html +0 -0
  76. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JVC.html +0 -0
  77. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Jpeg2000.html +0 -0
  78. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Kodak.html +0 -0
  79. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/KyoceraRaw.html +0 -0
  80. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/LNK.html +0 -0
  81. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Leaf.html +0 -0
  82. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Lytro.html +0 -0
  83. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/M2TS.html +0 -0
  84. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIE.html +0 -0
  85. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIFF.html +0 -0
  86. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MNG.html +0 -0
  87. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MOI.html +0 -0
  88. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPC.html +0 -0
  89. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPEG.html +0 -0
  90. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPF.html +0 -0
  91. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MWG.html +0 -0
  92. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MXF.html +0 -0
  93. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Matroska.html +0 -0
  94. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Microsoft.html +0 -0
  95. data/bin/Image-ExifTool-10.23/html/TagNames/Minolta.html +2625 -0
  96. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MinoltaRaw.html +0 -0
  97. data/bin/Image-ExifTool-10.23/html/TagNames/Motorola.html +32 -0
  98. data/bin/Image-ExifTool-10.23/html/TagNames/Nikon.html +5907 -0
  99. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/NikonCapture.html +0 -0
  100. data/bin/Image-ExifTool-10.23/html/TagNames/NikonCustom.html +6590 -0
  101. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Nintendo.html +0 -0
  102. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OOXML.html +0 -0
  103. data/bin/Image-ExifTool-10.23/html/TagNames/Ogg.html +49 -0
  104. data/bin/Image-ExifTool-10.23/html/TagNames/Olympus.html +3649 -0
  105. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OpenEXR.html +0 -0
  106. data/bin/Image-ExifTool-10.23/html/TagNames/Opus.html +62 -0
  107. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PDF.html +0 -0
  108. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PGF.html +0 -0
  109. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PICT.html +0 -0
  110. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PLIST.html +0 -0
  111. data/bin/Image-ExifTool-10.23/html/TagNames/PLUS.html +2613 -0
  112. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PNG.html +0 -0
  113. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PSP.html +0 -0
  114. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Palm.html +0 -0
  115. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Panasonic.html +0 -0
  116. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PanasonicRaw.html +0 -0
  117. data/bin/Image-ExifTool-10.23/html/TagNames/Pentax.html +4770 -0
  118. data/bin/Image-ExifTool-10.23/html/TagNames/PhaseOne.html +253 -0
  119. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoCD.html +0 -0
  120. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoMechanic.html +0 -0
  121. data/bin/Image-ExifTool-10.23/html/TagNames/Photoshop.html +739 -0
  122. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PostScript.html +0 -0
  123. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PrintIM.html +0 -0
  124. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Qualcomm.html +0 -0
  125. data/bin/Image-ExifTool-10.23/html/TagNames/QuickTime.html +6060 -0
  126. data/bin/Image-ExifTool-10.23/html/TagNames/RIFF.html +1382 -0
  127. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RSRC.html +0 -0
  128. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RTF.html +0 -0
  129. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Radiance.html +0 -0
  130. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Rawzor.html +0 -0
  131. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Real.html +0 -0
  132. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Reconyx.html +0 -0
  133. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Ricoh.html +0 -0
  134. data/bin/Image-ExifTool-10.23/html/TagNames/Samsung.html +616 -0
  135. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Sanyo.html +0 -0
  136. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Scalado.html +0 -0
  137. data/bin/Image-ExifTool-10.23/html/TagNames/Shortcuts.html +279 -0
  138. data/bin/Image-ExifTool-10.23/html/TagNames/Sigma.html +528 -0
  139. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SigmaRaw.html +0 -0
  140. data/bin/Image-ExifTool-10.23/html/TagNames/Sony.html +10264 -0
  141. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SonyIDC.html +0 -0
  142. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Stim.html +0 -0
  143. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Theora.html +0 -0
  144. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Torrent.html +0 -0
  145. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Unknown.html +0 -0
  146. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/VCard.html +0 -0
  147. data/bin/Image-ExifTool-10.23/html/TagNames/Vorbis.html +243 -0
  148. data/bin/Image-ExifTool-10.23/html/TagNames/XMP.html +8945 -0
  149. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ZIP.html +0 -0
  150. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/iWork.html +0 -0
  151. data/bin/Image-ExifTool-10.23/html/TagNames/index.html +217 -0
  152. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/style.css +0 -0
  153. data/bin/Image-ExifTool-10.23/html/ancient_history.html +8209 -0
  154. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/canon_raw.html +0 -0
  155. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/commentary.html +0 -0
  156. data/bin/Image-ExifTool-10.23/html/config.html +355 -0
  157. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/data_members.html +0 -0
  158. data/bin/Image-ExifTool-10.23/html/exiftool_pod.html +2535 -0
  159. data/bin/Image-ExifTool-10.23/html/faq.html +1566 -0
  160. data/bin/Image-ExifTool-10.23/html/filename.html +352 -0
  161. data/bin/Image-ExifTool-10.23/html/geotag.html +659 -0
  162. data/bin/Image-ExifTool-10.23/html/history.html +243 -0
  163. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/htmldump.html +0 -0
  164. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/idiosyncracies.html +0 -0
  165. data/bin/Image-ExifTool-10.23/html/index.html +1341 -0
  166. data/bin/Image-ExifTool-10.23/html/install.html +261 -0
  167. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/metafiles.html +0 -0
  168. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/overview.png +0 -0
  169. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/standards.html +0 -0
  170. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/struct.html +0 -0
  171. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/style.css +0 -0
  172. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/under.html +0 -0
  173. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/verbose.html +0 -0
  174. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/writing.html +0 -0
  175. data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pm +378 -0
  176. data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pod +231 -0
  177. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pm +7747 -0
  178. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pod +2542 -0
  179. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AES.pm +501 -0
  180. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AFCP.pm +286 -0
  181. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AIFF.pm +289 -0
  182. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APE.pm +282 -0
  183. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APP12.pm +322 -0
  184. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ASF.pm +885 -0
  185. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Apple.pm +129 -0
  186. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Audible.pm +317 -0
  187. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BMP.pm +179 -0
  188. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BPG.pm +251 -0
  189. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BZZ.pm +472 -0
  190. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BigTIFF.pm +282 -0
  191. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BuildTagLookup.pm +2527 -0
  192. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Canon.pm +8734 -0
  193. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonCustom.pm +2667 -0
  194. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonRaw.pm +910 -0
  195. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonVRD.pm +2273 -0
  196. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CaptureOne.pm +235 -0
  197. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Casio.pm +2058 -0
  198. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Charset.pm +423 -0
  199. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
  200. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
  201. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
  202. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
  203. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
  204. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
  205. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
  206. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
  207. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
  208. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
  209. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
  210. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
  211. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
  212. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
  213. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
  214. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
  215. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
  216. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
  217. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
  218. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
  219. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
  220. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
  221. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
  222. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
  223. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
  224. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
  225. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
  226. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
  227. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
  228. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
  229. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DICOM.pm +3874 -0
  230. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DNG.pm +835 -0
  231. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DPX.pm +182 -0
  232. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DV.pm +319 -0
  233. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DarwinCore.pm +322 -0
  234. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DjVu.pm +376 -0
  235. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/EXE.pm +1401 -0
  236. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Exif.pm +5863 -0
  237. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLAC.pm +297 -0
  238. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLIR.pm +1533 -0
  239. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Fixup.pm +366 -0
  240. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Flash.pm +755 -0
  241. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FlashPix.pm +1935 -0
  242. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Font.pm +647 -0
  243. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FotoStation.pm +261 -0
  244. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FujiFilm.pm +1232 -0
  245. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GE.pm +81 -0
  246. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIF.pm +542 -0
  247. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIMP.pm +258 -0
  248. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GPS.pm +558 -0
  249. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GeoTiff.pm +2263 -0
  250. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Geotag.pm +1241 -0
  251. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/H264.pm +1110 -0
  252. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HP.pm +263 -0
  253. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HTML.pm +576 -0
  254. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HtmlDump.pm +897 -0
  255. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ICC_Profile.pm +1000 -0
  256. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ID3.pm +1570 -0
  257. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/IPTC.pm +1264 -0
  258. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ISO.pm +206 -0
  259. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ITC.pm +215 -0
  260. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Import.pm +329 -0
  261. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/InDesign.pm +277 -0
  262. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEG.pm +605 -0
  263. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEGDigest.pm +2616 -0
  264. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JVC.pm +130 -0
  265. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Jpeg2000.pm +882 -0
  266. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Kodak.pm +2096 -0
  267. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  268. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/LNK.pm +723 -0
  269. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/cs.pm +1588 -0
  270. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/de.pm +8692 -0
  271. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_ca.pm +934 -0
  272. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_gb.pm +977 -0
  273. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/es.pm +4019 -0
  274. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fi.pm +2854 -0
  275. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fr.pm +4758 -0
  276. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/it.pm +7918 -0
  277. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ja.pm +5835 -0
  278. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ko.pm +2330 -0
  279. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/nl.pm +3222 -0
  280. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/pl.pm +1276 -0
  281. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ru.pm +768 -0
  282. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/sv.pm +638 -0
  283. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/tr.pm +544 -0
  284. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_cn.pm +1330 -0
  285. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_tw.pm +801 -0
  286. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Leaf.pm +516 -0
  287. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lytro.pm +217 -0
  288. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/M2TS.pm +729 -0
  289. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIE.pm +2564 -0
  290. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIEUnits.pod +377 -0
  291. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIFF.pm +279 -0
  292. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MNG.pm +684 -0
  293. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MOI.pm +158 -0
  294. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPC.pm +156 -0
  295. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPEG.pm +736 -0
  296. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPF.pm +292 -0
  297. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MWG.pm +753 -0
  298. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MXF.pm +3031 -0
  299. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MakerNotes.pm +1736 -0
  300. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Matroska.pm +892 -0
  301. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Microsoft.pm +904 -0
  302. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Minolta.pm +2981 -0
  303. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  304. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Motorola.pm +62 -0
  305. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nikon.pm +7970 -0
  306. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCapture.pm +940 -0
  307. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCustom.pm +7361 -0
  308. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nintendo.pm +128 -0
  309. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OOXML.pm +409 -0
  310. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ogg.pm +240 -0
  311. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Olympus.pm +3985 -0
  312. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OpenEXR.pm +323 -0
  313. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Opus.pm +98 -0
  314. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PDF.pm +2367 -0
  315. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PGF.pm +143 -0
  316. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PICT.pm +1260 -0
  317. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLIST.pm +448 -0
  318. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLUS.pm +2607 -0
  319. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PNG.pm +1227 -0
  320. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PPM.pm +169 -0
  321. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PSP.pm +306 -0
  322. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Palm.pm +403 -0
  323. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Panasonic.pm +2374 -0
  324. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PanasonicRaw.pm +643 -0
  325. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Pentax.pm +6063 -0
  326. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhaseOne.pm +707 -0
  327. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoCD.pm +507 -0
  328. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  329. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Photoshop.pm +939 -0
  330. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PostScript.pm +699 -0
  331. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PrintIM.pm +125 -0
  332. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  333. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/QuickTime.pm +6601 -0
  334. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/README +994 -0
  335. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RIFF.pm +1587 -0
  336. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RSRC.pm +241 -0
  337. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RTF.pm +383 -0
  338. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Radiance.pm +144 -0
  339. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Rawzor.pm +189 -0
  340. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Real.pm +739 -0
  341. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Reconyx.pm +190 -0
  342. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ricoh.pm +1148 -0
  343. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Samsung.pm +1177 -0
  344. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sanyo.pm +440 -0
  345. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Scalado.pm +141 -0
  346. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shift.pl +596 -0
  347. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shortcuts.pm +337 -0
  348. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sigma.pm +754 -0
  349. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SigmaRaw.pm +670 -0
  350. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sony.pm +9623 -0
  351. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SonyIDC.pm +332 -0
  352. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Stim.pm +196 -0
  353. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagInfoXML.pm +827 -0
  354. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagLookup.pm +9250 -0
  355. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagNames.pod +29842 -0
  356. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Theora.pm +145 -0
  357. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Torrent.pm +317 -0
  358. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Unknown.pm +66 -0
  359. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/VCard.pm +405 -0
  360. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Vorbis.pm +255 -0
  361. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  362. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteExif.pl +2466 -0
  363. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteIPTC.pl +706 -0
  364. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePDF.pl +771 -0
  365. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePNG.pl +390 -0
  366. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  367. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePostScript.pl +772 -0
  368. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteQuickTime.pl +358 -0
  369. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteXMP.pl +1380 -0
  370. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Writer.pl +6220 -0
  371. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP.pm +4071 -0
  372. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP2.pl +1284 -0
  373. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMPStruct.pl +843 -0
  374. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ZIP.pm +667 -0
  375. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/iWork.pm +223 -0
  376. data/bin/Image-ExifTool-10.23/perl-Image-ExifTool.spec +113 -0
  377. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP.t +0 -0
  378. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_2.out +0 -0
  379. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_3.out +0 -0
  380. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF.t +0 -0
  381. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF_2.out +0 -0
  382. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE.t +0 -0
  383. data/bin/Image-ExifTool-10.23/t/APE_2.out +30 -0
  384. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE_3.out +0 -0
  385. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF.t +0 -0
  386. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF_2.out +0 -0
  387. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible.t +0 -0
  388. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible_2.out +0 -0
  389. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP.t +0 -0
  390. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP_2.out +0 -0
  391. data/bin/Image-ExifTool-10.23/t/BPG.t +28 -0
  392. data/bin/Image-ExifTool-10.23/t/BPG_2.out +92 -0
  393. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF.t +0 -0
  394. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF_2.out +0 -0
  395. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon.t +0 -0
  396. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw.t +0 -0
  397. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_2.out +0 -0
  398. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_4.out +0 -0
  399. data/bin/Image-ExifTool-10.23/t/CanonRaw_5.out +209 -0
  400. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_6.out +0 -0
  401. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_7.out +0 -0
  402. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD.t +0 -0
  403. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_11.out +0 -0
  404. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_12.out +0 -0
  405. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_13.out +0 -0
  406. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_14.out +0 -0
  407. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_15.out +0 -0
  408. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_16.out +0 -0
  409. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_17.out +0 -0
  410. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_18.out +0 -0
  411. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_19.out +0 -0
  412. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_2.out +0 -0
  413. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_20.out +0 -0
  414. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_21.out +0 -0
  415. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_3.out +0 -0
  416. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_4.out +0 -0
  417. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_5.out +0 -0
  418. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_6.out +0 -0
  419. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_7.out +0 -0
  420. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_8.out +0 -0
  421. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_9.out +0 -0
  422. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_2.out +0 -0
  423. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_3.out +0 -0
  424. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio.t +0 -0
  425. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_2.out +0 -0
  426. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_3.out +0 -0
  427. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_4.out +0 -0
  428. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_5.out +0 -0
  429. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_6.out +0 -0
  430. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM.t +0 -0
  431. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM_2.out +0 -0
  432. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG.t +0 -0
  433. data/bin/Image-ExifTool-10.23/t/DNG_2.out +329 -0
  434. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG_3.out +0 -0
  435. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX.t +0 -0
  436. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX_2.out +0 -0
  437. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV.t +0 -0
  438. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV_2.out +0 -0
  439. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu.t +0 -0
  440. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu_2.out +0 -0
  441. data/bin/Image-ExifTool-10.23/t/EXE.t +31 -0
  442. data/bin/Image-ExifTool-10.23/t/EXE_2.out +34 -0
  443. data/bin/Image-ExifTool-10.23/t/EXE_3.out +10 -0
  444. data/bin/Image-ExifTool-10.23/t/EXE_4.out +8 -0
  445. data/bin/Image-ExifTool-10.23/t/EXE_5.out +9 -0
  446. data/bin/Image-ExifTool-10.23/t/EXE_6.out +8 -0
  447. data/bin/Image-ExifTool-10.23/t/EXE_7.out +10 -0
  448. data/bin/Image-ExifTool-10.23/t/ExifTool.t +328 -0
  449. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_16.out +0 -0
  450. data/bin/Image-ExifTool-10.23/t/ExifTool_17.out +598 -0
  451. data/bin/Image-ExifTool-10.23/t/ExifTool_2.out +427 -0
  452. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_20.out +0 -0
  453. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_21.out +0 -0
  454. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_22.out +0 -0
  455. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_23.out +0 -0
  456. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_24.out +0 -0
  457. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_25.out +0 -0
  458. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_26.out +0 -0
  459. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_27.out +0 -0
  460. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_28.out +0 -0
  461. data/bin/Image-ExifTool-10.23/t/ExifTool_29.out +426 -0
  462. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_3.out +0 -0
  463. data/bin/Image-ExifTool-10.23/t/ExifTool_30.out +2 -0
  464. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_4.out +0 -0
  465. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_5.out +0 -0
  466. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_6.out +0 -0
  467. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_7.out +0 -0
  468. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_8.out +0 -0
  469. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_9.out +0 -0
  470. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC.t +0 -0
  471. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC_2.out +0 -0
  472. data/bin/Image-ExifTool-10.23/t/FLAC_3.out +20 -0
  473. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR.t +0 -0
  474. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_2.out +0 -0
  475. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_3.out +0 -0
  476. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash.t +0 -0
  477. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix.t +0 -0
  478. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix_2.out +0 -0
  479. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_2.out +0 -0
  480. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_3.out +0 -0
  481. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font.t +0 -0
  482. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_2.out +0 -0
  483. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_3.out +0 -0
  484. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_4.out +0 -0
  485. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_5.out +0 -0
  486. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_6.out +0 -0
  487. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_7.out +0 -0
  488. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation.t +0 -0
  489. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_2.out +0 -0
  490. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_3.out +0 -0
  491. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm.t +0 -0
  492. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_2.out +0 -0
  493. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_3.out +0 -0
  494. data/bin/Image-ExifTool-10.23/t/FujiFilm_4.out +143 -0
  495. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_5.out +0 -0
  496. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE.t +0 -0
  497. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_2.out +0 -0
  498. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_3.out +0 -0
  499. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF.t +0 -0
  500. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_2.out +0 -0
  501. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_3.out +0 -0
  502. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_4.out +0 -0
  503. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP.t +0 -0
  504. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP_2.out +0 -0
  505. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS.t +0 -0
  506. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_2.out +0 -0
  507. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_3.out +0 -0
  508. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff.t +0 -0
  509. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_2.out +0 -0
  510. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_3.out +0 -0
  511. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_4.out +0 -0
  512. data/bin/Image-ExifTool-10.23/t/Geotag.t +201 -0
  513. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_10.out +0 -0
  514. data/bin/Image-ExifTool-10.23/t/Geotag_11.out +3 -0
  515. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_2.out +0 -0
  516. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_3.out +0 -0
  517. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_5.out +0 -0
  518. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_6.out +0 -0
  519. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_7.out +0 -0
  520. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_8.out +0 -0
  521. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_9.out +0 -0
  522. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML.t +0 -0
  523. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML_2.out +0 -0
  524. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC.t +0 -0
  525. data/bin/Image-ExifTool-10.23/t/IPTC_2.out +69 -0
  526. data/bin/Image-ExifTool-10.23/t/IPTC_4.out +67 -0
  527. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_5.out +0 -0
  528. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_6.out +0 -0
  529. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_7.out +0 -0
  530. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_8.out +0 -0
  531. data/bin/Image-ExifTool-10.23/t/ISO.t +28 -0
  532. data/bin/Image-ExifTool-10.23/t/ISO_2.out +19 -0
  533. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC.t +0 -0
  534. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC_2.out +0 -0
  535. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign.t +0 -0
  536. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_2.out +0 -0
  537. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_3.out +0 -0
  538. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_4.out +0 -0
  539. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC.t +0 -0
  540. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_2.out +0 -0
  541. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_3.out +0 -0
  542. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000.t +0 -0
  543. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_2.out +0 -0
  544. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_3.out +0 -0
  545. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_4.out +0 -0
  546. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak.t +0 -0
  547. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_2.out +0 -0
  548. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_3.out +0 -0
  549. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw.t +0 -0
  550. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw_2.out +0 -0
  551. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK.t +0 -0
  552. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK_2.out +0 -0
  553. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang.t +0 -0
  554. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_1.out +0 -0
  555. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_10.out +0 -0
  556. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_11.out +0 -0
  557. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_12.out +0 -0
  558. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_13.out +0 -0
  559. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_14.out +0 -0
  560. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_15.out +0 -0
  561. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_16.out +0 -0
  562. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_17.out +0 -0
  563. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_18.out +0 -0
  564. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_2.out +0 -0
  565. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_3.out +0 -0
  566. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_4.out +0 -0
  567. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_5.out +0 -0
  568. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_6.out +0 -0
  569. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_7.out +0 -0
  570. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_8.out +0 -0
  571. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_9.out +0 -0
  572. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro.t +0 -0
  573. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro_2.out +0 -0
  574. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS.t +0 -0
  575. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS_2.out +0 -0
  576. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE.t +0 -0
  577. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_2.out +0 -0
  578. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_3.out +0 -0
  579. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_5.out +0 -0
  580. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_6.out +0 -0
  581. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIFF.t +0 -0
  582. data/bin/Image-ExifTool-10.23/t/MIFF_2.out +114 -0
  583. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI.t +0 -0
  584. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI_2.out +0 -0
  585. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3.t +0 -0
  586. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3_2.out +0 -0
  587. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG.t +0 -0
  588. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_2.out +0 -0
  589. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_3.out +0 -0
  590. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_4.out +0 -0
  591. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_5.out +0 -0
  592. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_6.out +0 -0
  593. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF.t +0 -0
  594. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF_2.out +0 -0
  595. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska.t +0 -0
  596. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska_2.out +0 -0
  597. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta.t +0 -0
  598. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_2.out +0 -0
  599. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_3.out +0 -0
  600. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_4.out +0 -0
  601. data/bin/Image-ExifTool-10.23/t/Motorola.t +29 -0
  602. data/bin/Image-ExifTool-10.23/t/Motorola_2.out +97 -0
  603. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon.t +0 -0
  604. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_2.out +0 -0
  605. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_3.out +0 -0
  606. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_4.out +0 -0
  607. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_5.out +0 -0
  608. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_7.out +0 -0
  609. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_8.out +0 -0
  610. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus.t +0 -0
  611. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_2.out +0 -0
  612. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_3.out +0 -0
  613. data/bin/Image-ExifTool-10.23/t/Olympus_4.out +194 -0
  614. data/bin/Image-ExifTool-10.23/t/Olympus_5.out +266 -0
  615. data/bin/Image-ExifTool-10.23/t/Olympus_6.out +153 -0
  616. data/bin/Image-ExifTool-10.23/t/Olympus_7.out +483 -0
  617. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_8.out +0 -0
  618. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR.t +0 -0
  619. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR_2.out +0 -0
  620. data/bin/Image-ExifTool-10.23/t/Opus.t +27 -0
  621. data/bin/Image-ExifTool-10.23/t/Opus_2.out +26 -0
  622. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF.t +0 -0
  623. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_10.out +0 -0
  624. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_11.out +0 -0
  625. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_12.out +0 -0
  626. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_14.out +0 -0
  627. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_15.out +0 -0
  628. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_16.out +0 -0
  629. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_17.out +0 -0
  630. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_18.out +0 -0
  631. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_19.out +0 -0
  632. data/bin/Image-ExifTool-10.23/t/PDF_2.out +127 -0
  633. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_20.out +0 -0
  634. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_22.out +0 -0
  635. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_4.out +0 -0
  636. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_5.out +0 -0
  637. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_6.out +0 -0
  638. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_7.out +0 -0
  639. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_8.out +0 -0
  640. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_9.out +0 -0
  641. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF.t +0 -0
  642. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF_2.out +0 -0
  643. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT.t +0 -0
  644. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT_2.out +0 -0
  645. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST.t +0 -0
  646. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_2.out +0 -0
  647. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_3.out +0 -0
  648. data/bin/Image-ExifTool-10.23/t/PLUS.t +45 -0
  649. data/bin/Image-ExifTool-10.23/t/PLUS_2.out +31 -0
  650. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG.t +0 -0
  651. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_2.out +0 -0
  652. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_3.out +0 -0
  653. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_4.out +0 -0
  654. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_5.out +0 -0
  655. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM.t +0 -0
  656. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_2.out +0 -0
  657. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_3.out +0 -0
  658. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP.t +0 -0
  659. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP_2.out +0 -0
  660. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm.t +0 -0
  661. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm_2.out +0 -0
  662. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic.t +0 -0
  663. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_2.out +0 -0
  664. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_3.out +0 -0
  665. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_4.out +0 -0
  666. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_5.out +0 -0
  667. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax.t +0 -0
  668. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_2.out +0 -0
  669. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_3.out +0 -0
  670. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_4.out +0 -0
  671. data/bin/Image-ExifTool-10.23/t/PhaseOne.t +38 -0
  672. data/bin/Image-ExifTool-10.23/t/PhaseOne_2.out +99 -0
  673. data/bin/Image-ExifTool-10.23/t/PhaseOne_3.out +170 -0
  674. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD.t +0 -0
  675. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD_2.out +0 -0
  676. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic.t +0 -0
  677. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_2.out +0 -0
  678. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_3.out +0 -0
  679. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Photoshop.t +0 -0
  680. data/bin/Image-ExifTool-10.23/t/Photoshop_2.out +109 -0
  681. data/bin/Image-ExifTool-10.23/t/Photoshop_3.out +117 -0
  682. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript.t +0 -0
  683. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_2.out +0 -0
  684. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_3.out +0 -0
  685. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime.t +0 -0
  686. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_2.out +0 -0
  687. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_3.out +0 -0
  688. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_4.out +0 -0
  689. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_5.out +0 -0
  690. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF.t +0 -0
  691. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_2.out +0 -0
  692. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_3.out +0 -0
  693. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_4.out +0 -0
  694. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF.t +0 -0
  695. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF_2.out +0 -0
  696. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance.t +0 -0
  697. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance_2.out +0 -0
  698. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real.t +0 -0
  699. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_2.out +0 -0
  700. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_3.out +0 -0
  701. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_4.out +0 -0
  702. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh.t +0 -0
  703. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_2.out +0 -0
  704. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_3.out +0 -0
  705. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_4.out +0 -0
  706. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo.t +0 -0
  707. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_2.out +0 -0
  708. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_3.out +0 -0
  709. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma.t +0 -0
  710. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_2.out +0 -0
  711. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_3.out +0 -0
  712. data/bin/Image-ExifTool-10.23/t/Sigma_4.out +65 -0
  713. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_5.out +0 -0
  714. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony.t +0 -0
  715. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_2.out +0 -0
  716. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_3.out +0 -0
  717. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_5.out +0 -0
  718. data/bin/Image-ExifTool-10.23/t/TestLib.pm +431 -0
  719. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent.t +0 -0
  720. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent_2.out +0 -0
  721. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown.t +0 -0
  722. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_2.out +0 -0
  723. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_3.out +0 -0
  724. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard.t +0 -0
  725. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_2.out +0 -0
  726. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_3.out +0 -0
  727. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Vorbis.t +0 -0
  728. data/bin/Image-ExifTool-10.23/t/Vorbis_2.out +29 -0
  729. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer.t +0 -0
  730. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_10.out +0 -0
  731. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_11.out +0 -0
  732. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_13.out +0 -0
  733. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_14.out +0 -0
  734. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_15.out +0 -0
  735. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_16.out +0 -0
  736. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_17.out +0 -0
  737. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_18.out +0 -0
  738. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_19.out +0 -0
  739. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_2.out +0 -0
  740. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_22.out +0 -0
  741. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_24.out +0 -0
  742. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_25.out +0 -0
  743. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_26.out +0 -0
  744. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_27.out +0 -0
  745. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_28.out +0 -0
  746. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_29.out +0 -0
  747. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_30.out +0 -0
  748. data/bin/Image-ExifTool-10.23/t/Writer_31.out +108 -0
  749. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_32.out +0 -0
  750. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_33.out +0 -0
  751. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_34.out +0 -0
  752. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_35.out +0 -0
  753. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_36.out +0 -0
  754. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_37.out +0 -0
  755. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_38.out +0 -0
  756. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_39.out +0 -0
  757. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_4.out +0 -0
  758. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_40.out +0 -0
  759. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_41.out +0 -0
  760. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_42.out +0 -0
  761. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_43.out +0 -0
  762. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_44.out +0 -0
  763. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_45.out +0 -0
  764. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_46.out +0 -0
  765. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_47.out +0 -0
  766. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_48.out +0 -0
  767. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_50.out +0 -0
  768. data/bin/Image-ExifTool-10.23/t/Writer_51.out +414 -0
  769. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_52.out +0 -0
  770. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_53.out +0 -0
  771. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_54.out +0 -0
  772. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_55.out +0 -0
  773. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_56.out +0 -0
  774. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_6.out +0 -0
  775. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_7.out +0 -0
  776. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_9.out +0 -0
  777. data/bin/Image-ExifTool-10.23/t/XMP.t +570 -0
  778. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_10.out +0 -0
  779. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_11.out +0 -0
  780. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_12.out +0 -0
  781. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_13.out +0 -0
  782. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_14.out +0 -0
  783. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_15.out +0 -0
  784. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_16.out +0 -0
  785. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_17.out +0 -0
  786. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_18.out +0 -0
  787. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_19.out +0 -0
  788. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_2.out +0 -0
  789. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_20.out +0 -0
  790. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_21.out +0 -0
  791. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_22.out +0 -0
  792. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_23.out +0 -0
  793. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_24.out +0 -0
  794. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_25.out +0 -0
  795. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_26.out +0 -0
  796. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_27.out +0 -0
  797. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_28.out +0 -0
  798. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_29.out +0 -0
  799. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_3.out +0 -0
  800. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_30.out +0 -0
  801. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_31.out +0 -0
  802. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_32.out +0 -0
  803. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_34.out +0 -0
  804. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_36.out +0 -0
  805. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_37.out +0 -0
  806. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_39.out +0 -0
  807. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_40.out +0 -0
  808. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_41.out +0 -0
  809. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_42.out +0 -0
  810. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_43.out +0 -0
  811. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_44.out +0 -0
  812. data/bin/Image-ExifTool-10.23/t/XMP_45.out +23 -0
  813. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_5.out +0 -0
  814. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_6.out +0 -0
  815. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_7.out +0 -0
  816. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_8.out +0 -0
  817. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_9.out +0 -0
  818. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP.t +0 -0
  819. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_2.out +0 -0
  820. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_3.out +0 -0
  821. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_4.out +0 -0
  822. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_5.out +0 -0
  823. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_6.out +0 -0
  824. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_7.out +0 -0
  825. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AFCP.jpg +0 -0
  826. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AIFF.aif +0 -0
  827. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.ape +0 -0
  828. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.mpc +0 -0
  829. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ASF.wmv +0 -0
  830. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Audible.aa +0 -0
  831. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BMP.bmp +0 -0
  832. data/bin/Image-ExifTool-10.23/t/images/BPG.bpg +0 -0
  833. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BigTIFF.btf +0 -0
  834. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon.jpg +0 -0
  835. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon1DmkIII.jpg +0 -0
  836. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.cr2 +0 -0
  837. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.crw +0 -0
  838. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.dr4 +0 -0
  839. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.vrd +0 -0
  840. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CaptureOne.eip +0 -0
  841. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio.jpg +0 -0
  842. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio2.jpg +0 -0
  843. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CasioQVCI.jpg +0 -0
  844. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DICOM.dcm +0 -0
  845. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DNG.dng +0 -0
  846. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DPX.dpx +0 -0
  847. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DV.dv +0 -0
  848. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DjVu.djvu +0 -0
  849. data/bin/Image-ExifTool-10.23/t/images/EXE.a +0 -0
  850. data/bin/Image-ExifTool-10.23/t/images/EXE.dylib +0 -0
  851. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.elf +0 -0
  852. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.exe +0 -0
  853. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.macho +0 -0
  854. data/bin/Image-ExifTool-10.23/t/images/EXE.so +0 -0
  855. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.jpg +0 -0
  856. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.tif +0 -0
  857. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExtendedXMP.jpg +0 -0
  858. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.flac +0 -0
  859. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.ogg +0 -0
  860. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.fpf +0 -0
  861. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.jpg +0 -0
  862. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.flv +0 -0
  863. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.swf +0 -0
  864. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FlashPix.ppt +0 -0
  865. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.afm +0 -0
  866. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.dfont +0 -0
  867. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfa +0 -0
  868. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfb +0 -0
  869. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfm +0 -0
  870. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.ttf +0 -0
  871. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FotoStation.jpg +0 -0
  872. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.jpg +0 -0
  873. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.raf +0 -0
  874. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GE.jpg +0 -0
  875. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIF.gif +0 -0
  876. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIMP.xcf +0 -0
  877. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GPS.jpg +0 -0
  878. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GeoTiff.tif +0 -0
  879. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.gpx +0 -0
  880. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.igc +0 -0
  881. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.kml +0 -0
  882. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.log +0 -0
  883. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.xml +0 -0
  884. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag2.log +0 -0
  885. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag3.log +0 -0
  886. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/HTML.html +0 -0
  887. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/IPTC.jpg +0 -0
  888. data/bin/Image-ExifTool-10.23/t/images/ISO.iso +0 -0
  889. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ITC.itc +0 -0
  890. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/InDesign.indd +0 -0
  891. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC.jpg +0 -0
  892. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC2.jpg +0 -0
  893. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.j2c +0 -0
  894. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.jp2 +0 -0
  895. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Kodak.jpg +0 -0
  896. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/KyoceraRaw.raw +0 -0
  897. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/LNK.lnk +0 -0
  898. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Lytro.lfp +0 -0
  899. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/M2TS.mts +0 -0
  900. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIE.mie +0 -0
  901. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIFF.miff +0 -0
  902. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MOI.moi +0 -0
  903. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MP3.mp3 +0 -0
  904. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MWG.jpg +0 -0
  905. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MXF.mxf +0 -0
  906. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Matroska.mkv +0 -0
  907. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.jpg +0 -0
  908. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.mrw +0 -0
  909. data/bin/Image-ExifTool-10.23/t/images/Motorola.jpg +0 -0
  910. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.jpg +0 -0
  911. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.nef +0 -0
  912. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD2Hs.jpg +0 -0
  913. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD70.jpg +0 -0
  914. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OOXML.docx +0 -0
  915. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.dss +0 -0
  916. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.jpg +0 -0
  917. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus2.jpg +0 -0
  918. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OlympusE1.jpg +0 -0
  919. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenDoc.ods +0 -0
  920. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenEXR.exr +0 -0
  921. data/bin/Image-ExifTool-10.23/t/images/Opus.opus +0 -0
  922. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF.pdf +0 -0
  923. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF2.pdf +0 -0
  924. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PGF.pgf +0 -0
  925. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PICT.pict +0 -0
  926. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-bin.plist +0 -0
  927. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-xml.plist +0 -0
  928. data/bin/Image-ExifTool-10.23/t/images/PLUS.xmp +127 -0
  929. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PNG.png +0 -0
  930. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PPM.ppm +0 -0
  931. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PSP.psp +0 -0
  932. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Palm.mobi +0 -0
  933. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.jpg +0 -0
  934. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.rw2 +0 -0
  935. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.avi +0 -0
  936. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.jpg +0 -0
  937. data/bin/Image-ExifTool-10.23/t/images/PhaseOne.iiq +0 -0
  938. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoCD.pcd +0 -0
  939. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoMechanic.jpg +0 -0
  940. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Photoshop.psd +0 -0
  941. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PostScript.eps +0 -0
  942. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.m4a +0 -0
  943. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.mov +0 -0
  944. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.avi +0 -0
  945. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.wav +0 -0
  946. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.webp +0 -0
  947. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RTF.rtf +0 -0
  948. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Radiance.hdr +0 -0
  949. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ra +0 -0
  950. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ram +0 -0
  951. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.rm +0 -0
  952. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh.jpg +0 -0
  953. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh2.jpg +0 -0
  954. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sanyo.jpg +0 -0
  955. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.jpg +0 -0
  956. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.x3f +0 -0
  957. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/SigmaDP2.x3f +0 -0
  958. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.jpg +0 -0
  959. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.pmp +0 -0
  960. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Torrent.torrent +0 -0
  961. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Unknown.jpg +0 -0
  962. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.ics +0 -0
  963. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.vcf +0 -0
  964. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Vorbis.ogg +0 -0
  965. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Writer.jpg +0 -0
  966. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.inx +0 -0
  967. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.jpg +0 -0
  968. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.svg +0 -0
  969. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xml +0 -0
  970. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xmp +0 -0
  971. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP2.xmp +0 -0
  972. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP3.xmp +0 -0
  973. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP4.xmp +0 -0
  974. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP5.xmp +0 -0
  975. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP6.xmp +0 -0
  976. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.gz +0 -0
  977. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.zip +0 -0
  978. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/iWork.numbers +0 -0
  979. data/lib/exiftool_vendored/version.rb +1 -1
  980. metadata +980 -941
  981. data/bin/Image-ExifTool-10.04/Changes +0 -7227
  982. data/bin/Image-ExifTool-10.04/MANIFEST +0 -937
  983. data/bin/Image-ExifTool-10.04/META.yml +0 -27
  984. data/bin/Image-ExifTool-10.04/Makefile.PL +0 -41
  985. data/bin/Image-ExifTool-10.04/README +0 -233
  986. data/bin/Image-ExifTool-10.04/config_files/example.config +0 -343
  987. data/bin/Image-ExifTool-10.04/config_files/picasa_faces.config +0 -370
  988. data/bin/Image-ExifTool-10.04/exiftool +0 -6260
  989. data/bin/Image-ExifTool-10.04/html/ExifTool.html +0 -2070
  990. data/bin/Image-ExifTool-10.04/html/Shift.html +0 -173
  991. data/bin/Image-ExifTool-10.04/html/TagNames/Canon.html +0 -9344
  992. data/bin/Image-ExifTool-10.04/html/TagNames/CanonCustom.html +0 -2081
  993. data/bin/Image-ExifTool-10.04/html/TagNames/CanonVRD.html +0 -1958
  994. data/bin/Image-ExifTool-10.04/html/TagNames/Composite.html +0 -705
  995. data/bin/Image-ExifTool-10.04/html/TagNames/DNG.html +0 -291
  996. data/bin/Image-ExifTool-10.04/html/TagNames/DPX.html +0 -224
  997. data/bin/Image-ExifTool-10.04/html/TagNames/EXE.html +0 -697
  998. data/bin/Image-ExifTool-10.04/html/TagNames/EXIF.html +0 -3383
  999. data/bin/Image-ExifTool-10.04/html/TagNames/Extra.html +0 -437
  1000. data/bin/Image-ExifTool-10.04/html/TagNames/FLAC.html +0 -183
  1001. data/bin/Image-ExifTool-10.04/html/TagNames/FujiFilm.html +0 -813
  1002. data/bin/Image-ExifTool-10.04/html/TagNames/GPS.html +0 -230
  1003. data/bin/Image-ExifTool-10.04/html/TagNames/JFIF.html +0 -61
  1004. data/bin/Image-ExifTool-10.04/html/TagNames/Minolta.html +0 -2614
  1005. data/bin/Image-ExifTool-10.04/html/TagNames/Nikon.html +0 -4836
  1006. data/bin/Image-ExifTool-10.04/html/TagNames/NikonCustom.html +0 -5633
  1007. data/bin/Image-ExifTool-10.04/html/TagNames/Ogg.html +0 -44
  1008. data/bin/Image-ExifTool-10.04/html/TagNames/Olympus.html +0 -3534
  1009. data/bin/Image-ExifTool-10.04/html/TagNames/Pentax.html +0 -4693
  1010. data/bin/Image-ExifTool-10.04/html/TagNames/PhaseOne.html +0 -253
  1011. data/bin/Image-ExifTool-10.04/html/TagNames/Photoshop.html +0 -575
  1012. data/bin/Image-ExifTool-10.04/html/TagNames/QuickTime.html +0 -6040
  1013. data/bin/Image-ExifTool-10.04/html/TagNames/RIFF.html +0 -1344
  1014. data/bin/Image-ExifTool-10.04/html/TagNames/Samsung.html +0 -604
  1015. data/bin/Image-ExifTool-10.04/html/TagNames/Shortcuts.html +0 -277
  1016. data/bin/Image-ExifTool-10.04/html/TagNames/Sigma.html +0 -469
  1017. data/bin/Image-ExifTool-10.04/html/TagNames/Sony.html +0 -8781
  1018. data/bin/Image-ExifTool-10.04/html/TagNames/Vorbis.html +0 -228
  1019. data/bin/Image-ExifTool-10.04/html/TagNames/XMP.html +0 -9175
  1020. data/bin/Image-ExifTool-10.04/html/TagNames/index.html +0 -211
  1021. data/bin/Image-ExifTool-10.04/html/ancient_history.html +0 -7903
  1022. data/bin/Image-ExifTool-10.04/html/config.html +0 -355
  1023. data/bin/Image-ExifTool-10.04/html/exiftool_pod.html +0 -2514
  1024. data/bin/Image-ExifTool-10.04/html/faq.html +0 -1534
  1025. data/bin/Image-ExifTool-10.04/html/filename.html +0 -352
  1026. data/bin/Image-ExifTool-10.04/html/geotag.html +0 -654
  1027. data/bin/Image-ExifTool-10.04/html/history.html +0 -263
  1028. data/bin/Image-ExifTool-10.04/html/index.html +0 -1331
  1029. data/bin/Image-ExifTool-10.04/html/install.html +0 -255
  1030. data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pm +0 -378
  1031. data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pod +0 -231
  1032. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pm +0 -7499
  1033. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pod +0 -2504
  1034. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AES.pm +0 -501
  1035. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AFCP.pm +0 -286
  1036. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AIFF.pm +0 -289
  1037. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APE.pm +0 -264
  1038. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APP12.pm +0 -322
  1039. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ASF.pm +0 -885
  1040. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Apple.pm +0 -128
  1041. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Audible.pm +0 -317
  1042. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BMP.pm +0 -179
  1043. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BZZ.pm +0 -472
  1044. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BigTIFF.pm +0 -282
  1045. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BuildTagLookup.pm +0 -2513
  1046. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Canon.pm +0 -8482
  1047. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonCustom.pm +0 -2582
  1048. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonRaw.pm +0 -910
  1049. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonVRD.pm +0 -2240
  1050. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CaptureOne.pm +0 -235
  1051. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Casio.pm +0 -2058
  1052. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Charset.pm +0 -396
  1053. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DICOM.pm +0 -3874
  1054. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DNG.pm +0 -835
  1055. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DPX.pm +0 -181
  1056. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DV.pm +0 -319
  1057. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DarwinCore.pm +0 -322
  1058. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DjVu.pm +0 -376
  1059. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/EXE.pm +0 -1253
  1060. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Exif.pm +0 -4687
  1061. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLAC.pm +0 -297
  1062. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLIR.pm +0 -1533
  1063. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Fixup.pm +0 -354
  1064. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Flash.pm +0 -755
  1065. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FlashPix.pm +0 -1935
  1066. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Font.pm +0 -647
  1067. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FotoStation.pm +0 -261
  1068. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FujiFilm.pm +0 -1196
  1069. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GE.pm +0 -81
  1070. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIF.pm +0 -542
  1071. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIMP.pm +0 -258
  1072. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GPS.pm +0 -558
  1073. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GeoTiff.pm +0 -2263
  1074. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Geotag.pm +0 -1221
  1075. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/H264.pm +0 -1112
  1076. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HP.pm +0 -263
  1077. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HTML.pm +0 -576
  1078. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HtmlDump.pm +0 -895
  1079. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ICC_Profile.pm +0 -1000
  1080. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ID3.pm +0 -1569
  1081. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/IPTC.pm +0 -1264
  1082. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ITC.pm +0 -215
  1083. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Import.pm +0 -329
  1084. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/InDesign.pm +0 -277
  1085. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEG.pm +0 -605
  1086. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEGDigest.pm +0 -2511
  1087. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JVC.pm +0 -130
  1088. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Jpeg2000.pm +0 -882
  1089. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Kodak.pm +0 -2096
  1090. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/KyoceraRaw.pm +0 -173
  1091. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/LNK.pm +0 -723
  1092. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/cs.pm +0 -1588
  1093. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/de.pm +0 -8692
  1094. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_ca.pm +0 -848
  1095. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_gb.pm +0 -863
  1096. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/es.pm +0 -4019
  1097. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fi.pm +0 -2854
  1098. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fr.pm +0 -4758
  1099. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/it.pm +0 -7918
  1100. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ja.pm +0 -5835
  1101. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ko.pm +0 -2330
  1102. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/nl.pm +0 -3222
  1103. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/pl.pm +0 -1276
  1104. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ru.pm +0 -768
  1105. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/sv.pm +0 -638
  1106. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/tr.pm +0 -544
  1107. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1330
  1108. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_tw.pm +0 -801
  1109. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Leaf.pm +0 -516
  1110. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lytro.pm +0 -217
  1111. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/M2TS.pm +0 -725
  1112. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIE.pm +0 -2564
  1113. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIEUnits.pod +0 -377
  1114. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIFF.pm +0 -279
  1115. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MNG.pm +0 -684
  1116. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MOI.pm +0 -158
  1117. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPC.pm +0 -156
  1118. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPEG.pm +0 -736
  1119. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPF.pm +0 -292
  1120. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MWG.pm +0 -753
  1121. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MXF.pm +0 -3031
  1122. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MakerNotes.pm +0 -1725
  1123. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Matroska.pm +0 -892
  1124. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Microsoft.pm +0 -904
  1125. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Minolta.pm +0 -2961
  1126. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MinoltaRaw.pm +0 -534
  1127. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nikon.pm +0 -6751
  1128. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCapture.pm +0 -940
  1129. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCustom.pm +0 -6331
  1130. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nintendo.pm +0 -128
  1131. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OOXML.pm +0 -409
  1132. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ogg.pm +0 -237
  1133. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Olympus.pm +0 -3797
  1134. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OpenEXR.pm +0 -324
  1135. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PDF.pm +0 -2328
  1136. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PGF.pm +0 -143
  1137. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PICT.pm +0 -1260
  1138. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PLIST.pm +0 -453
  1139. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PNG.pm +0 -1227
  1140. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PPM.pm +0 -169
  1141. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PSP.pm +0 -306
  1142. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Palm.pm +0 -403
  1143. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Panasonic.pm +0 -2374
  1144. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PanasonicRaw.pm +0 -643
  1145. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Pentax.pm +0 -5973
  1146. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhaseOne.pm +0 -551
  1147. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoCD.pm +0 -507
  1148. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoMechanic.pm +0 -256
  1149. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Photoshop.pm +0 -650
  1150. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PostScript.pm +0 -696
  1151. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PrintIM.pm +0 -125
  1152. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Qualcomm.pm +0 -1344
  1153. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/QuickTime.pm +0 -6576
  1154. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/README +0 -981
  1155. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RIFF.pm +0 -1530
  1156. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RSRC.pm +0 -241
  1157. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RTF.pm +0 -383
  1158. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Radiance.pm +0 -144
  1159. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Rawzor.pm +0 -189
  1160. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Real.pm +0 -739
  1161. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Reconyx.pm +0 -190
  1162. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ricoh.pm +0 -1148
  1163. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Samsung.pm +0 -1168
  1164. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sanyo.pm +0 -440
  1165. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Scalado.pm +0 -141
  1166. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shift.pl +0 -596
  1167. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shortcuts.pm +0 -336
  1168. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sigma.pm +0 -684
  1169. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SigmaRaw.pm +0 -668
  1170. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sony.pm +0 -9219
  1171. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SonyIDC.pm +0 -331
  1172. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Stim.pm +0 -196
  1173. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagInfoXML.pm +0 -827
  1174. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagLookup.pm +0 -8948
  1175. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagNames.pod +0 -29199
  1176. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Theora.pm +0 -145
  1177. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Torrent.pm +0 -317
  1178. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Unknown.pm +0 -66
  1179. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/VCard.pm +0 -405
  1180. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Vorbis.pm +0 -238
  1181. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteCanonRaw.pl +0 -637
  1182. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteExif.pl +0 -3741
  1183. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteIPTC.pl +0 -706
  1184. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePDF.pl +0 -768
  1185. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePNG.pl +0 -390
  1186. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePhotoshop.pl +0 -266
  1187. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePostScript.pl +0 -772
  1188. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteQuickTime.pl +0 -358
  1189. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteXMP.pl +0 -1367
  1190. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Writer.pl +0 -6165
  1191. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP.pm +0 -4034
  1192. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP2.pl +0 -1579
  1193. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMPStruct.pl +0 -828
  1194. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ZIP.pm +0 -667
  1195. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/iWork.pm +0 -223
  1196. data/bin/Image-ExifTool-10.04/perl-Image-ExifTool.spec +0 -112
  1197. data/bin/Image-ExifTool-10.04/t/APE_2.out +0 -29
  1198. data/bin/Image-ExifTool-10.04/t/CanonRaw_5.out +0 -209
  1199. data/bin/Image-ExifTool-10.04/t/DNG_2.out +0 -328
  1200. data/bin/Image-ExifTool-10.04/t/EXE.t +0 -31
  1201. data/bin/Image-ExifTool-10.04/t/EXE_2.out +0 -41
  1202. data/bin/Image-ExifTool-10.04/t/EXE_3.out +0 -16
  1203. data/bin/Image-ExifTool-10.04/t/EXE_4.out +0 -15
  1204. data/bin/Image-ExifTool-10.04/t/ExifTool.t +0 -304
  1205. data/bin/Image-ExifTool-10.04/t/ExifTool_17.out +0 -598
  1206. data/bin/Image-ExifTool-10.04/t/ExifTool_2.out +0 -418
  1207. data/bin/Image-ExifTool-10.04/t/FLAC_3.out +0 -20
  1208. data/bin/Image-ExifTool-10.04/t/FujiFilm_4.out +0 -141
  1209. data/bin/Image-ExifTool-10.04/t/Geotag.t +0 -185
  1210. data/bin/Image-ExifTool-10.04/t/IPTC_2.out +0 -60
  1211. data/bin/Image-ExifTool-10.04/t/IPTC_4.out +0 -58
  1212. data/bin/Image-ExifTool-10.04/t/MIFF_2.out +0 -110
  1213. data/bin/Image-ExifTool-10.04/t/Olympus_4.out +0 -194
  1214. data/bin/Image-ExifTool-10.04/t/Olympus_5.out +0 -266
  1215. data/bin/Image-ExifTool-10.04/t/Olympus_6.out +0 -153
  1216. data/bin/Image-ExifTool-10.04/t/Olympus_7.out +0 -483
  1217. data/bin/Image-ExifTool-10.04/t/PDF_2.out +0 -118
  1218. data/bin/Image-ExifTool-10.04/t/Photoshop_2.out +0 -98
  1219. data/bin/Image-ExifTool-10.04/t/Photoshop_3.out +0 -110
  1220. data/bin/Image-ExifTool-10.04/t/Sigma_4.out +0 -65
  1221. data/bin/Image-ExifTool-10.04/t/TestLib.pm +0 -427
  1222. data/bin/Image-ExifTool-10.04/t/Vorbis_2.out +0 -29
  1223. data/bin/Image-ExifTool-10.04/t/Writer_31.out +0 -99
  1224. data/bin/Image-ExifTool-10.04/t/Writer_51.out +0 -405
  1225. data/bin/Image-ExifTool-10.04/t/XMP.t +0 -557
@@ -1,3741 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # File: WriteExif.pl
3
- #
4
- # Description: Write EXIF meta information
5
- #
6
- # Revisions: 12/13/2004 - P. Harvey Created
7
- #------------------------------------------------------------------------------
8
-
9
- package Image::ExifTool::Exif;
10
-
11
- use strict;
12
- use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber
13
- %compression %photometricInterpretation %orientation);
14
-
15
- use Image::ExifTool::Fixup;
16
-
17
- sub InsertWritableProperties($$;$);
18
-
19
- # some information may be stored in different IFD's with the same meaning.
20
- # Use this lookup to decide when we should delete information that is stored
21
- # in another IFD when we write it to the preferred IFD.
22
- my %crossDelete = (
23
- ExifIFD => 'IFD0',
24
- IFD0 => 'ExifIFD',
25
- );
26
-
27
- # mandatory tag default values
28
- my %mandatory = (
29
- IFD0 => {
30
- 0x011a => 72, # XResolution
31
- 0x011b => 72, # YResolution
32
- 0x0128 => 2, # ResolutionUnit (inches)
33
- 0x0213 => 1, # YCbCrPositioning (centered)
34
- # 0x8769 => ????, # ExifOffset
35
- },
36
- IFD1 => {
37
- 0x0103 => 6, # Compression (JPEG)
38
- 0x011a => 72, # XResolution
39
- 0x011b => 72, # YResolution
40
- 0x0128 => 2, # ResolutionUnit (inches)
41
- },
42
- ExifIFD => {
43
- 0x9000 => '0230', # ExifVersion
44
- 0x9101 => "1 2 3 0",# ComponentsConfiguration
45
- 0xa000 => '0100', # FlashpixVersion
46
- 0xa001 => 0xffff, # ColorSpace (uncalibrated)
47
- # 0xa002 => ????, # ExifImageWidth
48
- # 0xa003 => ????, # ExifImageHeight
49
- },
50
- GPS => {
51
- 0x0000 => '2 3 0 0',# GPSVersionID
52
- },
53
- InteropIFD => {
54
- 0x0002 => '0100', # InteropVersion
55
- },
56
- );
57
-
58
- # The main EXIF table is unique because the tags from this table may appear
59
- # in many different directories. For this reason, we introduce a
60
- # "WriteGroup" member to the tagInfo that tells us the preferred location
61
- # for writing each tag. Here is the lookup for Writable flag (format)
62
- # and WriteGroup for all writable tags
63
- # - WriteGroup is ExifIFD unless otherwise specified
64
- # - Protected is 1 if the tag shouldn't be copied with SetNewValuesFromFile()
65
- my %writeTable = (
66
- 0x0001 => { # InteropIndex
67
- Protected => 1,
68
- Writable => 'string',
69
- WriteGroup => 'InteropIFD',
70
- },
71
- 0x0002 => { # InteropVersion
72
- Protected => 1,
73
- Writable => 'undef',
74
- Mandatory => 1,
75
- WriteGroup => 'InteropIFD',
76
- },
77
- 0x000b => { # ProcessingSoftware
78
- Writable => 'string',
79
- WriteGroup => 'IFD0',
80
- },
81
- 0x00fe => { # SubfileType
82
- Protected => 1,
83
- Writable => 'int32u',
84
- WriteGroup => 'IFD0',
85
- },
86
- 0x00ff => { # OldSubfileType
87
- Protected => 1,
88
- Writable => 'int16u',
89
- WriteGroup => 'IFD0',
90
- },
91
- 0x0100 => { # ImageWidth
92
- Protected => 1,
93
- Writable => 'int32u',
94
- WriteGroup => 'IFD0',
95
- },
96
- 0x0101 => { # ImageHeight
97
- Protected => 1,
98
- Writable => 'int32u',
99
- WriteGroup => 'IFD0',
100
- },
101
- 0x0102 => { # BitsPerSample
102
- Protected => 1,
103
- Writable => 'int16u',
104
- WriteGroup => 'IFD0',
105
- Count => -1, # can be 1 or 3: -1 means 'variable'
106
- },
107
- 0x0103 => { # Compression
108
- Protected => 1,
109
- Writable => 'int16u',
110
- WriteGroup => 'IFD0',
111
- Mandatory => 1,
112
- },
113
- 0x0106 => { # PhotometricInterpretation
114
- Protected => 1,
115
- Writable => 'int16u',
116
- WriteGroup => 'IFD0',
117
- },
118
- 0x0107 => { # Thresholding
119
- Protected => 1,
120
- Writable => 'int16u',
121
- WriteGroup => 'IFD0',
122
- },
123
- 0x0108 => { # CellWidth
124
- Protected => 1,
125
- Writable => 'int16u',
126
- WriteGroup => 'IFD0',
127
- },
128
- 0x0109 => { # CellLength
129
- Protected => 1,
130
- Writable => 'int16u',
131
- WriteGroup => 'IFD0',
132
- },
133
- 0x010a => { # FillOrder
134
- Protected => 1,
135
- Writable => 'int16u',
136
- WriteGroup => 'IFD0',
137
- },
138
- 0x010d => { # DocumentName
139
- Writable => 'string',
140
- WriteGroup => 'IFD0',
141
- },
142
- 0x010e => { # ImageDescription
143
- Writable => 'string',
144
- WriteGroup => 'IFD0',
145
- },
146
- 0x010f => { # Make
147
- Writable => 'string',
148
- WriteGroup => 'IFD0',
149
- },
150
- 0x0110 => { # Model
151
- Writable => 'string',
152
- WriteGroup => 'IFD0',
153
- },
154
- 0x0112 => { # Orientation
155
- Writable => 'int16u',
156
- WriteGroup => 'IFD0',
157
- },
158
- 0x0115 => { # SamplesPerPixel
159
- Protected => 1,
160
- Writable => 'int16u',
161
- WriteGroup => 'IFD0',
162
- },
163
- 0x0116 => { # RowsPerStrip
164
- Protected => 1,
165
- Writable => 'int32u',
166
- WriteGroup => 'IFD0',
167
- },
168
- 0x0118 => { # MinSampleValue
169
- Writable => 'int16u',
170
- WriteGroup => 'IFD0',
171
- },
172
- 0x0119 => { # MaxSampleValue
173
- Writable => 'int16u',
174
- WriteGroup => 'IFD0',
175
- },
176
- 0x011a => { # XResolution
177
- Writable => 'rational64u',
178
- WriteGroup => 'IFD0',
179
- Mandatory => 1,
180
- },
181
- 0x011b => { # YResolution
182
- Writable => 'rational64u',
183
- WriteGroup => 'IFD0',
184
- Mandatory => 1,
185
- },
186
- 0x011c => { # PlanarConfiguration
187
- Protected => 1,
188
- Writable => 'int16u',
189
- WriteGroup => 'IFD0',
190
- },
191
- 0x011d => { # PageName
192
- Writable => 'string',
193
- WriteGroup => 'IFD0',
194
- },
195
- 0x011e => { # XPosition
196
- Writable => 'rational64u',
197
- WriteGroup => 'IFD0',
198
- },
199
- 0x011f => { # YPosition
200
- Writable => 'rational64u',
201
- WriteGroup => 'IFD0',
202
- },
203
- 0x0122 => { # GrayResponseUnit
204
- Writable => 'int16u',
205
- WriteGroup => 'IFD0',
206
- },
207
- 0x0128 => { # ResolutionUnit
208
- Writable => 'int16u',
209
- WriteGroup => 'IFD0',
210
- Mandatory => 1,
211
- },
212
- 0x0129 => { # PageNumber
213
- Writable => 'int16u',
214
- WriteGroup => 'IFD0',
215
- Count => 2,
216
- },
217
- 0x012d => { # TransferFunction
218
- Protected => 1,
219
- Writable => 'int16u',
220
- WriteGroup => 'IFD0',
221
- Count => 768,
222
- },
223
- 0x0131 => { # Software
224
- Writable => 'string',
225
- WriteGroup => 'IFD0',
226
- },
227
- 0x0132 => { # ModifyDate
228
- Writable => 'string',
229
- Shift => 'Time',
230
- WriteGroup => 'IFD0',
231
- PrintConvInv => '$self->InverseDateTime($val,0)',
232
- },
233
- 0x013b => { # Artist
234
- Writable => 'string',
235
- WriteGroup => 'IFD0',
236
- },
237
- 0x013c => { # HostComputer
238
- Writable => 'string',
239
- WriteGroup => 'IFD0',
240
- },
241
- 0x013d => { # Predictor
242
- Protected => 1,
243
- Writable => 'int16u',
244
- WriteGroup => 'IFD0',
245
- },
246
- 0x013e => { # WhitePoint
247
- Writable => 'rational64u',
248
- WriteGroup => 'IFD0',
249
- Count => 2,
250
- },
251
- 0x013f => { # PrimaryChromaticities
252
- Writable => 'rational64u',
253
- WriteGroup => 'IFD0',
254
- Count => 6,
255
- },
256
- 0x0141 => { # HalftoneHints
257
- Writable => 'int16u',
258
- WriteGroup => 'IFD0',
259
- Count => 2,
260
- },
261
- 0x0142 => { # TileWidth
262
- Protected => 1,
263
- Writable => 'int32u',
264
- WriteGroup => 'IFD0',
265
- },
266
- 0x0143 => { # TileLength
267
- Protected => 1,
268
- Writable => 'int32u',
269
- WriteGroup => 'IFD0',
270
- },
271
- 0x014c => { # InkSet
272
- Writable => 'int16u',
273
- WriteGroup => 'IFD0',
274
- },
275
- 0x0150 => { # TargetPrinter
276
- Writable => 'string',
277
- WriteGroup => 'IFD0',
278
- },
279
- 0x013c => { # HostComputer
280
- Writable => 'string',
281
- WriteGroup => 'IFD0',
282
- },
283
- 0x0211 => { # YCbCrCoefficients
284
- Protected => 1,
285
- Writable => 'rational64u',
286
- WriteGroup => 'IFD0',
287
- Count => 3,
288
- },
289
- 0x0212 => { # YCbCrSubSampling
290
- Protected => 1,
291
- Writable => 'int16u',
292
- WriteGroup => 'IFD0',
293
- Count => 2,
294
- },
295
- 0x0213 => { # YCbCrPositioning
296
- Protected => 1,
297
- Writable => 'int16u',
298
- WriteGroup => 'IFD0',
299
- Mandatory => 1,
300
- },
301
- 0x0214 => { # ReferenceBlackWhite
302
- Writable => 'rational64u',
303
- WriteGroup => 'IFD0',
304
- Count => 6,
305
- },
306
- 0x1000 => { # RelatedImageFileFormat
307
- Protected => 1,
308
- Writable => 'string',
309
- WriteGroup => 'InteropIFD',
310
- },
311
- 0x1001 => { # RelatedImageWidth
312
- Protected => 1,
313
- Writable => 'int16u',
314
- WriteGroup => 'InteropIFD',
315
- },
316
- 0x1002 => { # RelatedImageHeight (more commonly RelatedImageLength)
317
- Protected => 1,
318
- Writable => 'int16u',
319
- WriteGroup => 'InteropIFD',
320
- },
321
- 0x4746 => { # Rating (MicrosoftPhoto)
322
- Writable => 'int16u',
323
- WriteGroup => 'IFD0',
324
- Avoid => 1,
325
- },
326
- 0x4749 => { # RatingPercent (MicrosoftPhoto)
327
- Writable => 'int16u',
328
- WriteGroup => 'IFD0',
329
- Avoid => 1,
330
- },
331
- 0x828d => { # CFARepeatPatternDim
332
- Protected => 1,
333
- Writable => 'int16u',
334
- WriteGroup => 'SubIFD',
335
- Count => 2,
336
- },
337
- 0x828e => { # CFAPattern2
338
- Protected => 1,
339
- Writable => 'int8u',
340
- WriteGroup => 'SubIFD',
341
- Count => -1,
342
- },
343
- 0x8298 => { # Copyright
344
- Writable => 'string',
345
- WriteGroup => 'IFD0',
346
- RawConvInv => '$val . "\0"',
347
- PrintConvInv => sub {
348
- my ($val, $self) = @_;
349
- # encode if necessary
350
- my $enc = $self->Options('CharsetEXIF');
351
- $val = $self->Encode($val,$enc) if $enc and $val !~ /\0/;
352
- if ($val =~ /(.*?)\s*[\n\r]+\s*(.*)/s) {
353
- return $1 unless length $2;
354
- # photographer copyright set to ' ' if it doesn't exist, according to spec.
355
- return((length($1) ? $1 : ' ') . "\0" . $2);
356
- }
357
- return $val;
358
- },
359
- },
360
- #
361
- # Most of the tags below this belong in the ExifIFD...
362
- #
363
- 0x829a => { # ExposureTime
364
- Writable => 'rational64u',
365
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
366
- },
367
- 0x829d => { # FNumber
368
- Writable => 'rational64u',
369
- PrintConvInv => '$val',
370
- },
371
- 0x8546 => { # SEMInfo
372
- Writable => 'string',
373
- WriteGroup => 'IFD0',
374
- },
375
- 0x87af => { # GeoTiffDirectory
376
- Writable => 'undef',
377
- WriteGroup => 'IFD0',
378
- # swap byte order if necessary
379
- RawConvInv => q{
380
- return $val if length $val < 2;
381
- my $order = substr($val, -2);
382
- return $val unless $order eq 'II' or $order eq 'MM';
383
- $val = substr($val, 0, -2);
384
- return $val if $order eq GetByteOrder();
385
- return pack('v*',unpack('n*',$val));
386
- },
387
- },
388
- 0x87b0 => { # GeoTiffDoubleParams
389
- Writable => 'undef',
390
- WriteGroup => 'IFD0',
391
- # swap byte order if necessary
392
- RawConvInv => q{
393
- return $val if length $val < 2;
394
- my $order = substr($val, -2);
395
- return $val unless $order eq 'II' or $order eq 'MM';
396
- $val = substr($val, 0, -2);
397
- return $val if $order eq GetByteOrder();
398
- $val =~ s/(.{4})(.{4})/$2$1/sg; # swap words
399
- return pack('V*',unpack('N*',$val));
400
- },
401
- },
402
- 0x87b1 => { # GeoTiffAsciiParams
403
- Writable => 'string',
404
- WriteGroup => 'IFD0',
405
- },
406
- 0x8822 => 'int16u', # ExposureProgram
407
- 0x8824 => 'string', # SpectralSensitivity
408
- 0x8827 => { # ISO
409
- Writable => 'int16u',
410
- Count => -1,
411
- PrintConvInv => '$val=~tr/,//d; $val',
412
- },
413
- 0x882a => { # TimeZoneOffset
414
- Writable => 'int16s',
415
- Count => -1, # can be 1 or 2
416
- Notes => q{
417
- 1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in
418
- hours, 2. If present, the time zone offset of ModifyDate
419
- },
420
- },
421
- 0x882b => 'int16u', # SelfTimerMode
422
- 0x8830 => 'int16u', # SensitivityType
423
- 0x8831 => 'int32u', # StandardOutputSensitivity
424
- 0x8832 => 'int32u', # RecommendedExposureIndex
425
- 0x8833 => 'int32u', # ISOSpeed
426
- 0x8834 => 'int32u', # ISOSpeedLatitudeyyy
427
- 0x8835 => 'int32u', # ISOSpeedLatitudezzz
428
- 0x9000 => { # ExifVersion
429
- Writable => 'undef',
430
- Mandatory => 1,
431
- PrintConvInv => '$val=~tr/.//d; $val=~/^\d{4}$/ ? $val : undef',
432
- },
433
- 0x9003 => { # DateTimeOriginal
434
- Writable => 'string',
435
- Shift => 'Time',
436
- PrintConvInv => '$self->InverseDateTime($val,0)',
437
- },
438
- 0x9004 => { # CreateDate
439
- Writable => 'string',
440
- Shift => 'Time',
441
- PrintConvInv => '$self->InverseDateTime($val,0)',
442
- },
443
- 0x9009 => 'undef', # GooglePlusUploadCode
444
- 0x9101 => { # ComponentsConfiguration
445
- Protected => 1,
446
- Writable => 'undef',
447
- Count => 4,
448
- Mandatory => 1,
449
- ValueConvInv => '$val=~tr/,//d; $val', # (so we can copy from XMP with -n)
450
- },
451
- 0x9102 => { # CompressedBitsPerPixel
452
- Protected => 1,
453
- Writable => 'rational64u',
454
- },
455
- 0x9201 => { # ShutterSpeedValue
456
- Writable => 'rational64s',
457
- ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
458
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
459
- },
460
- 0x9202 => { # ApertureValue
461
- Writable => 'rational64u',
462
- ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
463
- PrintConvInv => '$val',
464
- },
465
- 0x9203 => 'rational64s',# BrightnessValue
466
- 0x9204 => { # ExposureCompensation
467
- Writable => 'rational64s',
468
- PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
469
- },
470
- 0x9205 => { # MaxApertureValue
471
- Writable => 'rational64u',
472
- ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
473
- PrintConvInv => '$val',
474
- },
475
- 0x9206 => { # SubjectDistance
476
- Writable => 'rational64u',
477
- PrintConvInv => '$val=~s/\s*m$//;$val',
478
- },
479
- 0x9207 => 'int16u', # MeteringMode
480
- 0x9208 => 'int16u', # LightSource
481
- 0x9209 => 'int16u', # Flash
482
- 0x920a => { # FocalLength
483
- Writable => 'rational64u',
484
- PrintConvInv => '$val=~s/\s*mm$//;$val',
485
- },
486
- 0x9211 => 'int32u', # ImageNumber
487
- 0x9212 => 'string', # SecurityClassification
488
- 0x9213 => 'string', # ImageHistory
489
- 0x9214 => { # SubjectArea
490
- Writable => 'int16u',
491
- Count => -1, # 2, 3 or 4 values
492
- },
493
- # 0x927c => 'undef', # MakerNotes
494
- 0x9286 => { # UserComment
495
- Writable => 'undef',
496
- # (starts with "ASCII\0\0\0", "UNICODE\0", "JIS\0\0\0\0\0" or "\0\0\0\0\0\0\0\0")
497
- RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
498
- # SHOULD ADD SPECIAL LOGIC TO ALLOW CONDITIONAL OVERWRITE OF
499
- # "UNKNOWN" VALUES FILLED WITH SPACES
500
- },
501
- 0x9290 => { # SubSecTime
502
- Writable => 'string',
503
- # extract fractional seconds from a full date/time value
504
- ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
505
- },
506
- 0x9291 => { # SubSecTimeOriginal
507
- Writable => 'string',
508
- ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
509
- },
510
- 0x9292 => { # SubSecTimeDigitized
511
- Writable => 'string',
512
- ValueConvInv => '$val=~/^(\d+)\s*$/ ? $1 : ($val=~/\.(\d+)/ ? $1 : undef)',
513
- },
514
- 0x935c => { # ImageSourceData
515
- Writable => 'undef',
516
- WriteGroup => 'IFD0',
517
- Protected => 1,
518
- },
519
- # 0x9928 => 'undef', # Opto-ElectricConversionFactor
520
- 0x9c9b => { # XPTitle
521
- Writable => 'int8u',
522
- WriteGroup => 'IFD0',
523
- Notes => q{
524
- tags 0x9c9b-0x9c9f are used by Windows Explorer; special characters
525
- in these values are converted to UTF-8 by default, or Windows Latin1
526
- with the -L option. XPTitle is ignored by Windows Explorer if
527
- ImageDescription exists
528
- },
529
- ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
530
- },
531
- 0x9c9c => { # XPComment
532
- Writable => 'int8u',
533
- WriteGroup => 'IFD0',
534
- ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
535
- },
536
- 0x9c9d => { # XPAuthor
537
- Writable => 'int8u',
538
- WriteGroup => 'IFD0',
539
- Notes => 'ignored by Windows Explorer if Artist exists',
540
- ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
541
- },
542
- 0x9c9e => { # XPKeywords
543
- Writable => 'int8u',
544
- WriteGroup => 'IFD0',
545
- ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
546
- },
547
- 0x9c9f => { # XPSubject
548
- Writable => 'int8u',
549
- WriteGroup => 'IFD0',
550
- ValueConvInv => '$self->Encode($val,"UCS2","II") . "\0\0"',
551
- },
552
- 0xa000 => { # FlashpixVersion
553
- Writable => 'undef',
554
- Mandatory => 1,
555
- PrintConvInv => '$val=~tr/.//d; $val=~/^\d{4}$/ ? $val : undef',
556
- },
557
- 0xa001 => { # ColorSpace
558
- Writable => 'int16u',
559
- Mandatory => 1,
560
- },
561
- 0xa002 => { # ExifImageWidth (could also be int32u)
562
- Writable => 'int16u',
563
- Mandatory => 1,
564
- },
565
- 0xa003 => { # ExifImageHeight (could also be int32u)
566
- Writable => 'int16u',
567
- Mandatory => 1,
568
- },
569
- 0xa004 => 'string', # RelatedSoundFile
570
- 0xa20b => { # FlashEnergy
571
- Writable => 'rational64u',
572
- Count => -1, # 1 or 2 (ref 12)
573
- },
574
- # 0xa20c => 'undef', # SpatialFrequencyResponse
575
- 0xa20e => 'rational64u',# FocalPlaneXResolution
576
- 0xa20f => 'rational64u',# FocalPlaneYResolution
577
- 0xa210 => 'int16u', # FocalPlaneResolutionUnit
578
- 0xa214 => { # SubjectLocation
579
- Writable => 'int16u',
580
- Count => 2,
581
- },
582
- 0xa215 => 'rational64u',# ExposureIndex
583
- 0xa217 => 'int16u', # SensingMethod
584
- 0xa300 => { # FileSource
585
- Writable => 'undef',
586
- ValueConvInv => '($val=~/^\d+$/ and $val < 256) ? chr($val) : $val',
587
- },
588
- 0xa301 => { # SceneType
589
- Writable => 'undef',
590
- ValueConvInv => 'chr($val)',
591
- },
592
- 0xa302 => { # CFAPattern
593
- Writable => 'undef',
594
- RawConvInv => q{
595
- my @a = split ' ', $val;
596
- return $val if @a <= 2; # also accept binary data for backward compatibility
597
- return pack(GetByteOrder() eq 'II' ? 'v2C*' : 'n2C*', @a);
598
- },
599
- PrintConvInv => 'Image::ExifTool::Exif::GetCFAPattern($val)',
600
- },
601
- 0xa401 => 'int16u', # CustomRendered
602
- 0xa402 => 'int16u', # ExposureMode
603
- 0xa403 => 'int16u', # WhiteBalance
604
- 0xa404 => 'rational64u',# DigitalZoomRatio
605
- 0xa405 => { # FocalLengthIn35mmFormat
606
- Writable => 'int16u',
607
- PrintConvInv => '$val=~s/\s*mm$//;$val',
608
- },
609
- 0xa406 => 'int16u', # SceneCaptureType
610
- 0xa407 => 'int16u', # GainControl
611
- 0xa408 => { # Contrast
612
- Writable => 'int16u',
613
- PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
614
- },
615
- 0xa409 => { # Saturation
616
- Writable => 'int16u',
617
- PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
618
- },
619
- 0xa40a => { # Sharpness
620
- Writable => 'int16u',
621
- PrintConvInv => 'Image::ExifTool::Exif::ConvertParameter($val)',
622
- },
623
- # 0xa40b => 'undef', # DeviceSettingDescription
624
- 0xa40c => 'int16u', # SubjectDistanceRange
625
- 0xa420 => 'string', # ImageUniqueID
626
- 0xa430 => 'string', # OwnerName
627
- 0xa431 => 'string', # SerialNumber
628
- 0xa432 => { # LensInfo
629
- Writable => 'rational64u',
630
- Count => 4,
631
- PrintConvInv => \&ConvertLensInfo,
632
- },
633
- 0xa433 => 'string', # LensMake
634
- 0xa434 => 'string', # LensModel
635
- 0xa435 => 'string', # LensSerialNumber
636
- 0xa500 => 'rational64u',# Gamma
637
- #
638
- # DNG stuff (mostly in IFD0, "Raw IFD" in SubIFD)
639
- #
640
- 0xc612 => { # DNGVersion
641
- Writable => 'int8u',
642
- WriteGroup => 'IFD0',
643
- Count => 4,
644
- Protected => 1, # (confuses Apple Preview if written to a TIFF image)
645
- PrintConvInv => '$val =~ tr/./ /; $val',
646
- },
647
- 0xc613 => { # DNGBackwardVersion
648
- Writable => 'int8u',
649
- WriteGroup => 'IFD0',
650
- Count => 4,
651
- Protected => 1,
652
- PrintConvInv => '$val =~ tr/./ /; $val',
653
- },
654
- 0xc614 => { # UniqueCameraModel
655
- Writable => 'string',
656
- WriteGroup => 'IFD0',
657
- },
658
- 0xc615 => { # LocalizedCameraModel
659
- Writable => 'string',
660
- WriteGroup => 'IFD0',
661
- PrintConvInv => '$val',
662
- },
663
- 0xc618 => { # LinearizationTable
664
- Writable => 'int16u',
665
- WriteGroup => 'SubIFD',
666
- Count => -1,
667
- Protected => 1,
668
- },,
669
- 0xc619 => { # BlackLevelRepeatDim
670
- Writable => 'int16u',
671
- WriteGroup => 'SubIFD',
672
- Count => 2,
673
- Protected => 1,
674
- },
675
- 0xc61a => { # BlackLevel
676
- Writable => 'rational64u',
677
- WriteGroup => 'SubIFD',
678
- Count => -1,
679
- Protected => 1,
680
- },
681
- 0xc61b => { # BlackLevelDeltaH
682
- Writable => 'rational64s',
683
- WriteGroup => 'SubIFD',
684
- Count => -1,
685
- Protected => 1,
686
- },
687
- 0xc61c => { # BlackLevelDeltaV
688
- Writable => 'rational64s',
689
- WriteGroup => 'SubIFD',
690
- Count => -1,
691
- Protected => 1,
692
- },
693
- 0xc61d => { # WhiteLevel
694
- Writable => 'int32u',
695
- WriteGroup => 'SubIFD',
696
- Count => -1,
697
- Protected => 1,
698
- },
699
- 0xc61e => { # DefaultScale
700
- Writable => 'rational64u',
701
- WriteGroup => 'SubIFD',
702
- Count => 2,
703
- Protected => 1,
704
- },
705
- 0xc61f => { # DefaultCropOrigin
706
- Writable => 'int32u',
707
- WriteGroup => 'SubIFD',
708
- Count => 2,
709
- Protected => 1,
710
- },
711
- 0xc620 => { # DefaultCropSize
712
- Writable => 'int32u',
713
- WriteGroup => 'SubIFD',
714
- Count => 2,
715
- Protected => 1,
716
- },
717
- 0xc621 => { # ColorMatrix1
718
- Writable => 'rational64s',
719
- WriteGroup => 'IFD0',
720
- Count => -1,
721
- Protected => 1,
722
- },
723
- 0xc622 => { # ColorMatrix2
724
- Writable => 'rational64s',
725
- WriteGroup => 'IFD0',
726
- Count => -1,
727
- Protected => 1,
728
- },
729
- 0xc623 => { # CameraCalibration1
730
- Writable => 'rational64s',
731
- WriteGroup => 'IFD0',
732
- Count => -1,
733
- Protected => 1,
734
- },
735
- 0xc624 => { # CameraCalibration2
736
- Writable => 'rational64s',
737
- WriteGroup => 'IFD0',
738
- Count => -1,
739
- Protected => 1,
740
- },
741
- 0xc625 => { # ReductionMatrix1
742
- Writable => 'rational64s',
743
- WriteGroup => 'IFD0',
744
- Count => -1,
745
- Protected => 1,
746
- },
747
- 0xc626 => { # ReductionMatrix2
748
- Writable => 'rational64s',
749
- WriteGroup => 'IFD0',
750
- Count => -1,
751
- Protected => 1,
752
- },
753
- 0xc627 => { # AnalogBalance
754
- Writable => 'rational64u',
755
- WriteGroup => 'IFD0',
756
- Count => -1,
757
- Protected => 1,
758
- },
759
- 0xc628 => { # AsShotNeutral
760
- Writable => 'rational64u',
761
- WriteGroup => 'IFD0',
762
- Count => -1,
763
- Protected => 1,
764
- },
765
- 0xc629 => { # AsShotWhiteXY
766
- Writable => 'rational64u',
767
- WriteGroup => 'IFD0',
768
- Count => 2,
769
- Protected => 1,
770
- },
771
- 0xc62a => { # BaselineExposure
772
- Writable => 'rational64s',
773
- WriteGroup => 'IFD0',
774
- Protected => 1,
775
- },
776
- 0xc62b => { # BaselineNoise
777
- Writable => 'rational64u',
778
- WriteGroup => 'IFD0',
779
- Protected => 1,
780
- },
781
- 0xc62c => { # BaselineSharpness
782
- Writable => 'rational64u',
783
- WriteGroup => 'IFD0',
784
- Protected => 1,
785
- },
786
- 0xc62d => { # BayerGreenSplit
787
- Writable => 'int32u',
788
- WriteGroup => 'SubIFD',
789
- Protected => 1,
790
- },
791
- 0xc62e => { # LinearResponseLimit
792
- Writable => 'rational64u',
793
- WriteGroup => 'IFD0',
794
- Protected => 1,
795
- },
796
- 0xc62f => { # CameraSerialNumber
797
- Writable => 'string',
798
- WriteGroup => 'IFD0',
799
- },
800
- 0xc630 => { # DNGLensInfo
801
- Writable => 'rational64u',
802
- WriteGroup => 'IFD0',
803
- Count => 4,
804
- PrintConvInv => \&ConvertLensInfo,
805
- },
806
- 0xc631 => { # ChromaBlurRadius
807
- Writable => 'rational64u',
808
- WriteGroup => 'SubIFD',
809
- Protected => 1,
810
- },
811
- 0xc632 => { # AntiAliasStrength
812
- Writable => 'rational64u',
813
- WriteGroup => 'SubIFD',
814
- Protected => 1,
815
- },
816
- 0xc633 => { # ShadowScale
817
- Writable => 'rational64u',
818
- WriteGroup => 'IFD0',
819
- Protected => 1,
820
- },
821
- 0xc635 => { # MakerNoteSafety
822
- Writable => 'int16u',
823
- WriteGroup => 'IFD0',
824
- },
825
- 0xc65a => { # CalibrationIlluminant1
826
- Writable => 'int16u',
827
- WriteGroup => 'IFD0',
828
- Protected => 1,
829
- },
830
- 0xc65b => { # CalibrationIlluminant2
831
- Writable => 'int16u',
832
- WriteGroup => 'IFD0',
833
- Protected => 1,
834
- },
835
- 0xc65c => { # BestQualityScale
836
- Writable => 'rational64u',
837
- WriteGroup => 'SubIFD',
838
- Protected => 1,
839
- },
840
- 0xc65d => { # RawDataUniqueID
841
- Writable => 'int8u',
842
- WriteGroup => 'IFD0',
843
- Count => 16,
844
- Count => 16,
845
- ValueConvInv => 'pack("H*", $val)',
846
- Protected => 1,
847
- },
848
- 0xc68b => { # OriginalRawFileName
849
- Writable => 'string',
850
- WriteGroup => 'IFD0',
851
- Protected => 1,
852
- },
853
- 0xc68d => { # ActiveArea
854
- Writable => 'int32u',
855
- WriteGroup => 'SubIFD',
856
- Count => 4,
857
- Protected => 1,
858
- },
859
- 0xc68e => { # MaskedAreas
860
- Writable => 'int32u',
861
- WriteGroup => 'SubIFD',
862
- Count => 4,
863
- Protected => 1,
864
- },
865
- 0xc68f => { # AsShotICCProfile (writable directory)
866
- WriteGroup => 'IFD0',
867
- Protected => 1,
868
- WriteCheck => q{
869
- require Image::ExifTool::ICC_Profile;
870
- return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
871
- },
872
- },
873
- 0xc690 => { # AsShotPreProfileMatrix
874
- Writable => 'rational64s',
875
- WriteGroup => 'IFD0',
876
- Count => -1,
877
- Protected => 1,
878
- },
879
- 0xc691 => { # CurrentICCProfile (writable directory)
880
- Writable => 'undef',
881
- WriteGroup => 'IFD0',
882
- Protected => 1,
883
- WriteCheck => q{
884
- require Image::ExifTool::ICC_Profile;
885
- return Image::ExifTool::ICC_Profile::ValidateICC(\$val);
886
- },
887
- },
888
- 0xc692 => { # CurrentPreProfileMatrix
889
- Writable => 'rational64s',
890
- WriteGroup => 'IFD0',
891
- Count => -1,
892
- Protected => 1,
893
- },
894
- 0xc6bf => { # ColorimetricReference
895
- Writable => 'int16u',
896
- WriteGroup => 'IFD0',
897
- Protected => 1,
898
- },
899
- 0xc6d2 => { # PanasonicTitle (Panasonic DMC-TZ5, not a DNG tag)
900
- Writable => 'undef',
901
- WriteGroup => 'IFD0',
902
- ValueConvInv => '$self->Encode($val,"UTF8")',
903
- },
904
- 0xc6d3 => { # PanasonicTitle2 (Panasonic DMC-FS7, not a DNG tag)
905
- Writable => 'undef',
906
- WriteGroup => 'IFD0',
907
- ValueConvInv => '$self->Encode($val,"UTF8")',
908
- },
909
- 0xc6f3 => { # CameraCalibrationSig
910
- Writable => 'string',
911
- WriteGroup => 'IFD0',
912
- Protected => 1,
913
- },
914
- 0xc6f4 => { # ProfileCalibrationSig
915
- Writable => 'string',
916
- WriteGroup => 'IFD0',
917
- Protected => 1,
918
- },
919
- 0xc6f6 => { # AsShotProfileName
920
- Writable => 'string',
921
- WriteGroup => 'IFD0',
922
- Protected => 1,
923
- },
924
- 0xc6f7 => { # NoiseReductionApplied
925
- Writable => 'rational64u',
926
- WriteGroup => 'SubIFD',
927
- Protected => 1,
928
- },
929
- 0xc6f8 => { # ProfileName
930
- Writable => 'string',
931
- WriteGroup => 'IFD0',
932
- Protected => 1,
933
- },
934
- 0xc6f9 => { # ProfileHueSatMapDims
935
- Writable => 'int32u',
936
- WriteGroup => 'IFD0',
937
- Count => 3,
938
- Protected => 1,
939
- },
940
- 0xc6fa => { # ProfileHueSatMapData1
941
- Writable => 'float',
942
- WriteGroup => 'IFD0',
943
- Count => -1,
944
- Protected => 1,
945
- },
946
- 0xc6fb => { # ProfileHueSatMapData2
947
- Writable => 'float',
948
- WriteGroup => 'IFD0',
949
- Count => -1,
950
- Protected => 1,
951
- },
952
- 0xc6fc => { # ProfileToneCurve
953
- Writable => 'float',
954
- WriteGroup => 'IFD0',
955
- Count => -1,
956
- Protected => 1,
957
- },
958
- 0xc6fd => { # ProfileEmbedPolicy
959
- Writable => 'int32u',
960
- WriteGroup => 'IFD0',
961
- Protected => 1,
962
- },
963
- 0xc6fe => { # ProfileCopyright
964
- Writable => 'string',
965
- WriteGroup => 'IFD0',
966
- Protected => 1,
967
- },
968
- 0xc714 => { # ForwardMatrix1
969
- Writable => 'rational64s',
970
- WriteGroup => 'IFD0',
971
- Count => -1,
972
- Protected => 1,
973
- },
974
- 0xc715 => { # ForwardMatrix2
975
- Writable => 'rational64s',
976
- WriteGroup => 'IFD0',
977
- Count => -1,
978
- Protected => 1,
979
- },
980
- 0xc716 => { # PreviewApplicationName
981
- Writable => 'string',
982
- WriteGroup => 'IFD0',
983
- Protected => 1,
984
- },
985
- 0xc717 => { # PreviewApplicationVersion
986
- Writable => 'string',
987
- WriteGroup => 'IFD0',
988
- Protected => 1,
989
- },
990
- 0xc718 => { # PreviewSettingsName
991
- Writable => 'string',
992
- WriteGroup => 'IFD0',
993
- Protected => 1,
994
- },
995
- 0xc719 => { # PreviewSettingsDigest
996
- Writable => 'int8u',
997
- WriteGroup => 'IFD0',
998
- Protected => 1,
999
- ValueConvInv => 'pack("H*", $val)',
1000
- },
1001
- 0xc71a => { # PreviewColorSpace
1002
- Writable => 'int32u',
1003
- WriteGroup => 'IFD0',
1004
- Protected => 1,
1005
- PrintConv => {
1006
- 0 => 'Unknown',
1007
- 1 => 'Gray Gamma 2.2',
1008
- 2 => 'sRGB',
1009
- 3 => 'Adobe RGB',
1010
- 4 => 'ProPhoto RGB',
1011
- },
1012
- },
1013
- 0xc71b => { # PreviewDateTime
1014
- Writable => 'string',
1015
- WriteGroup => 'IFD0',
1016
- Protected => 1,
1017
- ValueConvInv => q{
1018
- require Image::ExifTool::XMP;
1019
- return Image::ExifTool::XMP::FormatXMPDate($val);
1020
- },
1021
- PrintConvInv => '$self->InverseDateTime($val,1,1)',
1022
- },
1023
- 0xc71c => { # RawImageDigest
1024
- Writable => 'int8u',
1025
- WriteGroup => 'IFD0',
1026
- Count => 16,
1027
- Protected => 1,
1028
- ValueConvInv => 'pack("H*", $val)',
1029
- },
1030
- 0xc71d => { # OriginalRawFileDigest
1031
- Writable => 'int8u',
1032
- WriteGroup => 'IFD0',
1033
- Count => 16,
1034
- Protected => 1,
1035
- ValueConvInv => 'pack("H*", $val)',
1036
- },
1037
- 0xc725 => { # ProfileLookTableDims
1038
- Writable => 'int32u',
1039
- WriteGroup => 'IFD0',
1040
- Count => 3,
1041
- Protected => 1,
1042
- },
1043
- 0xc726 => { # ProfileLookTableData
1044
- Writable => 'float',
1045
- WriteGroup => 'IFD0',
1046
- Count => -1,
1047
- Protected => 1,
1048
- },
1049
- 0xc761 => { # NoiseProfile
1050
- Writable => 'double',
1051
- WriteGroup => 'SubIFD',
1052
- Count => -1,
1053
- Protected => 1,
1054
- },
1055
- 0xc763 => { # TimeCodes
1056
- Writable => 'int8u',
1057
- WriteGroup => 'IFD0',
1058
- Count => -1, # (8 * number of time codes, max 10)
1059
- ValueConvInv => q{
1060
- my @a = map hex, split /[. ]+/, $val;
1061
- join ' ', @a;
1062
- },
1063
- PrintConvInv => q{
1064
- my @a = split ' ', $val;
1065
- my @v;
1066
- foreach (@a) {
1067
- my @td = reverse split /T/;
1068
- my $tz = 0x39; # default to unknown timezone
1069
- if ($td[0] =~ s/([-+])(\d+):(\d+)$//) {
1070
- if ($3 == 0) {
1071
- $tz = hex(($1 eq '-') ? $2 : 0x26 - $2);
1072
- } elsif ($3 == 30) {
1073
- if ($1 eq '-') {
1074
- $tz = $2 + 0x0a;
1075
- $tz += 0x0a if $tz > 0x0f;
1076
- } else {
1077
- $tz = 0x3f - $2;
1078
- $tz -= 0x0a if $tz < 0x3a;
1079
- }
1080
- } elsif ($3 == 45) {
1081
- $tz = 0x32 if $1 eq '+' and $2 == 12;
1082
- }
1083
- }
1084
- my @t = split /[:.]/, $td[0];
1085
- push @t, '00' while @t < 4;
1086
- my $bg;
1087
- if ($td[1]) {
1088
- # date was specified: fill in date & timezone
1089
- my @d = split /[-]/, $td[1];
1090
- next if @d < 3;
1091
- $bg = sprintf('.%.2d.%.2d.%.2d.%.2x', $d[2], $d[1], $d[0]%100, $tz);
1092
- $t[0] = sprintf('%.2x', hex($t[0]) + 0xc0); # set BGF1+BGF2
1093
- } else { # time only
1094
- $bg = '.00.00.00.00';
1095
- }
1096
- push @v, join('.', reverse(@t[0..3])) . $bg;
1097
- }
1098
- join ' ', @v;
1099
- },
1100
- },
1101
- 0xc764 => { # FrameRate
1102
- Writable => 'rational64s',
1103
- WriteGroup => 'IFD0',
1104
- PrintConvInv => '$val',
1105
- },
1106
- 0xc772 => { # TStop
1107
- Writable => 'rational64u',
1108
- WriteGroup => 'IFD0',
1109
- Count => -1, # (1 or 2)
1110
- PrintConvInv => '$val=~tr/-/ /; $val',
1111
- },
1112
- 0xc789 => { # ReelName
1113
- Writable => 'string',
1114
- WriteGroup => 'IFD0',
1115
- },
1116
- 0xc791 => { # OriginalDefaultFinalSize
1117
- Writable => 'int32u',
1118
- WriteGroup => 'IFD0',
1119
- Count => 2,
1120
- Protected => 1,
1121
- },
1122
- 0xc792 => { # OriginalBestQualitySize
1123
- Writable => 'int32u',
1124
- WriteGroup => 'IFD0',
1125
- Count => 2,
1126
- Protected => 1,
1127
- },
1128
- 0xc793 => { # OriginalDefaultCropSize
1129
- Writable => 'rational64u',
1130
- WriteGroup => 'IFD0',
1131
- Count => 2,
1132
- Protected => 1,
1133
- },
1134
- 0xc7a1 => { # CameraLabel
1135
- Writable => 'string',
1136
- WriteGroup => 'IFD0',
1137
- },
1138
- 0xc7a3 => { # ProfileHueSatMapEncoding
1139
- Writable => 'int32u',
1140
- WriteGroup => 'IFD0',
1141
- Protected => 1,
1142
- },
1143
- 0xc7a4 => { # ProfileLookTableEncoding
1144
- Writable => 'int32u',
1145
- WriteGroup => 'IFD0',
1146
- Protected => 1,
1147
- },
1148
- 0xc7a5 => { # BaselineExposureOffset
1149
- Writable => 'rational64s', # (incorrectly "RATIONAL" in DNG 1.4 spec)
1150
- WriteGroup => 'IFD0',
1151
- Protected => 1,
1152
- },
1153
- 0xc7a6 => { # DefaultBlackRender
1154
- Writable => 'int32u',
1155
- WriteGroup => 'IFD0',
1156
- Protected => 1,
1157
- },
1158
- 0xc7a7 => { # NewRawImageDigest
1159
- Writable => 'int8u',
1160
- WriteGroup => 'IFD0',
1161
- Count => 16,
1162
- Protected => 1,
1163
- ValueConvInv => 'pack("H*", $val)',
1164
- },
1165
- 0xc7a8 => { # RawToPreviewGain
1166
- Writable => 'double',
1167
- WriteGroup => 'IFD0',
1168
- Protected => 1,
1169
- },
1170
- 0xc7b5 => { # DefaultUserCrop
1171
- Writable => 'rational64u',
1172
- WriteGroup => 'SubIFD',
1173
- Count => 4,
1174
- Protected => 1,
1175
- },
1176
- # --- end DNG tags ---
1177
- 0xea1d => { # OffsetSchema
1178
- Writable => 'int32s',
1179
- },
1180
- # tags produced by Photoshop Camera RAW
1181
- # (avoid creating these tags unless there is no other option)
1182
- 0xfde8 => {
1183
- Name => 'OwnerName',
1184
- Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR images)
1185
- Avoid => 1,
1186
- PSRaw => 1,
1187
- Writable => 'string',
1188
- ValueConv => '$val=~s/^.*: //;$val',
1189
- ValueConvInv => q{"Owner's Name: $val"},
1190
- Notes => q{
1191
- tags 0xfde8-0xfdea and 0xfe4c-0xfe58 are generated by Photoshop Camera RAW.
1192
- Some names are the same as other EXIF tags, but ExifTool will avoid writing
1193
- these unless they already exist in the file
1194
- },
1195
- },
1196
- 0xfde9 => {
1197
- Name => 'SerialNumber',
1198
- Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR SubIFD)
1199
- Avoid => 1,
1200
- PSRaw => 1,
1201
- Writable => 'string',
1202
- ValueConv => '$val=~s/^.*: //;$val',
1203
- ValueConvInv => q{"Serial Number: $val"},
1204
- },
1205
- 0xfdea => {
1206
- Name => 'Lens',
1207
- Condition => '$$self{TIFF_TYPE} ne "DCR"', # (used for another purpose in Kodak DCR SubIFD)
1208
- Avoid => 1,
1209
- PSRaw => 1,
1210
- Writable => 'string',
1211
- ValueConv => '$val=~s/^.*: //;$val',
1212
- ValueConvInv => q{"Lens: $val"},
1213
- },
1214
- 0xfe4c => {
1215
- Name => 'RawFile',
1216
- Avoid => 1,
1217
- PSRaw => 1,
1218
- Writable => 'string',
1219
- ValueConv => '$val=~s/^.*: //;$val',
1220
- ValueConvInv => q{"Raw File: $val"},
1221
- },
1222
- 0xfe4d => {
1223
- Name => 'Converter',
1224
- Avoid => 1,
1225
- PSRaw => 1,
1226
- Writable => 'string',
1227
- ValueConv => '$val=~s/^.*: //;$val',
1228
- ValueConvInv => q{"Converter: $val"},
1229
- },
1230
- 0xfe4e => {
1231
- Name => 'WhiteBalance',
1232
- Avoid => 1,
1233
- PSRaw => 1,
1234
- Writable => 'string',
1235
- ValueConv => '$val=~s/^.*: //;$val',
1236
- ValueConvInv => q{"White Balance: $val"},
1237
- },
1238
- 0xfe51 => {
1239
- Name => 'Exposure',
1240
- Avoid => 1,
1241
- PSRaw => 1,
1242
- Writable => 'string',
1243
- ValueConv => '$val=~s/^.*: //;$val',
1244
- ValueConvInv => q{"Exposure: $val"},
1245
- },
1246
- 0xfe52 => {
1247
- Name => 'Shadows',
1248
- Avoid => 1,
1249
- PSRaw => 1,
1250
- Writable => 'string',
1251
- ValueConv => '$val=~s/^.*: //;$val',
1252
- ValueConvInv => q{"Shadows: $val"},
1253
- },
1254
- 0xfe53 => {
1255
- Name => 'Brightness',
1256
- Avoid => 1,
1257
- PSRaw => 1,
1258
- Writable => 'string',
1259
- ValueConv => '$val=~s/^.*: //;$val',
1260
- ValueConvInv => q{"Brightness: $val"},
1261
- },
1262
- 0xfe54 => {
1263
- Name => 'Contrast',
1264
- Avoid => 1,
1265
- PSRaw => 1,
1266
- Writable => 'string',
1267
- ValueConv => '$val=~s/^.*: //;$val',
1268
- ValueConvInv => q{"Contrast: $val"},
1269
- },
1270
- 0xfe55 => {
1271
- Name => 'Saturation',
1272
- Avoid => 1,
1273
- PSRaw => 1,
1274
- Writable => 'string',
1275
- ValueConv => '$val=~s/^.*: //;$val',
1276
- ValueConvInv => q{"Saturation: $val"},
1277
- },
1278
- 0xfe56 => {
1279
- Name => 'Sharpness',
1280
- Avoid => 1,
1281
- PSRaw => 1,
1282
- Writable => 'string',
1283
- ValueConv => '$val=~s/^.*: //;$val',
1284
- ValueConvInv => q{"Sharpness: $val"},
1285
- },
1286
- 0xfe57 => {
1287
- Name => 'Smoothness',
1288
- Avoid => 1,
1289
- PSRaw => 1,
1290
- Writable => 'string',
1291
- ValueConv => '$val=~s/^.*: //;$val',
1292
- ValueConvInv => q{"Smoothness: $val"},
1293
- },
1294
- 0xfe58 => {
1295
- Name => 'MoireFilter',
1296
- Avoid => 1,
1297
- PSRaw => 1,
1298
- Writable => 'string',
1299
- ValueConv => '$val=~s/^.*: //;$val',
1300
- ValueConvInv => q{"Moire Filter: $val"},
1301
- },
1302
- );
1303
-
1304
- # insert our writable properties into main EXIF tag table
1305
- InsertWritableProperties(\%Image::ExifTool::Exif::Main, \%writeTable, \&CheckExif);
1306
-
1307
- #------------------------------------------------------------------------------
1308
- # Inverse print conversion for LensInfo
1309
- # Inputs: 0) lens info string
1310
- # Returns: PrintConvInv of string
1311
- sub ConvertLensInfo($)
1312
- {
1313
- my $val = shift;
1314
- my @a = GetLensInfo($val, 1); # (allow unknown "?" values)
1315
- return @a ? join(' ', @a) : $val;
1316
- }
1317
-
1318
- #------------------------------------------------------------------------------
1319
- # Get binary CFA Pattern from a text string
1320
- # Inputs: Print-converted CFA pattern (eg. '[Blue,Green][Green,Red]')
1321
- # Returns: CFA pattern as a string of numbers
1322
- sub GetCFAPattern($)
1323
- {
1324
- my $val = shift;
1325
- my @rows = split /\]\s*\[/, $val;
1326
- @rows or warn("Rows not properly bracketed by '[]'\n"), return undef;
1327
- my @cols = split /,/, $rows[0];
1328
- @cols or warn("Colors not separated by ','\n"), return undef;
1329
- my $ny = @cols;
1330
- my @a = (scalar(@rows), scalar(@cols));
1331
- my %cfaLookup = (red=>0, green=>1, blue=>2, cyan=>3, magenta=>4, yellow=>5, white=>6);
1332
- my $row;
1333
- foreach $row (@rows) {
1334
- @cols = split /,/, $row;
1335
- @cols == $ny or warn("Inconsistent number of colors in each row\n"), return undef;
1336
- foreach (@cols) {
1337
- tr/ \]\[//d; # remove remaining brackets and any spaces
1338
- my $c = $cfaLookup{lc($_)};
1339
- defined $c or warn("Unknown color '$_'\n"), return undef;
1340
- push @a, $c;
1341
- }
1342
- }
1343
- return "@a";
1344
- }
1345
-
1346
- #------------------------------------------------------------------------------
1347
- # validate raw values for writing
1348
- # Inputs: 0) ExifTool ref, 1) tagInfo hash ref, 2) raw value ref
1349
- # Returns: error string or undef (and possibly changes value) on success
1350
- sub CheckExif($$$)
1351
- {
1352
- my ($et, $tagInfo, $valPtr) = @_;
1353
- my $format = $$tagInfo{Format} || $$tagInfo{Writable} || $$tagInfo{Table}{WRITABLE};
1354
- if (not $format or $format eq '1') {
1355
- if ($$tagInfo{Groups}{0} eq 'MakerNotes') {
1356
- return undef; # OK to have no format for makernotes
1357
- } else {
1358
- return 'No writable format';
1359
- }
1360
- }
1361
- return Image::ExifTool::CheckValue($valPtr, $format, $$tagInfo{Count});
1362
- }
1363
-
1364
- #------------------------------------------------------------------------------
1365
- # encode exif ASCII/Unicode text from UTF8 or Latin
1366
- # Inputs: 0) ExifTool ref, 1) text string
1367
- # Returns: encoded string
1368
- # Note: MUST be called Raw conversion time so the EXIF byte order is known!
1369
- sub EncodeExifText($$)
1370
- {
1371
- my ($et, $val) = @_;
1372
- # does the string contain special characters?
1373
- if ($val =~ /[\x80-\xff]/) {
1374
- my $order = $et->GetNewValues('ExifUnicodeByteOrder');
1375
- return "UNICODE\0" . $et->Encode($val,'UTF16',$order);
1376
- } else {
1377
- return "ASCII\0\0\0$val";
1378
- }
1379
- }
1380
-
1381
- #------------------------------------------------------------------------------
1382
- # insert writable properties into main tag table
1383
- # Inputs: 0) tag table ref, 1) reference to writable properties
1384
- # 2) [optional] CHECK_PROC reference
1385
- sub InsertWritableProperties($$;$)
1386
- {
1387
- my ($tagTablePtr, $writeTablePtr, $checkProc) = @_;
1388
- my $tag;
1389
- $checkProc and $$tagTablePtr{CHECK_PROC} = $checkProc;
1390
- foreach $tag (keys %$writeTablePtr) {
1391
- my $writeInfo = $$writeTablePtr{$tag};
1392
- my @infoList = GetTagInfoList($tagTablePtr, $tag);
1393
- if (@infoList) {
1394
- my $tagInfo;
1395
- foreach $tagInfo (@infoList) {
1396
- if (ref $writeInfo) {
1397
- my $key;
1398
- foreach $key (keys %$writeInfo) {
1399
- $$tagInfo{$key} = $$writeInfo{$key} unless defined $$tagInfo{$key};
1400
- }
1401
- } else {
1402
- $$tagInfo{Writable} = $writeInfo unless defined $$tagInfo{Writable};
1403
- }
1404
- }
1405
- } else {
1406
- AddTagToTable($tagTablePtr, $tag, $writeInfo);
1407
- }
1408
- }
1409
- }
1410
-
1411
- #------------------------------------------------------------------------------
1412
- # rebuild maker notes to properly contain all value data
1413
- # (some manufacturers put value data outside maker notes!!)
1414
- # Inputs: 0) ExifTool object ref, 1) tag table ref, 2) dirInfo ref
1415
- # Returns: new maker note data (and creates MAKER_NOTE_FIXUP), or undef on error
1416
- sub RebuildMakerNotes($$$)
1417
- {
1418
- my ($et, $tagTablePtr, $dirInfo) = @_;
1419
- my $dirStart = $$dirInfo{DirStart};
1420
- my $dirLen = $$dirInfo{DirLen};
1421
- my $dataPt = $$dirInfo{DataPt};
1422
- my $dataPos = $$dirInfo{DataPos} || 0;
1423
- my $rtnValue;
1424
- my %subdirInfo = %$dirInfo;
1425
-
1426
- delete $$et{MAKER_NOTE_FIXUP};
1427
-
1428
- # don't need to rebuild text, BinaryData or PreviewImage maker notes
1429
- my $tagInfo = $$dirInfo{TagInfo};
1430
- my $subdir = $$tagInfo{SubDirectory};
1431
- my $proc = $$subdir{ProcessProc} || $$tagTablePtr{PROCESS_PROC} || \&ProcessExif;
1432
- if (($proc ne \&ProcessExif and $$tagInfo{Name} =~ /Text/) or
1433
- $proc eq \&Image::ExifTool::ProcessBinaryData or
1434
- ($$tagInfo{PossiblePreview} and $dirLen > 6 and
1435
- substr($$dataPt, $dirStart, 3) eq "\xff\xd8\xff"))
1436
- {
1437
- return substr($$dataPt, $dirStart, $dirLen);
1438
- }
1439
- my $saveOrder = GetByteOrder();
1440
- my $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
1441
- if (defined $loc) {
1442
- my $makerFixup = $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
1443
- # create new exiftool object to rewrite the directory without changing it
1444
- my $newTool = new Image::ExifTool;
1445
- $newTool->Options(
1446
- IgnoreMinorErrors => $$et{OPTIONS}{IgnoreMinorErrors},
1447
- FixBase => $$et{OPTIONS}{FixBase},
1448
- );
1449
- $newTool->Init(); # must do this before calling WriteDirectory()!
1450
- # don't copy over preview image
1451
- $newTool->SetNewValue(PreviewImage => '');
1452
- # copy all transient members over in case they are used for writing
1453
- # (Make, Model, etc)
1454
- foreach (grep /[a-z]/, keys %$et) {
1455
- $$newTool{$_} = $$et{$_};
1456
- }
1457
- # fix base offsets if specified
1458
- $newTool->Options(FixBase => $et->Options('FixBase'));
1459
- # set GENERATE_PREVIEW_INFO flag so PREVIEW_INFO will be generated
1460
- $$newTool{GENERATE_PREVIEW_INFO} = 1;
1461
- # drop any large tags
1462
- $$newTool{DROP_TAGS} = 1;
1463
- # initialize other necessary data members
1464
- $$newTool{FILE_TYPE} = $$et{FILE_TYPE};
1465
- $$newTool{TIFF_TYPE} = $$et{TIFF_TYPE};
1466
- # rewrite maker notes
1467
- $rtnValue = $newTool->WriteDirectory(\%subdirInfo, $tagTablePtr);
1468
- if (defined $rtnValue and length $rtnValue) {
1469
- # add the dummy/empty preview image if necessary
1470
- if ($$newTool{PREVIEW_INFO}) {
1471
- $makerFixup->SetMarkerPointers(\$rtnValue, 'PreviewImage', length($rtnValue));
1472
- $rtnValue .= $$newTool{PREVIEW_INFO}{Data};
1473
- delete $$newTool{PREVIEW_INFO};
1474
- }
1475
- # add makernote header
1476
- if ($loc) {
1477
- my $hdr = substr($$dataPt, $dirStart, $loc);
1478
- # special case: convert Pentax/Samsung DNG maker notes to JPEG style
1479
- # (in JPEG, Pentax makernotes are absolute and start with "AOC\0" for some
1480
- # models, but in DNG images they are stored in tag 0xc634 of IFD0 and
1481
- # start with either "PENTAX \0" or "SAMSUNG\0")
1482
- if ($$dirInfo{Parent} eq 'IFD0' and $hdr =~ /^(PENTAX |SAMSUNG)\0/) {
1483
- # convert to JPEG-style AOC maker notes if used by this model
1484
- # (Note: this expression also appears in Exif.pm)
1485
- if ($$et{Model} =~ /\b(K(-[57mrx]|(10|20|100|110|200)D|2000)|GX(10|20))\b/) {
1486
- $hdr =~ s/^(PENTAX |SAMSUNG)\0/AOC\0/;
1487
- # save fixup because AOC maker notes have absolute offsets
1488
- $$et{MAKER_NOTE_FIXUP} = $makerFixup;
1489
- }
1490
- }
1491
- $rtnValue = $hdr . $rtnValue;
1492
- # adjust fixup for shift in start position
1493
- $$makerFixup{Start} += length $hdr;
1494
- }
1495
- # shift offsets according to original position of maker notes,
1496
- # and relative to the makernotes Base
1497
- $$makerFixup{Shift} += $dataPos + $dirStart +
1498
- $$dirInfo{Base} - $subdirInfo{Base};
1499
- # repair incorrect offsets if offsets were fixed
1500
- $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0;
1501
- # fix up pointers to the specified offset
1502
- $makerFixup->ApplyFixup(\$rtnValue);
1503
- # save fixup information unless offsets were relative
1504
- unless ($subdirInfo{Relative}) {
1505
- # set shift so offsets are all relative to start of maker notes
1506
- $$makerFixup{Shift} -= $dataPos + $dirStart;
1507
- $$et{MAKER_NOTE_FIXUP} = $makerFixup; # save fixup for later
1508
- }
1509
- }
1510
- }
1511
- SetByteOrder($saveOrder);
1512
-
1513
- return $rtnValue;
1514
- }
1515
-
1516
- #------------------------------------------------------------------------------
1517
- # Sort IFD directory entries
1518
- # Inputs: 0) data reference, 1) directory start, 2) number of entries,
1519
- # 3) flag to treat 0 as a valid tag ID (as opposed to an empty IFD entry)
1520
- sub SortIFD($$$;$)
1521
- {
1522
- my ($dataPt, $dirStart, $numEntries, $allowZero) = @_;
1523
- my ($index, %entries);
1524
- # split the directory into separate entries
1525
- for ($index=0; $index<$numEntries; ++$index) {
1526
- my $entry = $dirStart + 2 + 12 * $index;
1527
- my $tagID = Get16u($dataPt, $entry);
1528
- my $entryData = substr($$dataPt, $entry, 12);
1529
- # silly software can pad directories with zero entries -- put these at the end
1530
- $tagID = 0x10000 unless $tagID or $index == 0 or $allowZero;
1531
- # add new entry (allow for duplicate tag ID's, which shouldn't normally happen)
1532
- if ($entries{$tagID}) {
1533
- $entries{$tagID} .= $entryData;
1534
- } else {
1535
- $entries{$tagID} = $entryData;
1536
- }
1537
- }
1538
- # sort the directory entries
1539
- my @sortedTags = sort { $a <=> $b } keys %entries;
1540
- # generate the sorted IFD
1541
- my $newDir = '';
1542
- foreach (@sortedTags) {
1543
- $newDir .= $entries{$_};
1544
- }
1545
- # replace original directory with new, sorted one
1546
- substr($$dataPt, $dirStart + 2, 12 * $numEntries) = $newDir;
1547
- }
1548
-
1549
- #------------------------------------------------------------------------------
1550
- # Validate IFD entries (strict validation to test possible chained IFD's)
1551
- # Inputs: 0) dirInfo ref (must have RAF set), 1) optional DirStart
1552
- # Returns: true if IFD looks OK
1553
- sub ValidateIFD($;$)
1554
- {
1555
- my ($dirInfo, $dirStart) = @_;
1556
- my $raf = $$dirInfo{RAF} or return 0;
1557
- my $base = $$dirInfo{Base};
1558
- $dirStart = $$dirInfo{DirStart} || 0 unless defined $dirStart;
1559
- my $offset = $dirStart + ($$dirInfo{DataPos} || 0);
1560
- my ($buff, $index);
1561
- $raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2 or return 0;
1562
- my $numEntries = Get16u(\$buff,0);
1563
- $numEntries > 1 and $numEntries < 64 or return 0;
1564
- my $len = 12 * $numEntries;
1565
- $raf->Read($buff, $len) == $len or return 0;
1566
- my $lastID = -1;
1567
- for ($index=0; $index<$numEntries; ++$index) {
1568
- my $entry = 12 * $index;
1569
- my $tagID = Get16u(\$buff, $entry);
1570
- $tagID > $lastID or $$dirInfo{AllowOutOfOrderTags} or return 0;
1571
- my $format = Get16u(\$buff, $entry+2);
1572
- $format > 0 and $format <= 13 or return 0;
1573
- my $count = Get32u(\$buff, $entry+4);
1574
- $count > 0 or return 0;
1575
- $lastID = $tagID;
1576
- }
1577
- return 1;
1578
- }
1579
-
1580
- #------------------------------------------------------------------------------
1581
- # Get sorted list of offsets used in IFD
1582
- # Inputs: 0) data ref, 1) directory start, 2) dataPos, 3) IFD entries, 4) tag table ref
1583
- # Returns: 0) sorted list of offsets (only offsets after the end of the IFD)
1584
- # 1) hash of list indices keyed by offset value
1585
- # Notes: This is used in a patch to fix the count for tags in Kodak SubIFD3
1586
- sub GetOffList($$$$$)
1587
- {
1588
- my ($dataPt, $dirStart, $dataPos, $numEntries, $tagTablePtr) = @_;
1589
- my $ifdEnd = $dirStart + 2 + 12 * $numEntries + $dataPos;
1590
- my ($index, $offset, %offHash);
1591
- for ($index=0; $index<$numEntries; ++$index) {
1592
- my $entry = $dirStart + 2 + 12 * $index;
1593
- my $format = Get16u($dataPt, $entry + 2);
1594
- next if $format < 1 or $format > 13;
1595
- my $count = Get16u($dataPt, $entry + 4);
1596
- my $size = $formatSize[$format] * $count;
1597
- if ($size <= 4) {
1598
- my $tagID = Get16u($dataPt, $entry);
1599
- next unless ref $$tagTablePtr{$tagID} eq 'HASH' and $$tagTablePtr{$tagID}{FixCount};
1600
- }
1601
- my $offset = Get16u($dataPt, $entry + 8);
1602
- $offHash{$offset} = 1 if $offset >= $ifdEnd;
1603
- }
1604
- # set offset hash values to indices in list
1605
- my @offList = sort keys %offHash;
1606
- $index = 0;
1607
- foreach $offset (@offList) {
1608
- $offHash{$offset} = $index++;
1609
- }
1610
- return(\@offList, \%offHash);
1611
- }
1612
-
1613
- #------------------------------------------------------------------------------
1614
- # Update TIFF_END member if defined
1615
- # Inputs: 0) ExifTool ref, 1) end of valid TIFF data
1616
- sub UpdateTiffEnd($$)
1617
- {
1618
- my ($et, $end) = @_;
1619
- if (defined $$et{TIFF_END} and
1620
- $$et{TIFF_END} < $end)
1621
- {
1622
- $$et{TIFF_END} = $end;
1623
- }
1624
- }
1625
-
1626
- #------------------------------------------------------------------------------
1627
- # Handle error while writing EXIF
1628
- # Inputs: 0) ExifTool ref, 1) error string, 2) tag table ref
1629
- # Returns: undef on fatal error, or '' if minor error is ignored
1630
- sub ExifErr($$$)
1631
- {
1632
- my ($et, $errStr, $tagTablePtr) = @_;
1633
- # MakerNote errors are minor by default
1634
- my $minor = ($$tagTablePtr{GROUPS}{0} eq 'MakerNotes');
1635
- if ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{MINOR_ERRORS}) {
1636
- $et->Warn("$errStr. IFD dropped.") and return '' if $minor;
1637
- $minor = 1;
1638
- }
1639
- return undef if $et->Error($errStr, $minor);
1640
- return '';
1641
- }
1642
-
1643
- #------------------------------------------------------------------------------
1644
- # Read/Write IFD with TIFF-like header (used by DNG 1.2)
1645
- # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
1646
- # Returns: Reading: 1 on success, otherwise returns 0 and sets a Warning
1647
- # Writing: new data block or undef on error
1648
- sub ProcessTiffIFD($$$)
1649
- {
1650
- my ($et, $dirInfo, $tagTablePtr) = @_;
1651
- $et or return 1; # allow dummy access
1652
- my $raf = $$dirInfo{RAF};
1653
- my $base = $$dirInfo{Base} || 0;
1654
- my $dirName = $$dirInfo{DirName};
1655
- my $magic = $$dirInfo{Subdir}{Magic} || 0x002a;
1656
- my $buff;
1657
-
1658
- # structured with a TIFF-like header and relative offsets
1659
- $raf->Seek($base, 0) and $raf->Read($buff, 8) == 8 or return 0;
1660
- unless (SetByteOrder(substr($buff,0,2)) and Get16u(\$buff, 2) == $magic) {
1661
- my $msg = "Invalid $dirName header";
1662
- if ($$dirInfo{IsWriting}) {
1663
- $et->Error($msg);
1664
- return undef;
1665
- } else {
1666
- $et->Warn($msg);
1667
- return 0;
1668
- }
1669
- }
1670
- my $offset = Get32u(\$buff, 4);
1671
- my %dirInfo = (
1672
- DirName => $$dirInfo{DirName},
1673
- Parent => $$dirInfo{Parent},
1674
- Base => $base,
1675
- DataPt => \$buff,
1676
- DataLen => length $buff,
1677
- DataPos => 0,
1678
- DirStart => $offset,
1679
- DirLen => length($buff) - $offset,
1680
- RAF => $raf,
1681
- NewDataPos => 8,
1682
- );
1683
- if ($$dirInfo{IsWriting}) {
1684
- # rewrite the Camera Profile IFD
1685
- my $newDir = WriteExif($et, \%dirInfo, $tagTablePtr);
1686
- # don't add header if error writing directory ($newDir is undef)
1687
- # or if directory is being deleted ($newDir is empty)
1688
- return $newDir unless $newDir;
1689
- # return directory with TIFF-like header
1690
- return GetByteOrder() . Set16u($magic) . Set32u(8) . $newDir;
1691
- }
1692
- if ($$et{HTML_DUMP}) {
1693
- my $tip = sprintf("Byte order: %s endian\nIdentifier: 0x%.4x\n%s offset: 0x%.4x",
1694
- (GetByteOrder() eq 'II') ? 'Little' : 'Big', $magic, $dirName, $offset);
1695
- $et->HDump($base, 8, "$dirName header", $tip, 0);
1696
- }
1697
- return ProcessExif($et, \%dirInfo, $tagTablePtr);
1698
- }
1699
-
1700
- #------------------------------------------------------------------------------
1701
- # Write EXIF directory
1702
- # Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
1703
- # Returns: Exif data block (may be empty if no Exif data) or undef on error
1704
- # Notes: Increments ExifTool CHANGED flag for each tag changed. Also updates
1705
- # TIFF_END if defined with location of end of original TIFF image.
1706
- # Returns IFD data in the following order:
1707
- # 1. IFD0 directory followed by its data
1708
- # 2. SubIFD directory followed by its data, thumbnail and image
1709
- # 3. GlobalParameters, EXIF, GPS, Interop IFD's each with their data
1710
- # 4. IFD1,IFD2,... directories each followed by their data
1711
- # 5. Thumbnail and/or image data for each IFD, with IFD0 image last
1712
- sub WriteExif($$$)
1713
- {
1714
- my ($et, $dirInfo, $tagTablePtr) = @_;
1715
- $et or return 1; # allow dummy access to autoload this package
1716
- my $origDirInfo = $dirInfo; # save original dirInfo
1717
- my $dataPt = $$dirInfo{DataPt};
1718
- unless ($dataPt) {
1719
- my $emptyData = '';
1720
- $dataPt = \$emptyData;
1721
- }
1722
- my $dataPos = $$dirInfo{DataPos} || 0;
1723
- my $dirStart = $$dirInfo{DirStart} || 0;
1724
- my $dataLen = $$dirInfo{DataLen} || length($$dataPt);
1725
- my $dirLen = $$dirInfo{DirLen} || ($dataLen - $dirStart);
1726
- my $base = $$dirInfo{Base} || 0;
1727
- my $firstBase = $base;
1728
- my $raf = $$dirInfo{RAF};
1729
- my $dirName = $$dirInfo{DirName} || 'unknown';
1730
- my $fixup = $$dirInfo{Fixup} || new Image::ExifTool::Fixup;
1731
- my $imageDataFlag = $$dirInfo{ImageData} || '';
1732
- my $verbose = $et->Options('Verbose');
1733
- my $out = $et->Options('TextOut');
1734
- my ($nextIfdPos, %offsetData, $inMakerNotes);
1735
- my (@offsetInfo, %xDelete, $strEnc);
1736
- my $deleteAll = 0;
1737
- my $newData = ''; # initialize buffer to receive new directory data
1738
- my @imageData; # image data blocks to copy later if requested
1739
- my $name = $$dirInfo{Name};
1740
- $name = $dirName unless $name and $dirName eq 'MakerNotes' and $name !~ /^MakerNote/;
1741
-
1742
- # set encoding for strings
1743
- $strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
1744
-
1745
- # allow multiple IFD's in IFD0-IFD1-IFD2... chain
1746
- $$dirInfo{Multi} = 1 if $dirName =~ /^(IFD0|SubIFD)$/ and not defined $$dirInfo{Multi};
1747
- $inMakerNotes = 1 if $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
1748
- my $ifd;
1749
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1750
- # loop through each IFD
1751
- #
1752
- for ($ifd=0; ; ++$ifd) { # loop through multiple IFD's
1753
-
1754
- # save pointer to start of this IFD within the newData
1755
- my $newStart = length($newData);
1756
- my @subdirs; # list of subdirectory data and tag table pointers
1757
- # determine if directory is contained within our data
1758
- my $mustRead;
1759
- if ($dirStart < 0 or $dirStart > $dataLen-2) {
1760
- $mustRead = 1;
1761
- } elsif ($dirLen > 2) {
1762
- my $len = 2 + 12 * Get16u($dataPt, $dirStart);
1763
- $mustRead = 1 if $dirStart + $len > $dataLen;
1764
- }
1765
- # read IFD from file if necessary
1766
- if ($mustRead) {
1767
- if ($raf) {
1768
- # read the count of entries in this IFD
1769
- my $offset = $dirStart + $dataPos;
1770
- my ($buff, $buf2);
1771
- unless ($raf->Seek($offset + $base, 0) and $raf->Read($buff,2) == 2) {
1772
- return ExifErr($et, "Bad IFD or truncated file in $name", $tagTablePtr);
1773
- }
1774
- my $len = 12 * Get16u(\$buff,0);
1775
- # (also read next IFD pointer if available)
1776
- unless ($raf->Read($buf2, $len+4) >= $len) {
1777
- return ExifErr($et, "Error reading $name", $tagTablePtr);
1778
- }
1779
- $buff .= $buf2;
1780
- # make copy of dirInfo since we're going to modify it
1781
- my %newDirInfo = %$dirInfo;
1782
- $dirInfo = \%newDirInfo;
1783
- # update directory parameters for the newly loaded IFD
1784
- $dataPt = $$dirInfo{DataPt} = \$buff;
1785
- $dirStart = $$dirInfo{DirStart} = 0;
1786
- $dataPos = $$dirInfo{DataPos} = $offset;
1787
- $dataLen = $$dirInfo{DataLen} = length $buff;
1788
- $dirLen = $$dirInfo{DirLen} = $dataLen;
1789
- # only account for nextIFD pointer if we are going to use it
1790
- $len += 4 if $dataLen==$len+6 and ($$dirInfo{Multi} or $buff =~ /\0{4}$/);
1791
- UpdateTiffEnd($et, $offset+$base+2+$len);
1792
- } elsif ($dirLen) {
1793
- # error if we can't load IFD (unless we are creating
1794
- # from scratch, in which case dirLen will be zero)
1795
- my $str = $et->Options('IgnoreMinorErrors') ? 'Deleted bad' : 'Bad';
1796
- $et->Error("$str $name directory", 1);
1797
- }
1798
- }
1799
- my ($index, $dirEnd, $numEntries);
1800
- if ($dirStart + 4 < $dataLen) {
1801
- $numEntries = Get16u($dataPt, $dirStart);
1802
- $dirEnd = $dirStart + 2 + 12 * $numEntries;
1803
- if ($dirEnd > $dataLen) {
1804
- return ExifErr($et, "Truncated $name directory", $tagTablePtr);
1805
- }
1806
- # sort entries if necessary (but not in maker notes IFDs)
1807
- unless ($inMakerNotes) {
1808
- my $lastID = -1;
1809
- for ($index=0; $index<$numEntries; ++$index) {
1810
- my $tagID = Get16u($dataPt, $dirStart + 2 + 12 * $index);
1811
- # check for proper sequence (but ignore null entries at end)
1812
- if ($tagID < $lastID and ($tagID or $$tagTablePtr{0})) {
1813
- SortIFD($dataPt, $dirStart, $numEntries, $$tagTablePtr{0});
1814
- $et->Warn("Entries in $name were out of sequence. Fixed.",1);
1815
- last;
1816
- }
1817
- $lastID = $tagID;
1818
- }
1819
- }
1820
- } else {
1821
- $numEntries = 0;
1822
- $dirEnd = $dirStart;
1823
- }
1824
-
1825
- # loop through new values and accumulate all information for this IFD
1826
- my (%set, %mayDelete, $tagInfo);
1827
- my $wrongDir = $crossDelete{$dirName};
1828
- foreach $tagInfo ($et->GetNewTagInfoList($tagTablePtr)) {
1829
- my $tagID = $$tagInfo{TagID};
1830
- # evaluate conditional lists now if necessary
1831
- if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
1832
- my $curInfo = $et->GetTagInfo($tagTablePtr, $tagID);
1833
- if (defined $curInfo and not $curInfo) {
1834
- # need value to evaluate the condition
1835
- my ($val) = $et->GetNewValues($tagInfo);
1836
- # must convert to binary for evaluating in Condition
1837
- if ($$tagInfo{Format} and defined $val) {
1838
- $val = WriteValue($val, $$tagInfo{Format}, $$tagInfo{Count});
1839
- }
1840
- if (defined $val) {
1841
- my $fmt = $$tagInfo{Writable} || $$tagInfo{Format} || 'undef';
1842
- my $cnt = $$tagInfo{Count} || 1;
1843
- # always use old format/count for Condition in maker notes
1844
- if ($inMakerNotes) {
1845
- for ($index=0; $index<$numEntries; ++$index) {
1846
- my $entry = $dirStart + 2 + 12 * $index;
1847
- my $id = Get16u($dataPt, $entry);
1848
- if ($id eq $tagID) {
1849
- my $f = Get16u($dataPt, $entry + 2);
1850
- if ($formatName[$f]) {
1851
- $fmt = $formatName[$f];
1852
- $cnt = Get32u($dataPt, $entry + 4);
1853
- }
1854
- last;
1855
- }
1856
- }
1857
- }
1858
- $curInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$val, $fmt, $cnt);
1859
- } else {
1860
- # may want to delete this, but we need to see the value first
1861
- $mayDelete{$tagID} = 1;
1862
- }
1863
- }
1864
- # don't set this tag unless valid for the current condition
1865
- next unless defined $curInfo and $curInfo eq $tagInfo;
1866
- }
1867
- if ($$tagInfo{WriteCondition}) {
1868
- my $self = $et; # set $self to be used in eval
1869
- #### eval WriteCondition ($self)
1870
- unless (eval $$tagInfo{WriteCondition}) {
1871
- $@ and warn $@;
1872
- next;
1873
- }
1874
- }
1875
- my $nvHash = $et->GetNewValueHash($tagInfo, $dirName);
1876
- unless ($nvHash) {
1877
- next unless $wrongDir;
1878
- # delete stuff from the wrong directory if setting somewhere else
1879
- $nvHash = $et->GetNewValueHash($tagInfo, $wrongDir);
1880
- # don't cross delete if not overwriting
1881
- next unless $et->IsOverwriting($nvHash);
1882
- # don't cross delete if specifically deleting from the other directory
1883
- # (Note: don't call GetValue() here because it shouldn't be called
1884
- # if IsOverwriting returns < 0 -- eg. when shifting)
1885
- next if not defined $$nvHash{Value} and $$nvHash{WantGroup} and
1886
- lc($$nvHash{WantGroup}) eq lc($wrongDir);
1887
- # remove this tag if found in this IFD
1888
- $xDelete{$tagID} = 1;
1889
- }
1890
- if ($set{$tagID}) {
1891
- # this tag is being set twice, which can happen if two Condition's
1892
- # were true for this tag. Hopefully the only case where this can
1893
- # happen is the MakerNotes tag since it may store two very different
1894
- # types of information (MakerNotes and PreviewImage), but we want
1895
- # to store the MakerNotes if both are available
1896
- if ($tagID == 0x927c and $dirName =~ /^(ExifIFD|IFD0)$/) {
1897
- next if $$tagInfo{Name} eq 'PreviewImage';
1898
- } else {
1899
- $et->Warn(sprintf("Multiple new values for $name tag 0x%.4x",$tagID));
1900
- }
1901
- }
1902
- $set{$tagID} = $tagInfo;
1903
- }
1904
-
1905
- # fix base offsets (some cameras incorrectly write maker notes in IFD0)
1906
- if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/ and
1907
- $$et{TIFF_TYPE} !~ /^(ARW|SR2)$/ and not $$et{LeicaTrailerPos} and
1908
- Image::ExifTool::MakerNotes::FixBase($et, $dirInfo))
1909
- {
1910
- # update local variables from fixed values
1911
- $base = $$dirInfo{Base};
1912
- $dataPos = $$dirInfo{DataPos};
1913
- }
1914
-
1915
- # initialize variables to handle mandatory tags
1916
- my $mandatory = $mandatory{$dirName};
1917
- my ($allMandatory, $addMandatory);
1918
- if ($mandatory) {
1919
- # use X/Y resolution values from JFIF if available
1920
- if ($dirName eq 'IFD0' and defined $$et{JFIFYResolution}) {
1921
- my %ifd0Vals = %$mandatory;
1922
- $ifd0Vals{0x011a} = $$et{JFIFXResolution};
1923
- $ifd0Vals{0x011b} = $$et{JFIFYResolution};
1924
- $ifd0Vals{0x0128} = $$et{JFIFResolutionUnit} + 1;
1925
- $mandatory = \%ifd0Vals;
1926
- }
1927
- $allMandatory = $addMandatory = 0; # initialize to zero
1928
- # add mandatory tags if creating a new directory
1929
- unless ($numEntries) {
1930
- foreach (keys %$mandatory) {
1931
- $set{$_} or $set{$_} = $$tagTablePtr{$_};
1932
- }
1933
- }
1934
- } else {
1935
- undef $deleteAll; # don't remove directory (no mandatory entries)
1936
- }
1937
- my ($addDirs, @newTags);
1938
- if ($inMakerNotes) {
1939
- $addDirs = { }; # can't currently add new directories in MakerNotes
1940
- # allow non-permanent makernotes tags to be added
1941
- # (note: we may get into trouble if there are too many of these
1942
- # because we allow out-of-order tags in MakerNote IFD's but our
1943
- # logic to add new tags relies on ordered entries)
1944
- foreach (keys %set) {
1945
- my $perm = $set{$_}{Permanent};
1946
- push @newTags, $_ if defined $perm and not $perm;
1947
- }
1948
- @newTags = sort { $a <=> $b } @newTags if @newTags > 1;
1949
- } else {
1950
- # get a hash of directories we will be writing in this one
1951
- $addDirs = $et->GetAddDirHash($tagTablePtr, $dirName);
1952
- # make a union of tags & dirs (can set whole dirs, like MakerNotes)
1953
- my %allTags = ( %set, %$addDirs );
1954
- # make sorted list of new tags to be added
1955
- @newTags = sort { $a <=> $b } keys(%allTags);
1956
- }
1957
- my $dirBuff = ''; # buffer for directory data
1958
- my $valBuff = ''; # buffer for value data
1959
- my @valFixups; # list of fixups for offsets in valBuff
1960
- # fixup for offsets in dirBuff
1961
- my $dirFixup = new Image::ExifTool::Fixup;
1962
- my $entryBasedFixup;
1963
- my $lastTagID = -1;
1964
- my ($oldInfo, $oldFormat, $oldFormName, $oldCount, $oldSize, $oldValue, $oldImageData);
1965
- my ($readFormat, $readFormName, $readCount); # format for reading old value(s)
1966
- my ($entry, $valueDataPt, $valueDataPos, $valueDataLen, $valuePtr, $valEnd);
1967
- my ($offList, $offHash, $ignoreCount, $fixCount);
1968
- my $oldID = -1;
1969
- my $newID = -1;
1970
-
1971
- # patch for Canon EOS 40D firmware 1.0.4 bug (incorrect directory counts)
1972
- if ($inMakerNotes and $$et{Model} eq 'Canon EOS 40D') {
1973
- my $fmt = Get16u($dataPt, $dirStart + 2 + 12 * ($numEntries - 1) + 2);
1974
- if ($fmt < 1 or $fmt > 13) {
1975
- # adjust the number of directory entries
1976
- --$numEntries;
1977
- $dirEnd -= 12;
1978
- $ignoreCount = 1;
1979
- }
1980
- }
1981
- #..............................................................................
1982
- # loop through entries in new directory
1983
- #
1984
- $index = 0;
1985
- Entry: for (;;) {
1986
-
1987
- if (defined $oldID and $oldID == $newID) {
1988
- #
1989
- # read next entry from existing directory
1990
- #
1991
- if ($index < $numEntries) {
1992
- $entry = $dirStart + 2 + 12 * $index;
1993
- $oldID = Get16u($dataPt, $entry);
1994
- $readFormat = $oldFormat = Get16u($dataPt, $entry+2);
1995
- $readCount = $oldCount = Get32u($dataPt, $entry+4);
1996
- undef $oldImageData;
1997
- if ($oldFormat < 1 or $oldFormat > 13) {
1998
- my $msg = "Bad format ($oldFormat) for $name entry $index";
1999
- # patch to preserve invalid directory entries in SubIFD3 of
2000
- # various Kodak Z-series cameras (Z812, Z1085IS, Z1275)
2001
- # and some Sony cameras such as the DSC-P10
2002
- if ($dirName eq 'MakerNotes' and (($$et{Make}=~/KODAK/i and
2003
- $$dirInfo{Name} and $$dirInfo{Name} eq 'SubIFD3') or
2004
- ($numEntries == 12 and $$et{Make} eq 'SONY' and $index >= 8)))
2005
- {
2006
- $dirBuff .= substr($$dataPt, $entry, 12);
2007
- ++$index;
2008
- $newID = $oldID; # we wrote this
2009
- $et->Warn($msg, 1);
2010
- next;
2011
- }
2012
- # don't write out null directory entry
2013
- if ($oldFormat==0 and $index and $oldCount==0) {
2014
- $ignoreCount = ($ignoreCount || 0) + 1;
2015
- # must keep same directory size to avoid messing up our fixed offsets
2016
- $dirBuff .= ("\0" x 12) if $$dirInfo{FixBase};
2017
- ++$index;
2018
- $newID = $oldID; # pretend we wrote this
2019
- next;
2020
- }
2021
- return ExifErr($et, $msg, $tagTablePtr);
2022
- }
2023
- $readFormName = $oldFormName = $formatName[$oldFormat];
2024
- $valueDataPt = $dataPt;
2025
- $valueDataPos = $dataPos;
2026
- $valueDataLen = $dataLen;
2027
- $valuePtr = $entry + 8;
2028
- # try direct method first for speed
2029
- $oldInfo = $$tagTablePtr{$oldID};
2030
- if (ref $oldInfo ne 'HASH' or $$oldInfo{Condition}) {
2031
- # must get unknown tags too
2032
- # (necessary so we don't miss a tag we want to Drop)
2033
- my $unk = $et->Options(Unknown => 1);
2034
- $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID);
2035
- $et->Options(Unknown => $unk);
2036
- }
2037
- # patch incorrect count in Kodak SubIFD3 tags
2038
- if ($oldCount < 2 and $oldInfo and $$oldInfo{FixCount}) {
2039
- $offList or ($offList, $offHash) = GetOffList($dataPt, $dirStart, $dataPos,
2040
- $numEntries, $tagTablePtr);
2041
- my $i = $$offHash{Get32u($dataPt, $valuePtr)};
2042
- if (defined $i and $i < $#$offList) {
2043
- $oldCount = int(($$offList[$i+1] - $$offList[$i]) / $formatSize[$oldFormat]);
2044
- $fixCount = ($fixCount || 0) + 1 if $oldCount != $readCount;
2045
- }
2046
- }
2047
- $oldSize = $oldCount * $formatSize[$oldFormat];
2048
- my $readFromFile;
2049
- if ($oldSize > 4) {
2050
- $valuePtr = Get32u($dataPt, $valuePtr);
2051
- # fix valuePtr if necessary
2052
- if ($$dirInfo{FixOffsets}) {
2053
- $valEnd or $valEnd = $dataPos + $dirStart + 2 + 12 * $numEntries + 4;
2054
- my ($tagID, $size, $wFlag) = ($oldID, $oldSize, 1);
2055
- #### eval FixOffsets ($valuePtr, $valEnd, $size, $tagID, $wFlag)
2056
- eval $$dirInfo{FixOffsets};
2057
- unless (defined $valuePtr) {
2058
- unless ($$et{DROP_TAGS}) {
2059
- my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf("tag 0x%.4x",$oldID);
2060
- return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes);
2061
- }
2062
- ++$index; $oldID = $newID; next; # drop this tag
2063
- }
2064
- }
2065
- # offset shouldn't point into TIFF or IFD header
2066
- my $suspect = ($valuePtr < 8);
2067
- # convert offset to pointer in $$dataPt
2068
- if ($$dirInfo{EntryBased} or (ref $$tagTablePtr{$oldID} eq 'HASH' and
2069
- $$tagTablePtr{$oldID}{EntryBased}))
2070
- {
2071
- $valuePtr += $entry;
2072
- } else {
2073
- $valuePtr -= $dataPos;
2074
- }
2075
- # value shouldn't overlap our directory
2076
- $suspect = 1 if $valuePtr < $dirEnd and $valuePtr+$oldSize > $dirStart;
2077
- # get value by seeking in file if we are allowed
2078
- if ($valuePtr < 0 or $valuePtr+$oldSize > $dataLen) {
2079
- my ($pos, $tagStr, $invalidPreview, $tmpInfo, $leicaTrailer);
2080
- if ($oldInfo) {
2081
- $tagStr = $$oldInfo{Name};
2082
- $leicaTrailer = $$oldInfo{LeicaTrailer};
2083
- } elsif (defined $oldInfo) {
2084
- $tmpInfo = $et->GetTagInfo($tagTablePtr, $oldID, \ '', $oldFormName, $oldCount);
2085
- if ($tmpInfo) {
2086
- $tagStr = $$tmpInfo{Name};
2087
- $leicaTrailer = $$tmpInfo{LeicaTrailer};
2088
- }
2089
- }
2090
- $tagStr or $tagStr = sprintf("tag 0x%.4x",$oldID);
2091
- # allow PreviewImage to run outside EXIF segment in JPEG images
2092
- if (not $raf) {
2093
- if ($tagStr eq 'PreviewImage') {
2094
- $raf = $$et{RAF};
2095
- if ($raf) {
2096
- $pos = $raf->Tell();
2097
- if ($oldInfo and $$oldInfo{ChangeBase}) {
2098
- # adjust base offset for this tag only
2099
- #### eval ChangeBase ($dirStart,$dataPos)
2100
- my $newBase = eval $$oldInfo{ChangeBase};
2101
- $valuePtr += $newBase;
2102
- }
2103
- } else {
2104
- $invalidPreview = 1;
2105
- }
2106
- } elsif ($leicaTrailer) {
2107
- # save information about Leica makernote trailer
2108
- $$et{LeicaTrailer} = {
2109
- TagInfo => $oldInfo || $tmpInfo,
2110
- Offset => $base + $valuePtr + $dataPos,
2111
- Size => $oldSize,
2112
- Fixup => new Image::ExifTool::Fixup,
2113
- },
2114
- $invalidPreview = 2;
2115
- # remove SubDirectory to prevent processing (for now)
2116
- my %copy = %{$oldInfo || $tmpInfo};
2117
- delete $copy{SubDirectory};
2118
- delete $copy{MakerNotes};
2119
- $oldInfo = \%copy;
2120
- }
2121
- }
2122
- if ($oldSize > BINARY_DATA_LIMIT and $$origDirInfo{ImageData} and
2123
- (not defined $oldInfo or ($oldInfo and not $$oldInfo{SubDirectory})))
2124
- {
2125
- # copy huge data blocks later instead of loading into memory
2126
- $oldValue = ''; # dummy empty value
2127
- # copy this value later unless writing a new value
2128
- unless ($set{$oldID}) {
2129
- my $pad = $oldSize & 0x01 ? 1 : 0;
2130
- # save block information to copy later (set directory offset later)
2131
- $oldImageData = [$base+$valuePtr+$dataPos, $oldSize, $pad];
2132
- }
2133
- } elsif ($raf) {
2134
- my $success = ($raf->Seek($base+$valuePtr+$dataPos, 0) and
2135
- $raf->Read($oldValue, $oldSize) == $oldSize);
2136
- if (defined $pos) {
2137
- $raf->Seek($pos, 0);
2138
- undef $raf;
2139
- # (sony A700 has 32-byte header on PreviewImage)
2140
- unless ($success and $oldValue =~ /^(\xff\xd8\xff|(.|.{33})\xd8\xff\xdb)/s) {
2141
- $invalidPreview = 1;
2142
- $success = 1; # continue writing directory anyway
2143
- }
2144
- }
2145
- unless ($success) {
2146
- return undef if $et->Error("Error reading value for $name entry $index", $inMakerNotes);
2147
- ++$index; $oldID = $newID; next; # drop this tag
2148
- }
2149
- } elsif (not $invalidPreview) {
2150
- return undef if $et->Error("Bad $name offset for $tagStr", $inMakerNotes);
2151
- ++$index; $oldID = $newID; next; # drop this tag
2152
- }
2153
- if ($invalidPreview) {
2154
- # set value for invalid preview
2155
- if ($$et{FILE_TYPE} eq 'JPEG') {
2156
- # define dummy value for preview (or Leica MakerNote) to write later
2157
- # (value must be larger than 4 bytes to generate PREVIEW_INFO,
2158
- # and an even number of bytes so it won't be padded)
2159
- $oldValue = 'LOAD_PREVIEW';
2160
- } else {
2161
- $oldValue = 'none';
2162
- $oldSize = length $oldValue;
2163
- }
2164
- $valuePtr = 0;
2165
- } else {
2166
- UpdateTiffEnd($et, $base+$valuePtr+$dataPos+$oldSize);
2167
- }
2168
- # update pointers for value just read from file
2169
- $valueDataPt = \$oldValue;
2170
- $valueDataPos = $valuePtr + $dataPos;
2171
- $valueDataLen = $oldSize;
2172
- $valuePtr = 0;
2173
- $readFromFile = 1;
2174
- }
2175
- if ($suspect) {
2176
- my $tagStr = $oldInfo ? $$oldInfo{Name} : sprintf('tag 0x%.4x', $oldID);
2177
- my $str = "Suspicious $name offset for $tagStr";
2178
- if ($inMakerNotes) {
2179
- $et->Warn($str, 1);
2180
- } else {
2181
- return undef if $et->Error($str, 1);
2182
- }
2183
- }
2184
- }
2185
- # read value if we haven't already
2186
- $oldValue = substr($$valueDataPt, $valuePtr, $oldSize) unless $readFromFile;
2187
- # get tagInfo using value if necessary
2188
- if (defined $oldInfo and not $oldInfo) {
2189
- my $unk = $et->Options(Unknown => 1);
2190
- $oldInfo = $et->GetTagInfo($tagTablePtr, $oldID, \$oldValue, $oldFormName, $oldCount);
2191
- $et->Options(Unknown => $unk);
2192
- # now that we have the value, we can resolve the Condition to finally
2193
- # determine whether we want to delete this tag or not
2194
- if ($mayDelete{$oldID} and $oldInfo and (not @newTags or $newTags[0] != $oldID)) {
2195
- my $nvHash = $et->GetNewValueHash($oldInfo, $dirName);
2196
- if (not $nvHash and $wrongDir) {
2197
- # delete from wrong directory if necessary
2198
- $nvHash = $et->GetNewValueHash($oldInfo, $wrongDir);
2199
- $nvHash and $xDelete{$oldID} = 1;
2200
- }
2201
- if ($nvHash) {
2202
- # we want to delete this tag after all, so insert it into our list
2203
- $set{$oldID} = $oldInfo;
2204
- unshift @newTags, $oldID;
2205
- }
2206
- }
2207
- }
2208
- # make sure we are handling the 'ifd' format properly
2209
- if (($oldFormat == 13 or $oldFormat == 18) and
2210
- (not $oldInfo or not $$oldInfo{SubIFD}))
2211
- {
2212
- my $str = sprintf('%s tag 0x%.4x IFD format not handled', $name, $oldID);
2213
- $et->Error($str, $inMakerNotes);
2214
- }
2215
- # override format we use to read the value if specified
2216
- if ($oldInfo) {
2217
- # check for tags which must be integers
2218
- if (($$oldInfo{IsOffset} or $$oldInfo{SubIFD}) and
2219
- not $intFormat{$oldFormName})
2220
- {
2221
- $et->Error("Invalid format ($oldFormName) for $name $$oldInfo{Name}", $inMakerNotes);
2222
- ++$index; $oldID = $newID; next; # drop this tag
2223
- }
2224
- if ($$oldInfo{Drop} and $$et{DROP_TAGS} and
2225
- ($$oldInfo{Drop} == 1 or $$oldInfo{Drop} < $oldSize))
2226
- {
2227
- ++$index; $oldID = $newID; next; # drop this tag
2228
- }
2229
- if ($$oldInfo{Format}) {
2230
- $readFormName = $$oldInfo{Format};
2231
- $readFormat = $formatNumber{$readFormName};
2232
- unless ($readFormat) {
2233
- # we aren't reading in a standard EXIF format, so rewrite in old format
2234
- $readFormName = $oldFormName;
2235
- $readFormat = $oldFormat;
2236
- }
2237
- # adjust number of items to read if format size changed
2238
- $readCount = $oldSize / $formatSize[$readFormat];
2239
- }
2240
- }
2241
- if ($oldID <= $lastTagID and not $inMakerNotes) {
2242
- my $str = $oldInfo ? "$$oldInfo{Name} tag" : sprintf('tag 0x%x',$oldID);
2243
- if ($oldID == $lastTagID) {
2244
- $et->Warn("Duplicate $str in $name");;
2245
- } else {
2246
- $et->Warn("\u$str out of sequence in $name");
2247
- }
2248
- }
2249
- $lastTagID = $oldID;
2250
- ++$index; # increment index for next time
2251
- } else {
2252
- undef $oldID; # no more existing entries
2253
- }
2254
- }
2255
- #
2256
- # write out all new tags, up to and including this one
2257
- #
2258
- $newID = $newTags[0];
2259
- my $isNew; # -1=tag is old, 0=tag same as existing, 1=tag is new
2260
- if (not defined $oldID) {
2261
- last unless defined $newID;
2262
- $isNew = 1;
2263
- } elsif (not defined $newID) {
2264
- # maker notes will have no new tags defined
2265
- if ($set{$oldID}) {
2266
- $newID = $oldID;
2267
- $isNew = 0;
2268
- } else {
2269
- $isNew = -1;
2270
- }
2271
- } else {
2272
- $isNew = $oldID <=> $newID;
2273
- }
2274
- my $newInfo = $oldInfo;
2275
- my $newFormat = $oldFormat;
2276
- my $newFormName = $oldFormName;
2277
- my $newCount = $oldCount;
2278
- my $ifdFormName;
2279
- my $newValue;
2280
- my $newValuePt = $isNew >= 0 ? \$newValue : \$oldValue;
2281
- my $isOverwriting;
2282
-
2283
- if ($isNew >= 0) {
2284
- # add, edit or delete this tag
2285
- shift @newTags; # remove from list
2286
- if ($set{$newID}) {
2287
- #
2288
- # set the new tag value (or 'next' if deleting tag)
2289
- #
2290
- $newInfo = $set{$newID};
2291
- $newCount = $$newInfo{Count};
2292
- my ($val, $newVal, $n);
2293
- my $nvHash = $et->GetNewValueHash($newInfo, $dirName);
2294
- if ($isNew > 0) {
2295
- # don't create new entry unless requested
2296
- if ($nvHash) {
2297
- next unless $$nvHash{IsCreating};
2298
- if ($$newInfo{IsOverwriting}) {
2299
- my $proc = $$newInfo{IsOverwriting};
2300
- $isOverwriting = &$proc($et, $nvHash, $val, \$newVal);
2301
- } else {
2302
- $isOverwriting = $et->IsOverwriting($nvHash);
2303
- }
2304
- } else {
2305
- next if $xDelete{$newID}; # don't create if cross deleting
2306
- $newVal = $$mandatory{$newID}; # get value for mandatory tag
2307
- $isOverwriting = 1;
2308
- }
2309
- # convert using new format
2310
- if ($$newInfo{Format}) {
2311
- $newFormName = $$newInfo{Format};
2312
- # use Writable flag to specify IFD format code
2313
- $ifdFormName = $$newInfo{Writable};
2314
- } else {
2315
- $newFormName = $$newInfo{Writable};
2316
- unless ($newFormName) {
2317
- warn("No format for $name $$newInfo{Name}\n");
2318
- next;
2319
- }
2320
- }
2321
- $newFormat = $formatNumber{$newFormName};
2322
- } elsif ($nvHash or $xDelete{$newID}) {
2323
- unless ($nvHash) {
2324
- $nvHash = $et->GetNewValueHash($newInfo, $wrongDir);
2325
- }
2326
- # read value
2327
- if (length $oldValue >= $oldSize) {
2328
- $val = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize);
2329
- } else {
2330
- $val = '';
2331
- }
2332
- # determine write format (by default, use 'Writable' format)
2333
- my $writable = $$newInfo{Writable};
2334
- # (or use existing format if 'Writable' not specified)
2335
- $writable = $oldFormName unless $writable and $writable ne '1';
2336
- # (and override write format with 'Format' if specified)
2337
- my $writeForm = $$newInfo{Format} || $writable;
2338
- if ($writeForm ne $newFormName) {
2339
- # write in specified format
2340
- $newFormName = $writeForm;
2341
- $newFormat = $formatNumber{$newFormName};
2342
- # use different IFD format code if necessary
2343
- if ($inMakerNotes) {
2344
- # always preserve IFD format in maker notes
2345
- $ifdFormName = $oldFormName;
2346
- } elsif ($writable ne $newFormName) {
2347
- # use specified IFD format
2348
- $ifdFormName = $writable;
2349
- }
2350
- }
2351
- if ($inMakerNotes and $readFormName ne 'string' and $readFormName ne 'undef') {
2352
- # keep same size in maker notes unless string or binary
2353
- $newCount = $oldCount * $formatSize[$oldFormat] / $formatSize[$newFormat];
2354
- }
2355
- if ($$newInfo{IsOverwriting}) {
2356
- my $proc = $$newInfo{IsOverwriting};
2357
- $isOverwriting = &$proc($et, $nvHash, $val, \$newVal);
2358
- } else {
2359
- $isOverwriting = $et->IsOverwriting($nvHash, $val);
2360
- }
2361
- }
2362
- if ($isOverwriting) {
2363
- $newVal = $et->GetNewValues($nvHash) unless defined $newVal;
2364
- # value undefined if deleting this tag
2365
- # (also delete tag if cross-deleting and this isn't a date/time shift)
2366
- if (not defined $newVal or ($xDelete{$newID} and not defined $$nvHash{Shift})) {
2367
- if ($$newInfo{RawConvInv} and defined $$nvHash{Value}) {
2368
- # error in RawConvInv, so rewrite existing tag
2369
- goto NoOverwrite; # GOTO!
2370
- }
2371
- unless ($isNew) {
2372
- ++$$et{CHANGED};
2373
- $et->VerboseValue("- $dirName:$$newInfo{Name}", $val);
2374
- }
2375
- next;
2376
- }
2377
- if ($newCount and $newCount < 0) {
2378
- # set count to number of values if variable
2379
- my @vals = split ' ',$newVal;
2380
- $newCount = @vals;
2381
- }
2382
- # convert to binary format
2383
- $newValue = WriteValue($newVal, $newFormName, $newCount);
2384
- unless (defined $newValue) {
2385
- $et->Warn("Invalid value for $dirName:$$newInfo{Name}");
2386
- goto NoOverwrite; # GOTO!
2387
- }
2388
- if (length $newValue) {
2389
- # limit maximum value length in JPEG images
2390
- # (max segment size is 65533 bytes and the min EXIF size is 96 incl an additional IFD entry)
2391
- if ($$et{FILE_TYPE} eq 'JPEG' and length($newValue) > 65436 and
2392
- $$newInfo{Name} ne 'PreviewImage')
2393
- {
2394
- my $name = $$newInfo{MakerNotes} ? 'MakerNotes' : $$newInfo{Name};
2395
- $et->Warn("$name too large to write in JPEG segment");
2396
- goto NoOverwrite; # GOTO!
2397
- }
2398
- # re-code if necessary
2399
- if ($strEnc and $newFormName eq 'string') {
2400
- $newValue = $et->Encode($newValue, $strEnc);
2401
- }
2402
- } else {
2403
- $et->Warn("Can't write zero length $$newInfo{Name} in $$tagTablePtr{GROUPS}{1}");
2404
- goto NoOverwrite; # GOTO!
2405
- }
2406
- if ($isNew >= 0) {
2407
- $newCount = length($newValue) / $formatSize[$newFormat];
2408
- ++$$et{CHANGED};
2409
- if (defined $allMandatory) {
2410
- # not all mandatory if we are writing any tag specifically
2411
- if ($nvHash) {
2412
- undef $allMandatory;
2413
- undef $deleteAll;
2414
- } else {
2415
- ++$addMandatory; # count mandatory tags that we added
2416
- }
2417
- }
2418
- if ($verbose > 1) {
2419
- $et->VerboseValue("- $dirName:$$newInfo{Name}", $val) unless $isNew;
2420
- my $str = $nvHash ? '' : ' (mandatory)';
2421
- $et->VerboseValue("+ $dirName:$$newInfo{Name}", $newVal, $str);
2422
- }
2423
- }
2424
- } else {
2425
- NoOverwrite: next if $isNew > 0;
2426
- $isNew = -1; # rewrite existing tag
2427
- }
2428
- # set format for EXIF IFD if different than conversion format
2429
- if ($ifdFormName) {
2430
- $newFormName = $ifdFormName;
2431
- $newFormat = $formatNumber{$newFormName};
2432
- }
2433
-
2434
- } elsif ($isNew > 0) {
2435
- #
2436
- # create new subdirectory
2437
- #
2438
- # newInfo may not be defined if we try to add a mandatory tag
2439
- # to a directory that doesn't support it (eg. IFD1 in RW2 images)
2440
- $newInfo = $$addDirs{$newID} or next;
2441
- # make sure we don't try to generate a new MakerNotes directory
2442
- # or a SubIFD
2443
- next if $$newInfo{MakerNotes} or $$newInfo{Name} eq 'SubIFD';
2444
- my $subTable;
2445
- if ($$newInfo{SubDirectory}{TagTable}) {
2446
- $subTable = Image::ExifTool::GetTagTable($$newInfo{SubDirectory}{TagTable});
2447
- } else {
2448
- $subTable = $tagTablePtr;
2449
- }
2450
- # create empty source directory
2451
- my %sourceDir = (
2452
- Parent => $dirName,
2453
- Fixup => new Image::ExifTool::Fixup,
2454
- );
2455
- $sourceDir{DirName} = $$newInfo{Groups}{1} if $$newInfo{SubIFD};
2456
- $newValue = $et->WriteDirectory(\%sourceDir, $subTable);
2457
- # only add new directory if it isn't empty
2458
- next unless defined $newValue and length($newValue);
2459
- # set the fixup start location
2460
- if ($$newInfo{SubIFD}) {
2461
- # subdirectory is referenced by an offset in value buffer
2462
- my $subdir = $newValue;
2463
- $newValue = Set32u(0xfeedf00d);
2464
- push @subdirs, {
2465
- DataPt => \$subdir,
2466
- Table => $subTable,
2467
- Fixup => $sourceDir{Fixup},
2468
- Offset => length($dirBuff) + 8,
2469
- Where => 'dirBuff',
2470
- };
2471
- $newFormName = 'int32u';
2472
- $newFormat = $formatNumber{$newFormName};
2473
- } else {
2474
- # subdirectory goes directly into value buffer
2475
- $sourceDir{Fixup}{Start} += length($valBuff);
2476
- # use Writable to set format, otherwise 'undef'
2477
- $newFormName = $$newInfo{Writable};
2478
- unless ($newFormName and $formatNumber{$newFormName}) {
2479
- $newFormName = 'undef';
2480
- }
2481
- $newFormat = $formatNumber{$newFormName};
2482
- push @valFixups, $sourceDir{Fixup};
2483
- }
2484
- } elsif ($$newInfo{Format} and $$newInfo{Writable} and $$newInfo{Writable} ne '1') {
2485
- # use specified write format
2486
- $newFormName = $$newInfo{Writable};
2487
- $newFormat = $formatNumber{$newFormName};
2488
- } elsif ($$addDirs{$newID} and $newInfo ne $$addDirs{$newID}) {
2489
- # this can happen if we are trying to add a directory that doesn't exist
2490
- # in this type of file (eg. try adding a SubIFD tag to an A100 image)
2491
- $isNew = -1;
2492
- }
2493
- }
2494
- if ($isNew < 0) {
2495
- # just rewrite existing tag
2496
- $newID = $oldID;
2497
- $newValue = $oldValue;
2498
- $newFormat = $oldFormat; # (just in case it changed)
2499
- $newFormName = $oldFormName;
2500
- # set offset of this entry in the directory so we can update the pointer
2501
- # and save block information to copy this large block later
2502
- if ($oldImageData) {
2503
- $$oldImageData[3] = $newStart + length($dirBuff) + 2;
2504
- push @imageData, $oldImageData;
2505
- $$origDirInfo{ImageData} = \@imageData;
2506
- }
2507
- }
2508
- if ($newInfo) {
2509
- #
2510
- # load necessary data for this tag (thumbnail image, etc)
2511
- #
2512
- if ($$newInfo{DataTag} and $isNew >= 0) {
2513
- my $dataTag = $$newInfo{DataTag};
2514
- # load data for this tag
2515
- unless (defined $offsetData{$dataTag} or $dataTag eq 'LeicaTrailer') {
2516
- # prefer tag from Composite table if it exists (otherwise
2517
- # PreviewImage data would be taken from Extra tag)
2518
- my $compInfo = $Image::ExifTool::Composite{$dataTag};
2519
- $offsetData{$dataTag} = $et->GetNewValues($compInfo || $dataTag);
2520
- my $err;
2521
- if (defined $offsetData{$dataTag}) {
2522
- my $len = length $offsetData{$dataTag};
2523
- if ($dataTag eq 'PreviewImage') {
2524
- # must set DEL_PREVIEW flag now if preview fit into IFD
2525
- $$et{DEL_PREVIEW} = 1 if $len <= 4;
2526
- } elsif ($$et{FILE_TYPE} eq 'JPEG' and $len > 60000) {
2527
- delete $offsetData{$dataTag};
2528
- $err = "$dataTag not written (too large for JPEG segment)";
2529
- }
2530
- } else {
2531
- $err = "$dataTag not found";
2532
- }
2533
- if ($err) {
2534
- $et->Warn($err) if $$newInfo{IsOffset};
2535
- delete $set{$newID}; # remove from list of tags we are setting
2536
- next;
2537
- }
2538
- }
2539
- }
2540
- #
2541
- # write maker notes
2542
- #
2543
- if ($$newInfo{MakerNotes}) {
2544
- # don't write new makernotes if we are deleting this group
2545
- if ($$et{DEL_GROUP}{MakerNotes} and
2546
- ($$et{DEL_GROUP}{MakerNotes} != 2 or $isNew <= 0))
2547
- {
2548
- if ($isNew <= 0) {
2549
- ++$$et{CHANGED};
2550
- $verbose and print $out " Deleting MakerNotes\n";
2551
- }
2552
- next;
2553
- }
2554
- my $saveOrder = GetByteOrder();
2555
- if ($isNew >= 0 and $set{$newID}) {
2556
- # we are writing a whole new maker note block
2557
- # --> add fixup information if necessary
2558
- my $nvHash = $et->GetNewValueHash($newInfo, $dirName);
2559
- if ($nvHash and $$nvHash{MAKER_NOTE_FIXUP}) {
2560
- # must clone fixup because we will be shifting it
2561
- my $makerFixup = $$nvHash{MAKER_NOTE_FIXUP}->Clone();
2562
- my $valLen = length($valBuff);
2563
- $$makerFixup{Start} += $valLen;
2564
- push @valFixups, $makerFixup;
2565
- }
2566
- } else {
2567
- # update maker notes if possible
2568
- my %subdirInfo = (
2569
- Base => $base,
2570
- DataPt => $valueDataPt,
2571
- DataPos => $valueDataPos,
2572
- DataLen => $valueDataLen,
2573
- DirStart => $valuePtr,
2574
- DirLen => $oldSize,
2575
- DirName => 'MakerNotes',
2576
- Name => $$newInfo{Name},
2577
- Parent => $dirName,
2578
- TagInfo => $newInfo,
2579
- RAF => $raf,
2580
- );
2581
- my ($subTable, $subdir, $loc, $writeProc, $notIFD);
2582
- if ($$newInfo{SubDirectory}) {
2583
- my $sub = $$newInfo{SubDirectory};
2584
- $subdirInfo{FixBase} = 1 if $$sub{FixBase};
2585
- $subdirInfo{FixOffsets} = $$sub{FixOffsets};
2586
- $subdirInfo{EntryBased} = $$sub{EntryBased};
2587
- $subdirInfo{NoFixBase} = 1 if defined $$sub{Base};
2588
- $subdirInfo{AutoFix} = $$sub{AutoFix};
2589
- }
2590
- # get the proper tag table for these maker notes
2591
- if ($oldInfo and $$oldInfo{SubDirectory}) {
2592
- $subTable = $$oldInfo{SubDirectory}{TagTable};
2593
- $subTable and $subTable = Image::ExifTool::GetTagTable($subTable);
2594
- $writeProc = $$oldInfo{SubDirectory}{WriteProc};
2595
- $notIFD = $$oldInfo{NotIFD};
2596
- } else {
2597
- $et->Warn('Internal problem getting maker notes tag table');
2598
- }
2599
- $subTable or $subTable = $tagTablePtr;
2600
- if ($writeProc and
2601
- $writeProc eq \&Image::ExifTool::MakerNotes::WriteUnknownOrPreview and
2602
- $oldValue =~ /^\xff\xd8\xff/)
2603
- {
2604
- $loc = 0;
2605
- } elsif (not $notIFD) {
2606
- # look for IFD-style maker notes
2607
- $loc = Image::ExifTool::MakerNotes::LocateIFD($et,\%subdirInfo);
2608
- }
2609
- if (defined $loc) {
2610
- # we need fixup data for this subdirectory
2611
- $subdirInfo{Fixup} = new Image::ExifTool::Fixup;
2612
- # rewrite maker notes
2613
- my $changed = $$et{CHANGED};
2614
- $subdir = $et->WriteDirectory(\%subdirInfo, $subTable, $writeProc);
2615
- if ($changed == $$et{CHANGED} and $subdirInfo{Fixup}->IsEmpty()) {
2616
- # return original data if nothing changed and no fixups
2617
- undef $subdir;
2618
- }
2619
- } elsif ($$subTable{PROCESS_PROC} and
2620
- $$subTable{PROCESS_PROC} eq \&Image::ExifTool::ProcessBinaryData)
2621
- {
2622
- my $sub = $$oldInfo{SubDirectory};
2623
- if (defined $$sub{Start}) {
2624
- #### eval Start ($valuePtr)
2625
- my $start = eval $$sub{Start};
2626
- $loc = $start - $valuePtr;
2627
- $subdirInfo{DirStart} = $start;
2628
- $subdirInfo{DirLen} -= $loc;
2629
- } else {
2630
- $loc = 0;
2631
- }
2632
- # rewrite maker notes
2633
- $subdir = $et->WriteDirectory(\%subdirInfo, $subTable);
2634
- } elsif (not $notIFD) {
2635
- my $msg = 'Maker notes could not be parsed';
2636
- if ($$et{FILE_TYPE} eq 'JPEG') {
2637
- $et->Warn($msg, 1);
2638
- } else {
2639
- $et->Error($msg, 1);
2640
- }
2641
- }
2642
- if (defined $subdir) {
2643
- next unless length $subdir;
2644
- my $valLen = length($valBuff);
2645
- # restore existing header and substitute the new
2646
- # maker notes for the old value
2647
- $newValue = substr($oldValue, 0, $loc) . $subdir;
2648
- my $makerFixup = $subdirInfo{Fixup};
2649
- my $previewInfo = $$et{PREVIEW_INFO};
2650
- if ($subdirInfo{Relative}) {
2651
- # apply a one-time fixup to $loc since offsets are relative
2652
- $$makerFixup{Start} += $loc;
2653
- # shift all offsets to be relative to new base
2654
- my $baseShift = $valueDataPos + $valuePtr + $base - $subdirInfo{Base};
2655
- $$makerFixup{Shift} += $baseShift;
2656
- $makerFixup->ApplyFixup(\$newValue);
2657
- if ($previewInfo) {
2658
- # remove all but PreviewImage fixup (since others shouldn't change)
2659
- foreach (keys %{$$makerFixup{Pointers}}) {
2660
- /_PreviewImage$/ or delete $$makerFixup{Pointers}{$_};
2661
- }
2662
- # zero pointer so we can see how it gets shifted later
2663
- $makerFixup->SetMarkerPointers(\$newValue, 'PreviewImage', 0);
2664
- # set the pointer to the start of the EXIF information
2665
- # add preview image fixup to list of value fixups
2666
- $$makerFixup{Start} += $valLen;
2667
- push @valFixups, $makerFixup;
2668
- $$previewInfo{BaseShift} = $baseShift;
2669
- $$previewInfo{Relative} = 1;
2670
- }
2671
- # don't shift anything if relative flag set to zero (Pentax patch)
2672
- } elsif (not defined $subdirInfo{Relative}) {
2673
- # shift offset base if shifted in the original image or if FixBase
2674
- # was used, but be careful of automatic FixBase with negative shifts
2675
- # since they may lead to negative (invalid) offsets (casio_edit_problem.jpg)
2676
- my $baseShift = $base - $subdirInfo{Base};
2677
- if ($subdirInfo{AutoFix}) {
2678
- $baseShift = 0;
2679
- } elsif ($subdirInfo{FixBase} and $baseShift < 0 and
2680
- # allow negative base shift if offsets are bigger (PentaxOptioWP.jpg)
2681
- (not $subdirInfo{MinOffset} or $subdirInfo{MinOffset} + $baseShift < 0))
2682
- {
2683
- my $fixBase = $et->Options('FixBase');
2684
- if (not defined $fixBase) {
2685
- my $str = $et->Options('IgnoreMinorErrors') ? 'ignored' : 'fix or ignore?';
2686
- $et->Error("MakerNotes offsets may be incorrect ($str)", 1);
2687
- } elsif ($fixBase eq '') {
2688
- $et->Warn('Fixed incorrect MakerNotes offsets');
2689
- $baseShift = 0;
2690
- }
2691
- }
2692
- $$makerFixup{Start} += $valLen + $loc;
2693
- $$makerFixup{Shift} += $baseShift;
2694
- # permanently fix makernote offset errors
2695
- $$makerFixup{Shift} += $subdirInfo{FixedBy} || 0;
2696
- push @valFixups, $makerFixup;
2697
- if ($previewInfo and not $$previewInfo{NoBaseShift}) {
2698
- $$previewInfo{BaseShift} = $baseShift;
2699
- }
2700
- }
2701
- $newValuePt = \$newValue; # write new value
2702
- }
2703
- }
2704
- SetByteOrder($saveOrder);
2705
-
2706
- # process existing subdirectory unless we are overwriting it entirely
2707
- } elsif ($$newInfo{SubDirectory} and $isNew <= 0 and not $isOverwriting
2708
- # don't edit directory if Writable is set to 0
2709
- and (not defined $$newInfo{Writable} or $$newInfo{Writable}))
2710
- {
2711
-
2712
- my $subdir = $$newInfo{SubDirectory};
2713
- if ($$newInfo{SubIFD}) {
2714
- #
2715
- # rewrite existing sub IFD's
2716
- #
2717
- my $subTable = $tagTablePtr;
2718
- if ($$subdir{TagTable}) {
2719
- $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
2720
- }
2721
- # determine directory name for this IFD
2722
- my $subdirName = $$newInfo{Groups}{1} || $$newInfo{Name};
2723
- # all makernotes directory names must be 'MakerNotes'
2724
- $subdirName = 'MakerNotes' if $$subTable{GROUPS}{0} eq 'MakerNotes';
2725
- # must handle sub-IFD's specially since the values
2726
- # are actually offsets to subdirectories
2727
- unless ($readCount) { # can't have zero count
2728
- return undef if $et->Error("$name entry $index has zero count", 2);
2729
- next;
2730
- }
2731
- my $writeCount = 0;
2732
- my $i;
2733
- $newValue = ''; # reset value because we regenerate it below
2734
- for ($i=0; $i<$readCount; ++$i) {
2735
- my $off = $i * $formatSize[$readFormat];
2736
- my $val = ReadValue($valueDataPt, $valuePtr + $off,
2737
- $readFormName, 1, $oldSize - $off);
2738
- my $subdirStart = $val - $dataPos;
2739
- my $subdirBase = $base;
2740
- my $hdrLen;
2741
- if (defined $$subdir{Start}) {
2742
- #### eval Start ($val)
2743
- my $newStart = eval $$subdir{Start};
2744
- unless (Image::ExifTool::IsInt($newStart)) {
2745
- $et->Error("Bad subdirectory start for $$newInfo{Name}");
2746
- next;
2747
- }
2748
- $newStart -= $dataPos;
2749
- $hdrLen = $newStart - $subdirStart;
2750
- $subdirStart = $newStart;
2751
- }
2752
- if ($$subdir{Base}) {
2753
- my $start = $subdirStart + $dataPos;
2754
- #### eval Base ($start,$base)
2755
- $subdirBase += eval $$subdir{Base};
2756
- }
2757
- # add IFD number if more than one
2758
- $subdirName =~ s/\d*$/$i/ if $i;
2759
- my %subdirInfo = (
2760
- Base => $subdirBase,
2761
- DataPt => $dataPt,
2762
- DataPos => $dataPos - $subdirBase + $base,
2763
- DataLen => $dataLen,
2764
- DirStart => $subdirStart,
2765
- DirName => $subdirName,
2766
- Name => $$newInfo{Name},
2767
- TagInfo => $newInfo,
2768
- Parent => $dirName,
2769
- Fixup => new Image::ExifTool::Fixup,
2770
- RAF => $raf,
2771
- Subdir => $subdir,
2772
- # set ImageData only for 1st level SubIFD's
2773
- ImageData=> $imageDataFlag eq 'Main' ? 'SubIFD' : undef,
2774
- );
2775
- # pass on header pointer only for certain sub IFD's
2776
- $subdirInfo{HeaderPtr} = $$dirInfo{HeaderPtr} if $$newInfo{SubIFD} == 2;
2777
- if ($$subdir{RelativeBase}) {
2778
- # apply one-time fixup if offsets are relative (Sony IDC hack)
2779
- delete $subdirInfo{Fixup};
2780
- delete $subdirInfo{ImageData};
2781
- }
2782
- # is the subdirectory outside our current data?
2783
- if ($subdirStart < 0 or $subdirStart + 2 > $dataLen) {
2784
- if ($raf) {
2785
- # reset SubDirectory buffer (we will load it later)
2786
- my $buff = '';
2787
- $subdirInfo{DataPt} = \$buff;
2788
- $subdirInfo{DataLen} = 0;
2789
- } else {
2790
- my @err = ("Can't read $subdirName data", $inMakerNotes);
2791
- if ($$subTable{VARS} and $$subTable{VARS}{MINOR_ERRORS}) {
2792
- $et->Warn($err[0] . '. Ignored.');
2793
- } elsif ($et->Error(@err)) {
2794
- return undef;
2795
- }
2796
- next Entry; # don't write this directory
2797
- }
2798
- }
2799
- my $subdirData = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
2800
- unless (defined $subdirData) {
2801
- # WriteDirectory should have issued an error, but check just in case
2802
- $et->Error("Error writing $subdirName") unless $$et{VALUE}{Error};
2803
- return undef;
2804
- }
2805
- # add back original header if necessary (eg. Ricoh GR)
2806
- if ($hdrLen and $hdrLen > 0 and $subdirStart <= $dataLen) {
2807
- $subdirData = substr($$dataPt, $subdirStart - $hdrLen, $hdrLen) . $subdirData;
2808
- $subdirInfo{Fixup}{Start} += $hdrLen;
2809
- }
2810
- unless (length $subdirData) {
2811
- next unless $inMakerNotes;
2812
- # don't delete MakerNote Sub-IFD's, write empty IFD instead
2813
- $subdirData = "\0" x 6;
2814
- # reset SubIFD ImageData and Fixup just to be safe
2815
- delete $subdirInfo{ImageData};
2816
- delete $subdirInfo{Fixup};
2817
- }
2818
- # handle data blocks that we will transfer later
2819
- if (ref $subdirInfo{ImageData}) {
2820
- push @imageData, @{$subdirInfo{ImageData}};
2821
- $$origDirInfo{ImageData} = \@imageData;
2822
- }
2823
- # temporarily set value to subdirectory index
2824
- # (will set to actual offset later when we know what it is)
2825
- $newValue .= Set32u(0xfeedf00d);
2826
- my ($offset, $where);
2827
- if ($readCount > 1) {
2828
- $offset = length($valBuff) + $i * 4;
2829
- $where = 'valBuff';
2830
- } else {
2831
- $offset = length($dirBuff) + 8;
2832
- $where = 'dirBuff';
2833
- }
2834
- # add to list of subdirectories we will append later
2835
- push @subdirs, {
2836
- DataPt => \$subdirData,
2837
- Table => $subTable,
2838
- Fixup => $subdirInfo{Fixup},
2839
- Offset => $offset,
2840
- Where => $where,
2841
- ImageData => $subdirInfo{ImageData},
2842
- };
2843
- ++$writeCount; # count number of subdirs written
2844
- }
2845
- next unless length $newValue;
2846
- # must change location of subdir offset if we deleted
2847
- # a directory and only one remains
2848
- if ($writeCount < $readCount and $writeCount == 1) {
2849
- $subdirs[-1]{Where} = 'dirBuff';
2850
- $subdirs[-1]{Offset} = length($dirBuff) + 8;
2851
- }
2852
- # set new format to int32u for IFD
2853
- $newFormName = $$newInfo{FixFormat} || 'int32u';
2854
- $newFormat = $formatNumber{$newFormName};
2855
- $newValuePt = \$newValue;
2856
-
2857
- } elsif ((not defined $$subdir{Start} or
2858
- $$subdir{Start} =~ /\$valuePtr/) and
2859
- $$subdir{TagTable})
2860
- {
2861
- #
2862
- # rewrite other existing subdirectories ('$valuePtr' type only)
2863
- #
2864
- # set subdirectory Start and Base
2865
- my $subdirStart = $valuePtr;
2866
- if ($$subdir{Start}) {
2867
- #### eval Start ($valuePtr)
2868
- $subdirStart = eval $$subdir{Start};
2869
- # must adjust directory size if start changed
2870
- $oldSize -= $subdirStart - $valuePtr;
2871
- }
2872
- my $subdirBase = $base;
2873
- if ($$subdir{Base}) {
2874
- my $start = $subdirStart + $valueDataPos;
2875
- #### eval Base ($start,$base)
2876
- $subdirBase += eval $$subdir{Base};
2877
- }
2878
- my $subFixup = new Image::ExifTool::Fixup;
2879
- my %subdirInfo = (
2880
- Base => $subdirBase,
2881
- DataPt => $valueDataPt,
2882
- DataPos => $valueDataPos - $subdirBase + $base,
2883
- DataLen => $valueDataLen,
2884
- DirStart => $subdirStart,
2885
- DirName => $$subdir{DirName},
2886
- DirLen => $oldSize,
2887
- Parent => $dirName,
2888
- Fixup => $subFixup,
2889
- RAF => $raf,
2890
- TagInfo => $newInfo,
2891
- );
2892
- unless ($oldSize) {
2893
- # replace with dummy data if empty to prevent WriteDirectory
2894
- # routines from accessing data they shouldn't
2895
- my $tmp = '';
2896
- $subdirInfo{DataPt} = \$tmp;
2897
- $subdirInfo{DataLen} = 0;
2898
- $subdirInfo{DirStart} = 0;
2899
- $subdirInfo{DataPos} += $subdirStart;
2900
- }
2901
- my $subTable = Image::ExifTool::GetTagTable($$subdir{TagTable});
2902
- my $oldOrder = GetByteOrder();
2903
- SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
2904
- $newValue = $et->WriteDirectory(\%subdirInfo, $subTable, $$subdir{WriteProc});
2905
- SetByteOrder($oldOrder);
2906
- if (defined $newValue) {
2907
- my $hdrLen = $subdirStart - $valuePtr;
2908
- if ($hdrLen) {
2909
- $newValue = substr($$valueDataPt, $valuePtr, $hdrLen) . $newValue;
2910
- $$subFixup{Start} += $hdrLen;
2911
- }
2912
- $newValuePt = \$newValue;
2913
- } else {
2914
- $newValuePt = \$oldValue;
2915
- }
2916
- unless (length $$newValuePt) {
2917
- # don't delete a previously empty makernote directory
2918
- next if $oldSize or not $inMakerNotes;
2919
- }
2920
- if ($$subFixup{Pointers} and $subdirInfo{Base} == $base) {
2921
- $$subFixup{Start} += length $valBuff;
2922
- push @valFixups, $subFixup;
2923
- } else {
2924
- # apply fixup in case we added a header ($hdrLen above)
2925
- $subFixup->ApplyFixup(\$newValue);
2926
- }
2927
- }
2928
-
2929
- } elsif ($$newInfo{OffsetPair}) {
2930
- #
2931
- # keep track of offsets
2932
- #
2933
- my $dataTag = $$newInfo{DataTag} || '';
2934
- if ($dataTag eq 'CanonVRD') {
2935
- # must decide now if we will write CanonVRD information
2936
- my $hasVRD;
2937
- if ($$et{NEW_VALUE}{$Image::ExifTool::Extra{CanonVRD}}) {
2938
- # adding or deleting as a block
2939
- $hasVRD = $et->GetNewValues('CanonVRD') ? 1 : 0;
2940
- } elsif ($$et{DEL_GROUP}{CanonVRD} or
2941
- $$et{DEL_GROUP}{Trailer})
2942
- {
2943
- $hasVRD = 0; # deleting as a group
2944
- } else {
2945
- $hasVRD = ($$newValuePt ne "\0\0\0\0");
2946
- }
2947
- if ($hasVRD) {
2948
- # add a fixup, and set this offset later
2949
- $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
2950
- } else {
2951
- # there is (or will soon be) no VRD information, so set pointer to zero
2952
- $newValue = "\0" x length($$newValuePt);
2953
- $newValuePt = \$newValue;
2954
- }
2955
- } elsif ($dataTag eq 'OriginalDecisionData') {
2956
- # handle Canon OriginalDecisionData (no associated length tag)
2957
- # - I'm going out of my way here to preserve data which is
2958
- # invalidated anyway by our edits
2959
- my $odd;
2960
- my $oddInfo = $Image::ExifTool::Composite{OriginalDecisionData};
2961
- if ($oddInfo and $$et{NEW_VALUE}{$oddInfo}) {
2962
- $odd = $et->GetNewValues($dataTag);
2963
- if ($verbose > 1) {
2964
- print $out " - $dirName:$dataTag\n" if $$newValuePt ne "\0\0\0\0";
2965
- print $out " + $dirName:$dataTag\n" if $odd;
2966
- }
2967
- ++$$et{CHANGED};
2968
- } elsif ($$newValuePt ne "\0\0\0\0") {
2969
- if (length($$newValuePt) == 4) {
2970
- require Image::ExifTool::Canon;
2971
- my $offset = Get32u($newValuePt,0);
2972
- # absolute offset in JPEG images only
2973
- $offset += $base unless $$et{FILE_TYPE} eq 'JPEG';
2974
- $odd = Image::ExifTool::Canon::ReadODD($et, $offset);
2975
- $odd = $$odd if ref $odd;
2976
- } else {
2977
- $et->Error("Invalid $$newInfo{Name}",1);
2978
- }
2979
- }
2980
- if ($odd) {
2981
- my $newOffset = length($valBuff);
2982
- # (ODD offset is absolute in JPEG, so add base offset!)
2983
- $newOffset += $base if $$et{FILE_TYPE} eq 'JPEG';
2984
- $newValue = Set32u($newOffset);
2985
- $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
2986
- $valBuff .= $odd; # add original decision data
2987
- } else {
2988
- $newValue = "\0\0\0\0";
2989
- }
2990
- $newValuePt = \$newValue;
2991
- } else {
2992
- my $offsetInfo = $offsetInfo[$ifd];
2993
- # save original values (for updating TIFF_END later)
2994
- my @vals;
2995
- if ($isNew <= 0) {
2996
- my $oldOrder = GetByteOrder();
2997
- # Minolta A200 stores these in the wrong byte order!
2998
- SetByteOrder($$newInfo{ByteOrder}) if $$newInfo{ByteOrder};
2999
- @vals = ReadValue(\$oldValue, 0, $readFormName, $readCount, $oldSize);
3000
- SetByteOrder($oldOrder);
3001
- }
3002
- # only support int32 pointers (for now)
3003
- if ($formatSize[$newFormat] != 4 and $$newInfo{IsOffset}) {
3004
- $isNew > 0 and warn("Internal error (Offset not int32)"), return undef;
3005
- $newCount != $readCount and warn("Wrong count!"), return undef;
3006
- # change to int32
3007
- $newFormName = 'int32u';
3008
- $newFormat = $formatNumber{$newFormName};
3009
- $newValue = WriteValue(join(' ',@vals), $newFormName, $newCount);
3010
- unless (defined $newValue) {
3011
- warn "Internal error writing offsets for $$newInfo{Name}\n";
3012
- return undef;
3013
- }
3014
- }
3015
- $offsetInfo or $offsetInfo = $offsetInfo[$ifd] = { };
3016
- # save location of valuePtr in new directory
3017
- # (notice we add 10 instead of 8 for valuePtr because
3018
- # we will put a 2-byte count at start of directory later)
3019
- my $ptr = $newStart + length($dirBuff) + 10;
3020
- $newCount or $newCount = 1; # make sure count is set for offsetInfo
3021
- # save value pointer and value count for each tag
3022
- $$offsetInfo{$newID} = [$newInfo, $ptr, $newCount, \@vals, $newFormat];
3023
- }
3024
-
3025
- } elsif ($$newInfo{DataMember}) {
3026
-
3027
- # save any necessary data members (Make, Model, etc)
3028
- my $formatStr = $newFormName;
3029
- my $count = $newCount;
3030
- # change to specified format if necessary
3031
- if ($$newInfo{Format} and $$newInfo{Format} ne $formatStr) {
3032
- $formatStr = $$newInfo{Format};
3033
- my $format = $formatNumber{$formatStr};
3034
- # adjust number of items for new format size
3035
- $count = int(length($$newValuePt) / $formatSize[$format]) if $format;
3036
- }
3037
- my $val = ReadValue($newValuePt,0,$formatStr,$count,length($$newValuePt));
3038
- my $conv = $$newInfo{RawConv};
3039
- if ($conv) {
3040
- # let the RawConv store the (possibly converted) data member
3041
- if (ref $conv eq 'CODE') {
3042
- &$conv($val, $et);
3043
- } else {
3044
- my ($self, $tag, $taginfo) = ($et, $$newInfo{Name}, $newInfo);
3045
- #### eval RawConv ($self, $val, $tag, $tagInfo)
3046
- eval $conv;
3047
- }
3048
- } else {
3049
- $$et{$$newInfo{DataMember}} = $val;
3050
- }
3051
- }
3052
- }
3053
- #
3054
- # write out the directory entry
3055
- #
3056
- my $newSize = length($$newValuePt);
3057
- my $fsize = $formatSize[$newFormat];
3058
- my $offsetVal;
3059
- $newCount = int(($newSize + $fsize - 1) / $fsize); # set proper count
3060
- if ($newSize > 4) {
3061
- # zero-pad to an even number of bytes (required by EXIF standard)
3062
- # and make sure we are a multiple of the format size
3063
- while ($newSize & 0x01 or $newSize < $newCount * $fsize) {
3064
- $$newValuePt .= "\0";
3065
- ++$newSize;
3066
- }
3067
- my $entryBased;
3068
- if ($$dirInfo{EntryBased} or ($newInfo and $$newInfo{EntryBased})) {
3069
- $entryBased = 1;
3070
- $offsetVal = Set32u(length($valBuff) - length($dirBuff));
3071
- } else {
3072
- $offsetVal = Set32u(length $valBuff);
3073
- }
3074
- my ($dataTag, $putFirst);
3075
- ($dataTag, $putFirst) = @$newInfo{'DataTag','PutFirst'} if $newInfo;
3076
- if ($dataTag) {
3077
- if ($dataTag eq 'PreviewImage' and ($$et{FILE_TYPE} eq 'JPEG' or
3078
- $$et{GENERATE_PREVIEW_INFO}))
3079
- {
3080
- # hold onto the PreviewImage until we can determine if it fits
3081
- $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
3082
- Data => $$newValuePt,
3083
- Fixup => new Image::ExifTool::Fixup,
3084
- };
3085
- $$et{PREVIEW_INFO}{ChangeBase} = 1 if $$newInfo{ChangeBase};
3086
- if ($$newInfo{IsOffset} and $$newInfo{IsOffset} eq '2') {
3087
- $$et{PREVIEW_INFO}{NoBaseShift} = 1;
3088
- }
3089
- # use original preview size if we will attempt to load it later
3090
- $newCount = $oldCount if $$newValuePt eq 'LOAD_PREVIEW';
3091
- $$newValuePt = '';
3092
- } elsif ($dataTag eq 'LeicaTrailer' and $$et{LeicaTrailer}) {
3093
- $$newValuePt = '';
3094
- }
3095
- }
3096
- if ($putFirst and $$dirInfo{HeaderPtr}) {
3097
- my $hdrPtr = $$dirInfo{HeaderPtr};
3098
- # place this value immediately after the TIFF header
3099
- $offsetVal = Set32u(length $$hdrPtr);
3100
- $$hdrPtr .= $$newValuePt;
3101
- } else {
3102
- $valBuff .= $$newValuePt; # add value data to buffer
3103
- # must save a fixup pointer for every pointer in the directory
3104
- if ($entryBased) {
3105
- $entryBasedFixup or $entryBasedFixup = new Image::ExifTool::Fixup;
3106
- $entryBasedFixup->AddFixup(length($dirBuff) + 8, $dataTag);
3107
- } else {
3108
- $dirFixup->AddFixup(length($dirBuff) + 8, $dataTag);
3109
- }
3110
- }
3111
- } else {
3112
- $offsetVal = $$newValuePt; # save value in offset if 4 bytes or less
3113
- # must pad value with zeros if less than 4 bytes
3114
- $newSize < 4 and $offsetVal .= "\0" x (4 - $newSize);
3115
- }
3116
- # write the directory entry
3117
- $dirBuff .= Set16u($newID) . Set16u($newFormat) .
3118
- Set32u($newCount) . $offsetVal;
3119
- # update flag to keep track of mandatory tags
3120
- while (defined $allMandatory) {
3121
- if (defined $$mandatory{$newID}) {
3122
- # values must correspond to mandatory values
3123
- my $form = $$newInfo{Format} || $newFormName;
3124
- my $mandVal = WriteValue($$mandatory{$newID}, $form, $newCount);
3125
- if (defined $mandVal and $mandVal eq $$newValuePt) {
3126
- ++$allMandatory; # count mandatory tags
3127
- last;
3128
- }
3129
- }
3130
- undef $deleteAll;
3131
- undef $allMandatory;
3132
- }
3133
- }
3134
- if ($ignoreCount) {
3135
- my $y = $ignoreCount > 1 ? 'ies' : 'y';
3136
- my $verb = $$dirInfo{FixBase} ? 'Ignored' : 'Removed';
3137
- $et->Warn("$verb $ignoreCount invalid entr$y from $name", 1);
3138
- }
3139
- if ($fixCount) {
3140
- my $s = $fixCount > 1 ? 's' : '';
3141
- $et->Warn("Fixed invalid count$s for $fixCount $name tag$s", 1);
3142
- }
3143
- #..............................................................................
3144
- # write directory counts and nextIFD pointer and add value data to end of IFD
3145
- #
3146
- # determine now if there is or will be another IFD after this one
3147
- my $nextIfdOffset;
3148
- if ($dirEnd + 4 <= $dataLen) {
3149
- $nextIfdOffset = Get32u($dataPt, $dirEnd);
3150
- } else {
3151
- $nextIfdOffset = 0;
3152
- }
3153
- my $isNextIFD = ($$dirInfo{Multi} and ($nextIfdOffset or
3154
- # account for the case where we will create the next IFD
3155
- # (IFD1 only, but not in TIFF-format images)
3156
- ($dirName eq 'IFD0' and $$et{ADD_DIRS}{'IFD1'} and
3157
- $$et{FILE_TYPE} ne 'TIFF')));
3158
- # calculate number of entries in new directory
3159
- my $newEntries = length($dirBuff) / 12;
3160
- # delete entire directory if we deleted a tag and only mandatory tags remain or we
3161
- # attempted to create a directory with only mandatory tags and there is no nextIFD
3162
- if ($allMandatory and not $isNextIFD and ($newEntries < $numEntries or $numEntries == 0)) {
3163
- $newEntries = 0;
3164
- $dirBuff = '';
3165
- $valBuff = '';
3166
- undef $dirFixup; # no fixups in this directory
3167
- ++$deleteAll if defined $deleteAll;
3168
- $verbose > 1 and print $out " - $allMandatory mandatory tag(s)\n";
3169
- $$et{CHANGED} -= $addMandatory; # didn't change these after all
3170
- }
3171
- if ($ifd and not $newEntries) {
3172
- $verbose and print $out " Deleting IFD1\n";
3173
- last; # don't write IFD1 if empty
3174
- }
3175
- # apply one-time fixup for entry-based offsets
3176
- if ($entryBasedFixup) {
3177
- $$entryBasedFixup{Shift} = length($dirBuff) + 4;
3178
- $entryBasedFixup->ApplyFixup(\$dirBuff);
3179
- undef $entryBasedFixup;
3180
- }
3181
- # initialize next IFD pointer to zero
3182
- my $nextIFD = Set32u(0);
3183
- # some cameras use a different amount of padding after the makernote IFD
3184
- if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/) {
3185
- my ($rel, $pad) = Image::ExifTool::MakerNotes::GetMakerNoteOffset($et);
3186
- $nextIFD = "\0" x $pad if defined $pad and ($pad==0 or ($pad>4 and $pad<=32));
3187
- }
3188
- # add directory entry count to start of IFD and next IFD pointer to end
3189
- $newData .= Set16u($newEntries) . $dirBuff . $nextIFD;
3190
- # get position of value data in newData
3191
- my $valPos = length($newData);
3192
- # go back now and set next IFD pointer if this isn't the first IFD
3193
- if ($nextIfdPos) {
3194
- # set offset to next IFD
3195
- Set32u($newStart, \$newData, $nextIfdPos);
3196
- $fixup->AddFixup($nextIfdPos,'NextIFD'); # add fixup for this offset in newData
3197
- }
3198
- # remember position of 'next IFD' pointer so we can set it next time around
3199
- $nextIfdPos = length($nextIFD) ? $valPos - length($nextIFD) : undef;
3200
- # add value data after IFD
3201
- $newData .= $valBuff;
3202
- #
3203
- # add any subdirectories, adding fixup information
3204
- #
3205
- if (@subdirs) {
3206
- my $subdir;
3207
- foreach $subdir (@subdirs) {
3208
- my $len = length($newData); # position of subdirectory in data
3209
- my $subdirFixup = $$subdir{Fixup};
3210
- if ($subdirFixup) {
3211
- $$subdirFixup{Start} += $len;
3212
- $fixup->AddFixup($subdirFixup);
3213
- }
3214
- my $imageData = $$subdir{ImageData};
3215
- my $blockSize = 0;
3216
- # must also update start position for ImageData fixups
3217
- if (ref $imageData) {
3218
- my $blockInfo;
3219
- foreach $blockInfo (@$imageData) {
3220
- my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo;
3221
- if ($subFix) {
3222
- $$subFix{Start} += $len;
3223
- # save expected image data offset for calculating shift later
3224
- $$subFix{BlockLen} = length(${$$subdir{DataPt}}) + $blockSize;
3225
- }
3226
- $blockSize += $size + $pad;
3227
- }
3228
- }
3229
- $newData .= ${$$subdir{DataPt}}; # add subdirectory to our data
3230
- undef ${$$subdir{DataPt}}; # free memory now
3231
- # set the pointer
3232
- my $offset = $$subdir{Offset};
3233
- # if offset is in valBuff, it was added to the end of dirBuff
3234
- # (plus 4 bytes for nextIFD pointer)
3235
- $offset += length($dirBuff) + 4 if $$subdir{Where} eq 'valBuff';
3236
- $offset += $newStart + 2; # get offset in newData
3237
- # check to be sure we got the right offset
3238
- unless (Get32u(\$newData, $offset) == 0xfeedf00d) {
3239
- $et->Error("Internal error while rewriting $name");
3240
- return undef;
3241
- }
3242
- # set the offset to the subdirectory data
3243
- Set32u($len, \$newData, $offset);
3244
- $fixup->AddFixup($offset); # add fixup for this offset in newData
3245
- }
3246
- }
3247
- # add fixup for all offsets in directory according to value data position
3248
- # (which is at the end of this directory)
3249
- if ($dirFixup) {
3250
- $$dirFixup{Start} = $newStart + 2;
3251
- $$dirFixup{Shift} = $valPos - $$dirFixup{Start};
3252
- $fixup->AddFixup($dirFixup);
3253
- }
3254
- # add valueData fixups, adjusting for position of value data
3255
- my $valFixup;
3256
- foreach $valFixup (@valFixups) {
3257
- $$valFixup{Start} += $valPos;
3258
- $fixup->AddFixup($valFixup);
3259
- }
3260
- # stop if no next IFD pointer
3261
- last unless $isNextIFD; # stop unless scanning for multiple IFD's
3262
- if ($nextIfdOffset) {
3263
- # continue with next IFD
3264
- $dirStart = $nextIfdOffset - $dataPos;
3265
- } else {
3266
- # create IFD1 if necessary
3267
- $verbose and print $out " Creating IFD1\n";
3268
- my $ifd1 = "\0" x 2; # empty IFD1 data (zero entry count)
3269
- $dataPt = \$ifd1;
3270
- $dirStart = 0;
3271
- $dirLen = $dataLen = 2;
3272
- }
3273
- # increment IFD name
3274
- my $ifdNum = $dirName =~ s/(\d+)$// ? $1 : 0;
3275
- $dirName .= $ifdNum + 1;
3276
- $name =~ s/\d+$//;
3277
- $name .= $ifdNum + 1;
3278
- $$et{DIR_NAME} = $$et{PATH}[-1] = $dirName;
3279
- next unless $nextIfdOffset;
3280
-
3281
- # guard against writing the same directory twice
3282
- my $addr = $nextIfdOffset + $base;
3283
- if ($$et{PROCESSED}{$addr}) {
3284
- $et->Error("$name pointer references previous $$et{PROCESSED}{$addr} directory", 1);
3285
- last;
3286
- }
3287
- $$et{PROCESSED}{$addr} = $name;
3288
-
3289
- if ($dirName eq 'SubIFD1' and not ValidateIFD($dirInfo, $dirStart)) {
3290
- if ($$et{TIFF_TYPE} eq 'TIFF') {
3291
- $et->Error('Ignored bad IFD linked from SubIFD', 1);
3292
- } elsif ($verbose) {
3293
- $et->Warn('Ignored bad IFD linked from SubIFD');
3294
- }
3295
- last; # don't write bad IFD
3296
- }
3297
- if ($$et{DEL_GROUP}{$dirName}) {
3298
- $verbose and print $out " Deleting $dirName\n";
3299
- $raf and $et->Error("Deleting $dirName also deletes subsequent" .
3300
- " IFD's and possibly image data", 1);
3301
- ++$$et{CHANGED};
3302
- if ($$et{DEL_GROUP}{$dirName} == 2 and
3303
- $$et{ADD_DIRS}{$dirName})
3304
- {
3305
- my $emptyIFD = "\0" x 2; # start with empty IFD
3306
- $dataPt = \$emptyIFD;
3307
- $dirStart = 0;
3308
- $dirLen = $dataLen = 2;
3309
- } else {
3310
- last; # don't write this IFD (or any subsequent IFD)
3311
- }
3312
- } else {
3313
- $verbose and print $out " Rewriting $name\n";
3314
- }
3315
- }
3316
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3317
-
3318
- # do our fixups now so we can more easily calculate offsets below
3319
- $fixup->ApplyFixup(\$newData);
3320
- #
3321
- # determine total block size for deferred data
3322
- #
3323
- my $numBlocks = scalar @imageData; # save this so we scan only existing blocks later
3324
- my $blockSize = 0; # total size of blocks to copy later
3325
- my $blockInfo;
3326
- foreach $blockInfo (@imageData) {
3327
- my ($pos, $size, $pad) = @$blockInfo;
3328
- $blockSize += $size + $pad;
3329
- }
3330
- #
3331
- # copy over image data for IFD's, starting with the last IFD first
3332
- #
3333
- if (@offsetInfo) {
3334
- my $ttwLen; # length of MRW TTW segment
3335
- my @writeLater; # write image data last
3336
- for ($ifd=$#offsetInfo; $ifd>=-1; --$ifd) {
3337
- # build list of offsets to process
3338
- my @offsetList;
3339
- if ($ifd >= 0) {
3340
- my $offsetInfo = $offsetInfo[$ifd] or next;
3341
- # patch Panasonic RAW/RW2 StripOffsets/StripByteCounts if necessary
3342
- my $stripOffsets = $$offsetInfo{0x111};
3343
- if ($stripOffsets and $$stripOffsets[0]{PanasonicHack}) {
3344
- require Image::ExifTool::PanasonicRaw;
3345
- my $err = Image::ExifTool::PanasonicRaw::PatchRawDataOffset($offsetInfo, $raf, $ifd);
3346
- $err and $et->Error($err);
3347
- }
3348
- my $tagID;
3349
- # loop through all tags in reverse order so we save thumbnail
3350
- # data before main image data if both exist in the same IFD
3351
- foreach $tagID (reverse sort keys %$offsetInfo) {
3352
- my $tagInfo = $$offsetInfo{$tagID}[0];
3353
- next unless $$tagInfo{IsOffset}; # handle byte counts with offsets
3354
- my $sizeInfo = $$offsetInfo{$$tagInfo{OffsetPair}};
3355
- $sizeInfo or $et->Error("No size tag for $dirName:$$tagInfo{Name}"), next;
3356
- my $dataTag = $$tagInfo{DataTag};
3357
- # write TIFF image data (strips or tiles) later if requested
3358
- if ($raf and defined $$origDirInfo{ImageData} and
3359
- ($tagID == 0x111 or $tagID == 0x144 or
3360
- # also defer writing of other big data such as JpgFromRaw in NEF
3361
- ($$sizeInfo[3][0] and
3362
- # (calculate approximate combined size of all blocks)
3363
- $$sizeInfo[3][0] * scalar(@{$$sizeInfo[3]}) > 1000000)) and
3364
- # but don't defer writing if replacing with new value
3365
- (not defined $dataTag or not defined $offsetData{$dataTag}))
3366
- {
3367
- push @writeLater, [ $$offsetInfo{$tagID}, $sizeInfo ];
3368
- } else {
3369
- push @offsetList, [ $$offsetInfo{$tagID}, $sizeInfo ];
3370
- }
3371
- }
3372
- } else {
3373
- last unless @writeLater;
3374
- @offsetList = @writeLater;
3375
- }
3376
- my $offsetPair;
3377
- foreach $offsetPair (@offsetList) {
3378
- my ($tagInfo, $offsets, $count, $oldOffset) = @{$$offsetPair[0]};
3379
- my ($cntInfo, $byteCounts, $count2, $oldSize, $format) = @{$$offsetPair[1]};
3380
- # must be the same number of offset and byte count values
3381
- unless ($count == $count2) {
3382
- $et->Error("Offsets/ByteCounts disagree on count for $$tagInfo{Name}");
3383
- return undef;
3384
- }
3385
- my $formatStr = $formatName[$format];
3386
- # follow pointer to value data if necessary
3387
- $count > 1 and $offsets = Get32u(\$newData, $offsets);
3388
- my $n = $count * $formatSize[$format];
3389
- $n > 4 and $byteCounts = Get32u(\$newData, $byteCounts);
3390
- if ($byteCounts < 0 or $byteCounts + $n > length($newData)) {
3391
- $et->Error("Error reading $$tagInfo{Name} byte counts");
3392
- return undef;
3393
- }
3394
- # get offset base and data pos (abnormal for some preview images)
3395
- my ($dbase, $dpos, $wrongBase, $subIfdDataFixup);
3396
- if ($$tagInfo{IsOffset} eq '2') {
3397
- $dbase = $firstBase;
3398
- $dpos = $dataPos + $base - $firstBase;
3399
- } else {
3400
- $dbase = $base;
3401
- $dpos = $dataPos;
3402
- }
3403
- # use different base if necessary for some offsets (Minolta A200)
3404
- if ($$tagInfo{WrongBase}) {
3405
- my $self = $et;
3406
- #### eval WrongBase ($self)
3407
- $wrongBase = eval $$tagInfo{WrongBase} || 0;
3408
- $dbase += $wrongBase;
3409
- $dpos -= $wrongBase;
3410
- } else {
3411
- $wrongBase = 0;
3412
- }
3413
- my $oldOrder = GetByteOrder();
3414
- my $dataTag = $$tagInfo{DataTag};
3415
- # use different byte order for values of this offset pair if required (Minolta A200)
3416
- SetByteOrder($$tagInfo{ByteOrder}) if $$tagInfo{ByteOrder};
3417
- # transfer the data referenced by all offsets of this tag
3418
- for ($n=0; $n<$count; ++$n) {
3419
- my ($oldEnd, $size);
3420
- if (@$oldOffset and @$oldSize) {
3421
- # calculate end offset of this block
3422
- $oldEnd = $$oldOffset[$n] + $$oldSize[$n];
3423
- # update TIFF_END as if we read this data from file
3424
- UpdateTiffEnd($et, $oldEnd + $dbase);
3425
- }
3426
- my $offsetPos = $offsets + $n * 4;
3427
- my $byteCountPos = $byteCounts + $n * $formatSize[$format];
3428
- if ($$tagInfo{PanasonicHack}) {
3429
- # use actual raw data length (may be different than StripByteCounts!)
3430
- $size = $$oldSize[$n];
3431
- } else {
3432
- # use size of new data
3433
- $size = ReadValue(\$newData, $byteCountPos, $formatStr, 1, 4);
3434
- }
3435
- my $offset = $$oldOffset[$n];
3436
- if (defined $offset) {
3437
- $offset -= $dpos;
3438
- } elsif ($size != 0xfeedfeed) {
3439
- $et->Error('Internal error (no offset)');
3440
- return undef;
3441
- }
3442
- my $newOffset = length($newData) - $wrongBase;
3443
- my $buff;
3444
- # look for 'feed' code to use our new data
3445
- if ($size == 0xfeedfeed) {
3446
- unless (defined $dataTag) {
3447
- $et->Error("No DataTag defined for $$tagInfo{Name}");
3448
- return undef;
3449
- }
3450
- unless (defined $offsetData{$dataTag}) {
3451
- $et->Error("Internal error (no $dataTag)");
3452
- return undef;
3453
- }
3454
- if ($count > 1) {
3455
- $et->Error("Can't modify $$tagInfo{Name} with count $count");
3456
- return undef;
3457
- }
3458
- $buff = $offsetData{$dataTag};
3459
- if ($formatSize[$format] != 4) {
3460
- $et->Error("$$cntInfo{Name} is not int32");
3461
- return undef;
3462
- }
3463
- # set the data size
3464
- $size = length($buff);
3465
- Set32u($size, \$newData, $byteCountPos);
3466
- } elsif ($ifd < 0) {
3467
- # pad if necessary (but don't pad contiguous image blocks)
3468
- my $pad = 0;
3469
- ++$pad if $size & 0x01 and ($n+1 >= $count or not $oldEnd or
3470
- $oldEnd != $$oldOffset[$n+1]);
3471
- # preserve original image padding if specified
3472
- if ($$origDirInfo{PreserveImagePadding} and $n+1 < $count and
3473
- $oldEnd and $$oldOffset[$n+1] > $oldEnd)
3474
- {
3475
- $pad = $$oldOffset[$n+1] - $oldEnd;
3476
- }
3477
- # copy data later
3478
- push @imageData, [$offset+$dbase+$dpos, $size, $pad];
3479
- $newOffset += $blockSize; # data comes after other deferred data
3480
- # create fixup for SubIFD ImageData
3481
- if ($imageDataFlag eq 'SubIFD' and not $subIfdDataFixup) {
3482
- $subIfdDataFixup = new Image::ExifTool::Fixup;
3483
- $imageData[-1][4] = $subIfdDataFixup;
3484
- }
3485
- $size += $pad; # account for pad byte if necessary
3486
- # return ImageData list
3487
- $$origDirInfo{ImageData} = \@imageData;
3488
- } elsif ($offset >= 0 and $offset+$size <= $dataLen) {
3489
- # take data from old dir data buffer
3490
- $buff = substr($$dataPt, $offset, $size);
3491
- } elsif ($$et{TIFF_TYPE} eq 'MRW') {
3492
- # TTW segment must be an even 4 bytes long, so pad now if necessary
3493
- my $n = length $newData;
3494
- $buff = ($n & 0x03) ? "\0" x (4 - ($n & 0x03)) : '';
3495
- $size = length($buff);
3496
- # data exists after MRW TTW segment
3497
- $ttwLen = length($newData) + $size unless defined $ttwLen;
3498
- $newOffset = $offset + $dpos + $ttwLen - $dataLen;
3499
- } elsif ($raf and $raf->Seek($offset+$dbase+$dpos,0) and
3500
- $raf->Read($buff,$size) == $size)
3501
- {
3502
- # (data was read OK)
3503
- # patch incorrect ThumbnailOffset in Sony A100 1.00 ARW images
3504
- if ($$et{TIFF_TYPE} eq 'ARW' and $$tagInfo{Name} eq 'ThumbnailOffset' and
3505
- $$et{Model} eq 'DSLR-A100' and $buff !~ /^\xff\xd8\xff/)
3506
- {
3507
- my $pos = $offset + $dbase + $dpos;
3508
- my $try;
3509
- if ($pos < 0x10000 and $raf->Seek($pos+0x10000,0) and
3510
- $raf->Read($try,$size) == $size and $try =~ /^\xff\xd8\xff/)
3511
- {
3512
- $buff = $try;
3513
- $et->Warn('Adjusted incorrect A100 ThumbnailOffset', 1);
3514
- } else {
3515
- $et->Error('Invalid ThumbnailImage');
3516
- }
3517
- }
3518
- } elsif ($$tagInfo{Name} eq 'ThumbnailOffset' and $offset>=0 and $offset<$dataLen) {
3519
- # Grrr. The Canon 350D writes the thumbnail with an incorrect byte count
3520
- my $diff = $offset + $size - $dataLen;
3521
- $et->Warn("ThumbnailImage runs outside EXIF data by $diff bytes (truncated)",1);
3522
- # set the size to the available data
3523
- $size -= $diff;
3524
- unless (WriteValue($size, $formatStr, 1, \$newData, $byteCountPos)) {
3525
- warn 'Internal error writing thumbnail size';
3526
- }
3527
- # get the truncated image
3528
- $buff = substr($$dataPt, $offset, $size);
3529
- } elsif ($$tagInfo{Name} eq 'PreviewImageStart' and $$et{FILE_TYPE} eq 'JPEG') {
3530
- # try to load the preview image using the specified offset
3531
- undef $buff;
3532
- my $r = $$et{RAF};
3533
- if ($r and not $raf) {
3534
- my $tell = $r->Tell();
3535
- # read and validate
3536
- undef $buff unless $r->Seek($offset+$base+$dataPos,0) and
3537
- $r->Read($buff,$size) == $size and
3538
- $buff =~ /^.\xd8\xff[\xc4\xdb\xe0-\xef]/s;
3539
- $r->Seek($tell, 0) or $et->Error('Seek error'), return undef;
3540
- }
3541
- # set flag if we must load PreviewImage
3542
- $buff = 'LOAD_PREVIEW' unless defined $buff;
3543
- } else {
3544
- my $dataName = $dataTag || $$tagInfo{Name};
3545
- return undef if $et->Error("Error reading $dataName data in $name", $inMakerNotes);
3546
- $buff = '';
3547
- }
3548
- if ($$tagInfo{Name} eq 'PreviewImageStart') {
3549
- if ($$et{FILE_TYPE} eq 'JPEG' and not $$tagInfo{MakerPreview}) {
3550
- # hold onto the PreviewImage until we can determine if it fits
3551
- $$et{PREVIEW_INFO} or $$et{PREVIEW_INFO} = {
3552
- Data => $buff,
3553
- Fixup => new Image::ExifTool::Fixup,
3554
- };
3555
- if ($$tagInfo{IsOffset} and $$tagInfo{IsOffset} eq '2') {
3556
- $$et{PREVIEW_INFO}{NoBaseShift} = 1;
3557
- }
3558
- if ($offset >= 0 and $offset+$size <= $dataLen) {
3559
- # set flag indicating this preview wasn't in a trailer
3560
- $$et{PREVIEW_INFO}{WasContained} = 1;
3561
- }
3562
- $buff = '';
3563
- } elsif ($$et{TIFF_TYPE} eq 'ARW' and $$et{Model} eq 'DSLR-A100') {
3564
- # the A100 double-references the same preview, so ignore the
3565
- # second one (the offset and size will be patched later)
3566
- next if $$et{A100PreviewLength};
3567
- $$et{A100PreviewLength} = length $buff if defined $buff;
3568
- }
3569
- }
3570
- # update offset accordingly and add to end of new data
3571
- Set32u($newOffset, \$newData, $offsetPos);
3572
- # add a pointer to fix up this offset value (marked with DataTag name)
3573
- $fixup->AddFixup($offsetPos, $dataTag);
3574
- # also add to subIfdDataFixup if necessary
3575
- $subIfdDataFixup->AddFixup($offsetPos, $dataTag) if $subIfdDataFixup;
3576
- # must also (sometimes) update StripOffsets in Panasonic RW2 images
3577
- my $otherPos = $$offsetPair[0][5];
3578
- if ($otherPos and $$tagInfo{PanasonicHack}) {
3579
- Set32u($newOffset, \$newData, $otherPos);
3580
- $fixup->AddFixup($otherPos, $dataTag);
3581
- }
3582
- if ($ifd >= 0) {
3583
- # buff length must be even (Note: may have changed since $size was set)
3584
- $buff .= "\0" if length($buff) & 0x01;
3585
- $newData .= $buff; # add this strip to the data
3586
- } else {
3587
- $blockSize += $size; # keep track of total size
3588
- }
3589
- }
3590
- SetByteOrder($oldOrder);
3591
- }
3592
- }
3593
- # verify that nothing else got written after determining TTW length
3594
- if (defined $ttwLen and $ttwLen != length($newData)) {
3595
- $et->Error('Internal error writing MRW TTW');
3596
- }
3597
- }
3598
- #
3599
- # set offsets and generate fixups for tag values which were too large for memory
3600
- #
3601
- $blockSize = 0;
3602
- foreach $blockInfo (@imageData) {
3603
- my ($pos, $size, $pad, $entry, $subFix) = @$blockInfo;
3604
- if (defined $entry) {
3605
- my $format = Get16u(\$newData, $entry + 2);
3606
- if ($format < 1 or $format > 13) {
3607
- $et->Error('Internal error copying huge value');
3608
- last;
3609
- } else {
3610
- # set count and offset in directory entry
3611
- Set32u($size / $formatSize[$format], \$newData, $entry + 4);
3612
- Set32u(length($newData)+$blockSize, \$newData, $entry + 8);
3613
- $fixup->AddFixup($entry + 8);
3614
- # create special fixup for SubIFD data
3615
- if ($imageDataFlag eq 'SubIFD') {
3616
- my $subIfdDataFixup = new Image::ExifTool::Fixup;
3617
- $subIfdDataFixup->AddFixup($entry + 8);
3618
- # save fixup in imageData list
3619
- $$blockInfo[4] = $subIfdDataFixup;
3620
- }
3621
- # must reset entry pointer so we don't use it again in a parent IFD!
3622
- $$blockInfo[3] = undef;
3623
- }
3624
- }
3625
- # apply additional shift required for contained SubIFD image data offsets
3626
- if ($subFix and defined $$subFix{BlockLen} and $numBlocks > 0) {
3627
- # our offset expects the data at the end of the SubIFD block (BlockLen + Start),
3628
- # but it will actually be at length($newData) + $blockSize. So adjust
3629
- # accordingly (and subtract an extra Start because this shift is applied later)
3630
- $$subFix{Shift} += length($newData) - $$subFix{BlockLen} - 2 * $$subFix{Start} + $blockSize;
3631
- $subFix->ApplyFixup(\$newData);
3632
- }
3633
- $blockSize += $size + $pad;
3634
- --$numBlocks;
3635
- }
3636
- #
3637
- # apply final shift to new data position if this is the top level IFD
3638
- #
3639
- unless ($$dirInfo{Fixup}) {
3640
- my $hdrPtr = $$dirInfo{HeaderPtr};
3641
- my $newDataPos = $hdrPtr ? length $$hdrPtr : $$dirInfo{NewDataPos} || 0;
3642
- # adjust CanonVRD offset to point to end of regular TIFF if necessary
3643
- # (NOTE: This will be incorrect if multiple trailers exist,
3644
- # but it is unlikely that it could ever be correct in this case anyway.
3645
- # Also, this doesn't work for JPEG images (but CanonDPP doesn't set
3646
- # this when editing JPEG images anyway))
3647
- $fixup->SetMarkerPointers(\$newData, 'CanonVRD', length($newData) + $blockSize);
3648
- if ($newDataPos) {
3649
- $$fixup{Shift} += $newDataPos;
3650
- $fixup->ApplyFixup(\$newData);
3651
- }
3652
- # save fixup for adjusting Leica trailer offset if necessary
3653
- $$et{LeicaTrailer}{Fixup}->AddFixup($fixup) if $$et{LeicaTrailer};
3654
- # save fixup for PreviewImage in JPEG file if necessary
3655
- my $previewInfo = $$et{PREVIEW_INFO};
3656
- if ($previewInfo) {
3657
- my $pt = \$$previewInfo{Data}; # image data or 'LOAD_PREVIEW' flag
3658
- # now that we know the size of the EXIF data, first test to see if our new image fits
3659
- # inside the EXIF segment (remember about the TIFF and EXIF headers: 8+6 bytes)
3660
- if (($$pt ne 'LOAD_PREVIEW' and length($$pt) + length($newData) + 14 <= 0xfffd and
3661
- not $$previewInfo{IsTrailer}) or
3662
- $$previewInfo{IsShort}) # must fit in this segment if using short pointers
3663
- {
3664
- # It fits! (or must exist in EXIF segment), so fixup the
3665
- # PreviewImage pointers and stuff the preview image in here
3666
- my $newPos = length($newData) + $newDataPos;
3667
- $newPos += ($$previewInfo{BaseShift} || 0);
3668
- if ($$previewInfo{Relative}) {
3669
- # calculate our base by looking at how far the pointer got shifted
3670
- $newPos -= ($fixup->GetMarkerPointers(\$newData, 'PreviewImage') || 0);
3671
- }
3672
- $fixup->SetMarkerPointers(\$newData, 'PreviewImage', $newPos);
3673
- $newData .= $$pt;
3674
- # set flag to delete old preview unless it was contained in the EXIF
3675
- $$et{DEL_PREVIEW} = 1 unless $$et{PREVIEW_INFO}{WasContained};
3676
- delete $$et{PREVIEW_INFO}; # done with our preview data
3677
- } else {
3678
- # Doesn't fit, or we still don't know, so save fixup information
3679
- # and put the preview at the end of the file
3680
- $$previewInfo{Fixup} or $$previewInfo{Fixup} = new Image::ExifTool::Fixup;
3681
- $$previewInfo{Fixup}->AddFixup($fixup);
3682
- }
3683
- } elsif (defined $newData and $deleteAll) {
3684
- $newData = ''; # delete both IFD0 and IFD1 since only mandatory tags remain
3685
- } elsif ($$et{A100PreviewLength}) {
3686
- # save preview image start for patching A100 quirks later
3687
- $$et{A100PreviewStart} = $fixup->GetMarkerPointers(\$newData, 'PreviewImage');
3688
- }
3689
- # save location of last IFD for use in Canon RAW header
3690
- if ($newDataPos == 16) {
3691
- my @ifdPos = $fixup->GetMarkerPointers(\$newData,'NextIFD');
3692
- $$origDirInfo{LastIFD} = pop @ifdPos;
3693
- }
3694
- # recrypt SR2 SubIFD data if necessary
3695
- my $key = $$et{SR2SubIFDKey};
3696
- if ($key) {
3697
- my $start = $fixup->GetMarkerPointers(\$newData, 'SR2SubIFDOffset');
3698
- my $len = $$et{SR2SubIFDLength};
3699
- # (must subtract 8 for size of TIFF header)
3700
- if ($start and $start - 8 + $len <= length $newData) {
3701
- require Image::ExifTool::Sony;
3702
- Image::ExifTool::Sony::Decrypt(\$newData, $start - 8, $len, $key);
3703
- }
3704
- }
3705
- }
3706
- # return empty string if no entries in directory
3707
- # (could be up to 10 bytes and still be empty)
3708
- $newData = '' if defined $newData and length($newData) < 12;
3709
-
3710
- return $newData; # return our directory data
3711
- }
3712
-
3713
- 1; # end
3714
-
3715
- __END__
3716
-
3717
- =head1 NAME
3718
-
3719
- Image::ExifTool::WriteExif.pl - Write EXIF meta information
3720
-
3721
- =head1 SYNOPSIS
3722
-
3723
- This file is autoloaded by Image::ExifTool::Exif.
3724
-
3725
- =head1 DESCRIPTION
3726
-
3727
- This file contains routines to write EXIF metadata.
3728
-
3729
- =head1 AUTHOR
3730
-
3731
- Copyright 2003-2015, Phil Harvey (phil at owl.phy.queensu.ca)
3732
-
3733
- This library is free software; you can redistribute it and/or modify it
3734
- under the same terms as Perl itself.
3735
-
3736
- =head1 SEE ALSO
3737
-
3738
- L<Image::ExifTool::Exif(3pm)|Image::ExifTool::Exif>,
3739
- L<Image::ExifTool(3pm)|Image::ExifTool>
3740
-
3741
- =cut