exiftool_vendored 9.37.0 → 9.41.0

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

Potentially problematic release.


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

Files changed (889) hide show
  1. checksums.yaml +6 -14
  2. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/Changes +74 -0
  3. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/MANIFEST +14 -0
  4. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/META.yml +1 -1
  5. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/Makefile.PL +0 -0
  6. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/README +30 -30
  7. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/exif2iptc.args +0 -0
  8. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/exif2xmp.args +0 -0
  9. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/gps2xmp.args +0 -0
  10. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptc2exif.args +0 -0
  11. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptc2xmp.args +0 -0
  12. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptcCore.args +0 -0
  13. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/pdf2xmp.args +0 -0
  14. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2exif.args +0 -0
  15. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2gps.args +0 -0
  16. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2iptc.args +0 -0
  17. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2pdf.args +0 -0
  18. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/config_files/ExifTool_config +0 -0
  19. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/config_files/convert_regions.config +0 -0
  20. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/exiftool +266 -226
  21. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/gpx.fmt +0 -0
  22. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/gpx_wpt.fmt +0 -0
  23. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/kml.fmt +0 -0
  24. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/ExifTool.html +79 -54
  25. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/Shift.html +0 -0
  27. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/AFCP.html +0 -0
  28. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/AIFF.html +0 -0
  29. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/APE.html +0 -0
  30. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/APP12.html +0 -0
  31. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ASF.html +0 -0
  32. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Apple.html +11 -8
  33. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/BMP.html +0 -0
  34. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Canon.html +138 -14
  35. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonCustom.html +0 -0
  36. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonRaw.html +0 -0
  37. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonVRD.html +0 -0
  38. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Casio.html +0 -0
  39. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Composite.html +19 -13
  40. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DICOM.html +0 -0
  41. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DNG.html +0 -0
  42. data/bin/Image-ExifTool-9.41/html/TagNames/DPX.html +190 -0
  43. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DV.html +0 -0
  44. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DarwinCore.html +0 -0
  45. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DjVu.html +0 -0
  46. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/EXE.html +0 -0
  47. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/EXIF.html +0 -0
  48. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Extra.html +13 -6
  49. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FLAC.html +0 -0
  50. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FLIR.html +166 -2
  51. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Flash.html +0 -0
  52. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FlashPix.html +0 -0
  53. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Font.html +0 -0
  54. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FotoStation.html +0 -0
  55. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FujiFilm.html +11 -1
  56. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GE.html +0 -0
  57. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GIF.html +0 -0
  58. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GIMP.html +0 -0
  59. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GPS.html +0 -0
  60. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GeoTiff.html +0 -0
  61. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/H264.html +0 -0
  62. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/HP.html +0 -0
  63. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/HTML.html +0 -0
  64. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ICC_Profile.html +0 -0
  65. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ID3.html +0 -0
  66. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/IPTC.html +3 -3
  67. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ITC.html +0 -0
  68. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JFIF.html +0 -0
  69. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JPEG.html +6 -4
  70. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JVC.html +0 -0
  71. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Jpeg2000.html +0 -0
  72. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Kodak.html +0 -0
  73. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/KyoceraRaw.html +0 -0
  74. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/LNK.html +0 -0
  75. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Leaf.html +0 -0
  76. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/M2TS.html +0 -0
  77. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MIE.html +0 -0
  78. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MIFF.html +0 -0
  79. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MNG.html +0 -0
  80. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPC.html +0 -0
  81. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPEG.html +0 -0
  82. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPF.html +0 -0
  83. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MWG.html +0 -0
  84. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MXF.html +0 -0
  85. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Matroska.html +0 -0
  86. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Microsoft.html +0 -0
  87. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Minolta.html +30 -19
  88. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MinoltaRaw.html +0 -0
  89. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Nikon.html +81 -60
  90. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/NikonCapture.html +0 -0
  91. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/NikonCustom.html +0 -0
  92. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/OOXML.html +0 -0
  93. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Ogg.html +0 -0
  94. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Olympus.html +0 -0
  95. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/OpenEXR.html +0 -0
  96. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PDF.html +6 -6
  97. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PGF.html +0 -0
  98. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PICT.html +0 -0
  99. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PLIST.html +0 -0
  100. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PNG.html +25 -18
  101. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PSP.html +0 -0
  102. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Panasonic.html +51 -14
  103. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PanasonicRaw.html +0 -0
  104. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Pentax.html +23 -6
  105. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhaseOne.html +0 -0
  106. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhotoCD.html +0 -0
  107. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhotoMechanic.html +0 -0
  108. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Photoshop.html +0 -0
  109. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PostScript.html +0 -0
  110. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PrintIM.html +0 -0
  111. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Qualcomm.html +0 -0
  112. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/QuickTime.html +404 -126
  113. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RIFF.html +19 -13
  114. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RSRC.html +0 -0
  115. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RTF.html +0 -0
  116. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Radiance.html +0 -0
  117. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Rawzor.html +0 -0
  118. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Real.html +0 -0
  119. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Reconyx.html +0 -0
  120. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Ricoh.html +0 -0
  121. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Samsung.html +27 -1
  122. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sanyo.html +0 -0
  123. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Scalado.html +0 -0
  124. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Shortcuts.html +0 -0
  125. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sigma.html +0 -0
  126. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/SigmaRaw.html +0 -0
  127. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sony.html +491 -121
  128. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/SonyIDC.html +0 -0
  129. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Stim.html +0 -0
  130. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Theora.html +0 -0
  131. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Torrent.html +0 -0
  132. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Unknown.html +0 -0
  133. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Vorbis.html +0 -0
  134. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/XMP.html +824 -175
  135. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ZIP.html +0 -0
  136. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/iWork.html +0 -0
  137. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/index.html +7 -5
  138. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/style.css +0 -0
  139. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/ancient_history.html +201 -0
  140. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/canon_raw.html +0 -0
  141. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/commentary.html +0 -0
  142. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/config.html +0 -0
  143. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/data_members.html +9 -0
  144. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/exiftool_pod.html +92 -71
  145. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/faq.html +0 -0
  146. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/filename.html +0 -0
  147. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/geotag.html +13 -9
  148. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/history.html +82 -201
  149. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/htmldump.html +0 -0
  150. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/idiosyncracies.html +4 -2
  151. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/index.html +46 -35
  152. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/install.html +0 -0
  153. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/metafiles.html +0 -0
  154. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/overview.png +0 -0
  155. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/standards.html +0 -0
  156. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/struct.html +0 -0
  157. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/style.css +0 -0
  158. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/under.html +0 -0
  159. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/verbose.html +0 -0
  160. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/writing.html +0 -0
  161. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/File/RandomAccess.pm +0 -0
  162. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/File/RandomAccess.pod +0 -0
  163. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool.pm +387 -331
  164. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool.pod +101 -81
  165. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AES.pm +0 -0
  166. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AFCP.pm +14 -14
  167. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AIFF.pm +17 -17
  168. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/APE.pm +18 -18
  169. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/APP12.pm +21 -21
  170. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ASF.pm +48 -48
  171. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Apple.pm +31 -19
  172. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BMP.pm +4 -4
  173. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BZZ.pm +0 -0
  174. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BigTIFF.pm +36 -36
  175. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BuildTagLookup.pm +12 -12
  176. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Canon.pm +126 -38
  177. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonCustom.pm +37 -37
  178. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonRaw.pm +30 -30
  179. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonVRD.pm +75 -75
  180. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CaptureOne.pm +18 -18
  181. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Casio.pm +0 -0
  182. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset.pm +13 -13
  183. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
  184. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
  185. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
  186. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
  187. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
  188. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
  189. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
  190. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
  191. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
  192. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
  193. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
  194. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
  195. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
  196. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
  197. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
  198. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
  199. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
  200. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
  201. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
  202. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
  203. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
  204. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
  205. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
  206. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
  207. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
  208. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
  209. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
  210. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
  211. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
  212. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
  213. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DICOM.pm +56 -17
  214. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DNG.pm +85 -85
  215. data/bin/Image-ExifTool-9.41/lib/Image/ExifTool/DPX.pm +151 -0
  216. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DV.pm +6 -6
  217. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DarwinCore.pm +0 -0
  218. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DjVu.pm +14 -14
  219. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/EXE.pm +47 -47
  220. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Exif.pm +126 -116
  221. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FLAC.pm +14 -14
  222. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FLIR.pm +282 -22
  223. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Fixup.pm +0 -0
  224. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Flash.pm +41 -41
  225. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FlashPix.pm +97 -97
  226. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Font.pm +46 -46
  227. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FotoStation.pm +21 -20
  228. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FujiFilm.pm +40 -38
  229. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GE.pm +0 -0
  230. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GIF.pm +32 -32
  231. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GIMP.pm +11 -11
  232. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GPS.pm +3 -3
  233. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GeoTiff.pm +19 -19
  234. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Geotag.pm +69 -66
  235. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/H264.pm +42 -42
  236. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HP.pm +9 -9
  237. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HTML.pm +16 -16
  238. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HtmlDump.pm +10 -10
  239. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ICC_Profile.pm +48 -48
  240. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ID3.pm +84 -84
  241. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/IPTC.pm +38 -38
  242. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ITC.pm +11 -11
  243. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Import.pm +0 -0
  244. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/InDesign.pm +18 -18
  245. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JPEG.pm +10 -6
  246. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JPEGDigest.pm +4 -4
  247. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JVC.pm +8 -8
  248. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Jpeg2000.pm +50 -58
  249. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Kodak.pm +15 -15
  250. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/KyoceraRaw.pm +4 -4
  251. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/LNK.pm +24 -24
  252. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/cs.pm +0 -0
  253. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/de.pm +0 -0
  254. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/en_ca.pm +0 -0
  255. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/en_gb.pm +0 -0
  256. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/es.pm +0 -0
  257. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/fi.pm +0 -0
  258. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/fr.pm +1 -1
  259. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/it.pm +0 -0
  260. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ja.pm +0 -0
  261. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ko.pm +0 -0
  262. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/nl.pm +0 -0
  263. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/pl.pm +0 -0
  264. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ru.pm +0 -0
  265. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/sv.pm +0 -0
  266. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/tr.pm +0 -0
  267. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/zh_cn.pm +0 -0
  268. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/zh_tw.pm +0 -0
  269. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Leaf.pm +11 -11
  270. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/M2TS.pm +37 -37
  271. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIE.pm +95 -95
  272. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIEUnits.pod +0 -0
  273. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIFF.pm +17 -17
  274. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MNG.pm +0 -0
  275. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPC.pm +11 -11
  276. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPEG.pm +28 -28
  277. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPF.pm +22 -22
  278. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MWG.pm +9 -9
  279. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MXF.pm +46 -46
  280. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MakerNotes.pm +61 -59
  281. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Matroska.pm +27 -27
  282. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Microsoft.pm +8 -8
  283. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Minolta.pm +50 -28
  284. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MinoltaRaw.pm +17 -17
  285. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Nikon.pm +80 -63
  286. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/NikonCapture.pm +29 -29
  287. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/NikonCustom.pm +0 -0
  288. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/OOXML.pm +20 -20
  289. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Ogg.pm +19 -19
  290. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Olympus.pm +3 -3
  291. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/OpenEXR.pm +16 -16
  292. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PDF.pm +126 -126
  293. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PGF.pm +7 -7
  294. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PICT.pm +18 -18
  295. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PLIST.pm +39 -39
  296. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PNG.pm +141 -95
  297. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PPM.pm +11 -11
  298. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PSP.pm +14 -14
  299. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Panasonic.pm +82 -37
  300. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PanasonicRaw.pm +40 -40
  301. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Pentax.pm +86 -14
  302. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhaseOne.pm +36 -36
  303. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhotoCD.pm +4 -4
  304. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhotoMechanic.pm +12 -12
  305. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Photoshop.pm +23 -23
  306. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PostScript.pm +36 -36
  307. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PrintIM.pm +10 -10
  308. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Qualcomm.pm +5 -5
  309. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/QuickTime.pm +528 -219
  310. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/README +5 -3
  311. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RIFF.pm +40 -32
  312. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RSRC.pm +15 -15
  313. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RTF.pm +15 -15
  314. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Radiance.pm +9 -9
  315. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Rawzor.pm +19 -19
  316. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Real.pm +43 -43
  317. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Reconyx.pm +0 -0
  318. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Ricoh.pm +24 -24
  319. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Samsung.pm +41 -15
  320. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sanyo.pm +0 -0
  321. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Scalado.pm +5 -5
  322. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Shift.pl +0 -0
  323. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Shortcuts.pm +0 -0
  324. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sigma.pm +0 -0
  325. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/SigmaRaw.pm +56 -56
  326. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sony.pm +450 -166
  327. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/SonyIDC.pm +9 -9
  328. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Stim.pm +0 -0
  329. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagInfoXML.pm +6 -4
  330. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagLookup.pm +1707 -1468
  331. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagNames.pod +568 -102
  332. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Theora.pm +0 -0
  333. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Torrent.pm +11 -11
  334. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Unknown.pm +0 -0
  335. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Vorbis.pm +5 -5
  336. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteCanonRaw.pl +51 -51
  337. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteExif.pl +273 -273
  338. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteIPTC.pl +44 -44
  339. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePDF.pl +45 -39
  340. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePNG.pl +86 -40
  341. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePhotoshop.pl +27 -27
  342. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePostScript.pl +47 -47
  343. data/bin/Image-ExifTool-9.41/lib/Image/ExifTool/WriteQuickTime.pl +344 -0
  344. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteXMP.pl +112 -112
  345. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Writer.pl +428 -360
  346. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMP.pm +195 -104
  347. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMP2.pl +1 -0
  348. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMPStruct.pl +53 -52
  349. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ZIP.pm +50 -50
  350. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/iWork.pm +17 -17
  351. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/perl-Image-ExifTool.spec +31 -31
  352. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP.t +0 -0
  353. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP_2.out +0 -0
  354. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP_3.out +0 -0
  355. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AIFF.t +0 -0
  356. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AIFF_2.out +0 -0
  357. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE.t +0 -0
  358. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE_2.out +0 -0
  359. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE_3.out +0 -0
  360. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ASF.t +0 -0
  361. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ASF_2.out +0 -0
  362. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BMP.t +0 -0
  363. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BMP_2.out +0 -0
  364. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BigTIFF.t +0 -0
  365. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BigTIFF_2.out +0 -0
  366. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon.t +0 -0
  367. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw.t +0 -0
  368. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_2.out +0 -0
  369. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_4.out +5 -7
  370. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_5.out +0 -0
  371. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_6.out +0 -0
  372. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_7.out +0 -0
  373. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD.t +0 -0
  374. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_11.out +0 -0
  375. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_12.out +0 -0
  376. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_2.out +0 -0
  377. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_3.out +0 -0
  378. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_4.out +0 -0
  379. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_5.out +0 -0
  380. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_6.out +0 -0
  381. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_7.out +0 -0
  382. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_8.out +0 -0
  383. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_9.out +0 -0
  384. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon_2.out +4 -3
  385. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon_3.out +0 -0
  386. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio.t +0 -0
  387. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_2.out +0 -0
  388. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_3.out +0 -0
  389. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_4.out +0 -0
  390. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_5.out +0 -0
  391. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_6.out +0 -0
  392. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DICOM.t +0 -0
  393. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DICOM_2.out +0 -0
  394. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG.t +0 -0
  395. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG_2.out +0 -0
  396. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG_3.out +0 -0
  397. data/bin/Image-ExifTool-9.41/t/DPX.t +28 -0
  398. data/bin/Image-ExifTool-9.41/t/DPX_2.out +35 -0
  399. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DV.t +0 -0
  400. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DV_2.out +0 -0
  401. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DjVu.t +0 -0
  402. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DjVu_2.out +0 -0
  403. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE.t +0 -0
  404. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_2.out +0 -0
  405. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_3.out +0 -0
  406. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_4.out +0 -0
  407. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool.t +0 -0
  408. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_16.out +0 -0
  409. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_17.out +0 -0
  410. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_2.out +0 -0
  411. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_20.out +0 -0
  412. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_21.out +0 -0
  413. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_22.out +0 -0
  414. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_23.out +0 -0
  415. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_24.out +0 -0
  416. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_25.out +0 -0
  417. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_26.out +0 -0
  418. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_3.out +0 -0
  419. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_4.out +0 -0
  420. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_5.out +0 -0
  421. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_6.out +0 -0
  422. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_7.out +0 -0
  423. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_8.out +0 -0
  424. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_9.out +0 -0
  425. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC.t +0 -0
  426. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC_2.out +0 -0
  427. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC_3.out +0 -0
  428. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR.t +0 -0
  429. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR_2.out +0 -0
  430. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR_3.out +0 -0
  431. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash.t +0 -0
  432. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FlashPix.t +0 -0
  433. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FlashPix_2.out +0 -0
  434. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash_2.out +0 -0
  435. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash_3.out +0 -0
  436. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font.t +0 -0
  437. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_2.out +0 -0
  438. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_3.out +0 -0
  439. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_4.out +0 -0
  440. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_5.out +0 -0
  441. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_6.out +0 -0
  442. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_7.out +0 -0
  443. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation.t +0 -0
  444. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation_2.out +0 -0
  445. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation_3.out +0 -0
  446. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm.t +0 -0
  447. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_2.out +0 -0
  448. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_3.out +0 -0
  449. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_4.out +0 -0
  450. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_5.out +0 -0
  451. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE.t +0 -0
  452. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE_2.out +0 -0
  453. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE_3.out +0 -0
  454. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF.t +0 -0
  455. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_2.out +0 -0
  456. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_3.out +0 -0
  457. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_4.out +0 -0
  458. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIMP.t +0 -0
  459. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIMP_2.out +0 -0
  460. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS.t +0 -0
  461. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS_2.out +0 -0
  462. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS_3.out +0 -0
  463. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff.t +0 -0
  464. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff_2.out +0 -0
  465. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff_3.out +0 -0
  466. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag.t +18 -1
  467. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_2.out +0 -0
  468. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_3.out +0 -0
  469. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_5.out +0 -0
  470. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_6.out +0 -0
  471. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_7.out +0 -0
  472. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_8.out +0 -0
  473. data/bin/Image-ExifTool-9.41/t/Geotag_9.out +7 -0
  474. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/HTML.t +0 -0
  475. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/HTML_2.out +0 -0
  476. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC.t +0 -0
  477. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_2.out +0 -0
  478. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_4.out +0 -0
  479. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_5.out +0 -0
  480. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_6.out +0 -0
  481. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_7.out +0 -0
  482. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_8.out +0 -0
  483. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ITC.t +0 -0
  484. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ITC_2.out +0 -0
  485. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign.t +0 -0
  486. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_2.out +0 -0
  487. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_3.out +0 -0
  488. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_4.out +0 -0
  489. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC.t +0 -0
  490. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC_2.out +0 -0
  491. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC_3.out +0 -0
  492. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000.t +0 -0
  493. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_2.out +0 -0
  494. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_3.out +0 -0
  495. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_4.out +0 -0
  496. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak.t +0 -0
  497. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak_2.out +0 -0
  498. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak_3.out +0 -0
  499. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/KyoceraRaw.t +0 -0
  500. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/KyoceraRaw_2.out +0 -0
  501. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/LNK.t +0 -0
  502. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/LNK_2.out +0 -0
  503. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang.t +0 -0
  504. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_1.out +0 -0
  505. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_10.out +0 -0
  506. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_11.out +0 -0
  507. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_12.out +0 -0
  508. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_13.out +0 -0
  509. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_14.out +0 -0
  510. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_15.out +0 -0
  511. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_16.out +0 -0
  512. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_17.out +0 -0
  513. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_18.out +0 -0
  514. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_2.out +0 -0
  515. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_3.out +0 -0
  516. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_4.out +0 -0
  517. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_5.out +0 -0
  518. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_6.out +0 -0
  519. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_7.out +0 -0
  520. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_8.out +0 -0
  521. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_9.out +0 -0
  522. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/M2TS.t +0 -0
  523. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/M2TS_2.out +0 -0
  524. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE.t +0 -0
  525. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_2.out +0 -0
  526. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_3.out +0 -0
  527. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_5.out +0 -0
  528. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_6.out +0 -0
  529. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIFF.t +0 -0
  530. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIFF_2.out +0 -0
  531. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MP3.t +0 -0
  532. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MP3_2.out +0 -0
  533. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG.t +0 -0
  534. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_2.out +0 -0
  535. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_3.out +0 -0
  536. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_4.out +0 -0
  537. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_5.out +0 -0
  538. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_6.out +0 -0
  539. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MXF.t +0 -0
  540. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MXF_2.out +0 -0
  541. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Matroska.t +0 -0
  542. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Matroska_2.out +0 -0
  543. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta.t +0 -0
  544. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_2.out +0 -0
  545. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_3.out +0 -0
  546. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_4.out +0 -0
  547. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon.t +0 -0
  548. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_2.out +0 -0
  549. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_3.out +0 -0
  550. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_4.out +0 -0
  551. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_5.out +0 -0
  552. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_7.out +0 -0
  553. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_8.out +0 -0
  554. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus.t +0 -0
  555. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_2.out +0 -0
  556. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_3.out +0 -0
  557. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_4.out +0 -0
  558. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_5.out +0 -0
  559. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_6.out +0 -0
  560. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_7.out +0 -0
  561. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/OpenEXR.t +0 -0
  562. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/OpenEXR_2.out +0 -0
  563. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF.t +0 -0
  564. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_10.out +0 -0
  565. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_11.out +0 -0
  566. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_12.out +0 -0
  567. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_14.out +0 -0
  568. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_15.out +0 -0
  569. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_16.out +0 -0
  570. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_17.out +0 -0
  571. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_18.out +0 -0
  572. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_19.out +0 -0
  573. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_2.out +0 -0
  574. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_20.out +0 -0
  575. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_22.out +0 -0
  576. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_4.out +0 -0
  577. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_5.out +0 -0
  578. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_6.out +0 -0
  579. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_7.out +0 -0
  580. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_8.out +0 -0
  581. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_9.out +0 -0
  582. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PGF.t +0 -0
  583. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PGF_2.out +0 -0
  584. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PICT.t +0 -0
  585. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PICT_2.out +0 -0
  586. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST.t +0 -0
  587. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST_2.out +0 -0
  588. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST_3.out +0 -0
  589. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG.t +31 -1
  590. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_2.out +0 -0
  591. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_3.out +0 -0
  592. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_4.out +0 -0
  593. data/bin/Image-ExifTool-9.41/t/PNG_5.out +17 -0
  594. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM.t +0 -0
  595. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM_2.out +0 -0
  596. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM_3.out +0 -0
  597. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PSP.t +0 -0
  598. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PSP_2.out +0 -0
  599. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic.t +0 -0
  600. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_2.out +0 -0
  601. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_3.out +0 -0
  602. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_4.out +0 -0
  603. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_5.out +0 -0
  604. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax.t +0 -0
  605. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_2.out +0 -0
  606. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_3.out +0 -0
  607. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_4.out +0 -0
  608. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoCD.t +0 -0
  609. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoCD_2.out +0 -0
  610. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic.t +0 -0
  611. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic_2.out +0 -0
  612. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic_3.out +0 -0
  613. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop.t +0 -0
  614. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop_2.out +0 -0
  615. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop_3.out +0 -0
  616. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript.t +0 -0
  617. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript_2.out +0 -0
  618. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript_3.out +0 -0
  619. data/bin/Image-ExifTool-9.41/t/QuickTime.t +54 -0
  620. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/QuickTime_2.out +10 -8
  621. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/QuickTime_3.out +10 -8
  622. data/bin/Image-ExifTool-9.41/t/QuickTime_4.out +16 -0
  623. data/bin/Image-ExifTool-9.41/t/QuickTime_5.out +12 -0
  624. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF.t +0 -0
  625. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_2.out +0 -0
  626. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_3.out +0 -0
  627. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_4.out +0 -0
  628. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RTF.t +0 -0
  629. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RTF_2.out +0 -0
  630. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Radiance.t +0 -0
  631. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Radiance_2.out +0 -0
  632. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real.t +0 -0
  633. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_2.out +0 -0
  634. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_3.out +0 -0
  635. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_4.out +0 -0
  636. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh.t +0 -0
  637. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_2.out +0 -0
  638. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_3.out +0 -0
  639. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_4.out +0 -0
  640. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo.t +0 -0
  641. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo_2.out +0 -0
  642. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo_3.out +0 -0
  643. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma.t +0 -0
  644. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_2.out +0 -0
  645. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_3.out +0 -0
  646. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_4.out +0 -0
  647. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_5.out +0 -0
  648. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony.t +0 -0
  649. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_2.out +0 -0
  650. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_3.out +0 -0
  651. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_5.out +0 -0
  652. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/TestLib.pm +0 -0
  653. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Torrent.t +0 -0
  654. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Torrent_2.out +0 -0
  655. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown.t +0 -0
  656. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown_2.out +0 -0
  657. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown_3.out +0 -0
  658. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Vorbis.t +0 -0
  659. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Vorbis_2.out +0 -0
  660. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer.t +53 -1
  661. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_10.out +0 -0
  662. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_11.out +0 -0
  663. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_13.out +0 -0
  664. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_14.out +0 -0
  665. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_15.out +0 -0
  666. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_16.out +0 -0
  667. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_17.out +0 -0
  668. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_18.out +0 -0
  669. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_19.out +0 -0
  670. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_2.out +0 -0
  671. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_22.out +0 -0
  672. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_24.out +0 -0
  673. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_25.out +0 -0
  674. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_26.out +0 -0
  675. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_27.out +0 -0
  676. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_28.out +0 -0
  677. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_29.out +0 -0
  678. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_30.out +0 -0
  679. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_31.out +0 -0
  680. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_32.out +0 -0
  681. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_33.out +0 -0
  682. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_34.out +0 -0
  683. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_35.out +0 -0
  684. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_36.out +0 -0
  685. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_37.out +0 -0
  686. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_38.out +0 -0
  687. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_39.out +0 -0
  688. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_4.out +0 -0
  689. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_40.out +0 -0
  690. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_41.out +0 -0
  691. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_42.out +0 -0
  692. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_43.out +0 -0
  693. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_44.out +0 -0
  694. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_45.out +0 -0
  695. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_46.out +8 -6
  696. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_47.out +0 -0
  697. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_48.out +0 -0
  698. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_50.out +0 -0
  699. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_51.out +0 -0
  700. data/bin/Image-ExifTool-9.41/t/Writer_52.out +22 -0
  701. data/bin/Image-ExifTool-9.41/t/Writer_53.out +33 -0
  702. data/bin/Image-ExifTool-9.41/t/Writer_54.out +2 -0
  703. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_6.out +0 -0
  704. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_7.out +0 -0
  705. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_9.out +0 -0
  706. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP.t +0 -0
  707. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_10.out +0 -0
  708. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_11.out +0 -0
  709. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_12.out +0 -0
  710. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_13.out +0 -0
  711. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_14.out +0 -0
  712. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_15.out +0 -0
  713. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_16.out +0 -0
  714. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_17.out +0 -0
  715. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_18.out +0 -0
  716. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_19.out +0 -0
  717. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_2.out +0 -0
  718. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_20.out +0 -0
  719. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_21.out +0 -0
  720. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_22.out +0 -0
  721. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_23.out +0 -0
  722. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_24.out +0 -0
  723. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_25.out +0 -0
  724. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_26.out +0 -0
  725. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_27.out +0 -0
  726. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_28.out +0 -0
  727. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_29.out +0 -0
  728. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_3.out +0 -0
  729. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_30.out +0 -0
  730. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_31.out +0 -0
  731. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_32.out +0 -0
  732. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_34.out +0 -0
  733. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_36.out +0 -0
  734. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_37.out +0 -0
  735. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_39.out +0 -0
  736. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_40.out +0 -0
  737. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_41.out +0 -0
  738. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_5.out +0 -0
  739. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_6.out +0 -0
  740. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_7.out +0 -0
  741. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_8.out +0 -0
  742. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_9.out +0 -0
  743. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP.t +0 -0
  744. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_2.out +0 -0
  745. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_3.out +0 -0
  746. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_4.out +0 -0
  747. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_5.out +0 -0
  748. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_6.out +0 -0
  749. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_7.out +0 -0
  750. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/AFCP.jpg +0 -0
  751. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/AIFF.aif +0 -0
  752. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/APE.ape +0 -0
  753. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/APE.mpc +0 -0
  754. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ASF.wmv +0 -0
  755. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/BMP.bmp +0 -0
  756. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/BigTIFF.btf +0 -0
  757. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Canon.jpg +0 -0
  758. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Canon1DmkIII.jpg +0 -0
  759. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonRaw.cr2 +0 -0
  760. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonRaw.crw +0 -0
  761. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonVRD.vrd +0 -0
  762. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CaptureOne.eip +0 -0
  763. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Casio.jpg +0 -0
  764. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Casio2.jpg +0 -0
  765. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CasioQVCI.jpg +0 -0
  766. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DICOM.dcm +0 -0
  767. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DNG.dng +0 -0
  768. data/bin/Image-ExifTool-9.41/t/images/DPX.dpx +0 -0
  769. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DV.dv +0 -0
  770. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DjVu.djvu +0 -0
  771. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.elf +0 -0
  772. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.exe +0 -0
  773. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.macho +0 -0
  774. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExifTool.jpg +0 -0
  775. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExifTool.tif +0 -0
  776. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExtendedXMP.jpg +0 -0
  777. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLAC.flac +0 -0
  778. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLAC.ogg +0 -0
  779. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLIR.fpf +0 -0
  780. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLIR.jpg +0 -0
  781. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Flash.flv +0 -0
  782. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Flash.swf +0 -0
  783. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FlashPix.ppt +0 -0
  784. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.afm +0 -0
  785. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.dfont +0 -0
  786. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfa +0 -0
  787. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfb +0 -0
  788. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfm +0 -0
  789. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.ttf +0 -0
  790. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FotoStation.jpg +0 -0
  791. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FujiFilm.jpg +0 -0
  792. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FujiFilm.raf +0 -0
  793. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GE.jpg +0 -0
  794. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GIF.gif +0 -0
  795. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GIMP.xcf +0 -0
  796. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GPS.jpg +0 -0
  797. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GeoTiff.tif +0 -0
  798. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.gpx +0 -0
  799. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.igc +0 -0
  800. data/bin/Image-ExifTool-9.41/t/images/Geotag.kml +55 -0
  801. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.log +0 -0
  802. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.xml +0 -0
  803. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag2.log +0 -0
  804. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/HTML.html +0 -0
  805. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/IPTC.jpg +0 -0
  806. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ITC.itc +0 -0
  807. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/InDesign.indd +0 -0
  808. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/JVC.jpg +0 -0
  809. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/JVC2.jpg +0 -0
  810. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Jpeg2000.j2c +0 -0
  811. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Jpeg2000.jp2 +0 -0
  812. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Kodak.jpg +0 -0
  813. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/KyoceraRaw.raw +0 -0
  814. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/LNK.lnk +0 -0
  815. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/M2TS.mts +0 -0
  816. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MIE.mie +0 -0
  817. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MIFF.miff +0 -0
  818. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MP3.mp3 +0 -0
  819. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MWG.jpg +0 -0
  820. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MXF.mxf +0 -0
  821. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Matroska.mkv +0 -0
  822. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Minolta.jpg +0 -0
  823. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Minolta.mrw +0 -0
  824. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Nikon.jpg +0 -0
  825. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Nikon.nef +0 -0
  826. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/NikonD2Hs.jpg +0 -0
  827. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/NikonD70.jpg +0 -0
  828. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OOXML.docx +0 -0
  829. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Olympus.jpg +0 -0
  830. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Olympus2.jpg +0 -0
  831. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OlympusE1.jpg +0 -0
  832. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OpenDoc.ods +0 -0
  833. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OpenEXR.exr +0 -0
  834. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PDF.pdf +0 -0
  835. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PDF2.pdf +0 -0
  836. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PGF.pgf +0 -0
  837. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PICT.pict +0 -0
  838. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PLIST-bin.plist +0 -0
  839. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PLIST-xml.plist +0 -0
  840. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PNG.png +0 -0
  841. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PPM.ppm +0 -0
  842. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PSP.psp +0 -0
  843. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Panasonic.jpg +0 -0
  844. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Panasonic.rw2 +0 -0
  845. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Pentax.avi +0 -0
  846. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Pentax.jpg +0 -0
  847. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PhotoCD.pcd +0 -0
  848. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PhotoMechanic.jpg +0 -0
  849. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Photoshop.psd +0 -0
  850. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PostScript.eps +0 -0
  851. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/QuickTime.m4a +0 -0
  852. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/QuickTime.mov +0 -0
  853. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.avi +0 -0
  854. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.wav +0 -0
  855. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.webp +0 -0
  856. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RTF.rtf +0 -0
  857. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Radiance.hdr +0 -0
  858. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.ra +0 -0
  859. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.ram +0 -0
  860. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.rm +0 -0
  861. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Ricoh.jpg +0 -0
  862. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Ricoh2.jpg +0 -0
  863. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sanyo.jpg +0 -0
  864. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sigma.jpg +0 -0
  865. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sigma.x3f +0 -0
  866. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/SigmaDP2.x3f +0 -0
  867. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sony.jpg +0 -0
  868. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sony.pmp +0 -0
  869. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Torrent.torrent +0 -0
  870. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Unknown.jpg +0 -0
  871. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Vorbis.ogg +0 -0
  872. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Writer.jpg +0 -0
  873. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.inx +0 -0
  874. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.jpg +0 -0
  875. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.svg +0 -0
  876. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.xml +0 -0
  877. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.xmp +0 -0
  878. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP2.xmp +0 -0
  879. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP3.xmp +0 -0
  880. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP4.xmp +0 -0
  881. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP5.xmp +0 -0
  882. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ZIP.gz +0 -0
  883. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ZIP.zip +0 -0
  884. data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/iWork.numbers +0 -0
  885. data/lib/exiftool_vendored.rb +11 -3
  886. data/lib/exiftool_vendored/version.rb +1 -1
  887. data/lib/exiftool_vendored/version_extractor.rb +5 -7
  888. metadata +942 -886
  889. data/bin/Image-ExifTool-9.37/t/QuickTime.t +0 -31
@@ -101,6 +101,20 @@ my @delGroups = qw(
101
101
  Meta MetaIFD MIE MPF NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG
102
102
  PrintIM RMETA RSRC SubIFD Trailer XML XML-* XMP XMP-*
103
103
  );
104
+ # family 2 group names that we can delete
105
+ my @delGroup2 = qw(
106
+ Audio Author Camera Copyright Document ExifTool Image Location Other Printing
107
+ Time Video
108
+ );
109
+
110
+ # lookup for all valid family 2 groups (lower case)
111
+ my %family2groups = (
112
+ audio => 1, document => 1, other => 1, video => 1,
113
+ author => 1, exiftool => 1, printing => 1,
114
+ camera => 1, image => 1, 'time' => 1,
115
+ copyright => 1, location => 1, unknown => 1,
116
+ );
117
+
104
118
  # groups we don't delete when deleting all information
105
119
  my $protectedGroups = '(IFD1|SubIFD|InteropIFD|GlobParamIFD|PDF-update|Adobe)';
106
120
  # other group names of new tag values to remove when deleting an entire group
@@ -145,7 +159,7 @@ my %translateWriteGroup = (
145
159
  MIE => 'MIE',
146
160
  APP14 => 'APP14',
147
161
  );
148
- # names of valid EXIF and Meta directories:
162
+ # names of valid EXIF and Meta directories (lower case keys):
149
163
  my %exifDirs = (
150
164
  gps => 'GPS',
151
165
  exififd => 'ExifIFD',
@@ -203,7 +217,7 @@ my %ignorePrintConv = ( OTHER => 1, BITMASK => 1, Notes => 1 );
203
217
  # Returns: number of tags set (plus error string in list context)
204
218
  # Notes: For tag lists (like Keywords), call repeatedly with the same tag name for
205
219
  # each value in the list. Internally, the new information is stored in
206
- # the following members of the $self->{NEW_VALUE}{$tagInfo} hash:
220
+ # the following members of the $$self{NEW_VALUE}{$tagInfo} hash:
207
221
  # TagInfo - tag info ref
208
222
  # DelValue - list ref for values to delete
209
223
  # Value - list ref for values to add (not defined if deleting the tag)
@@ -226,9 +240,9 @@ sub SetNewValue($;$$%)
226
240
  {
227
241
  local $_;
228
242
  my ($self, $tag, $value, %options) = @_;
229
- my ($err, $tagInfo);
230
- my $verbose = $self->{OPTIONS}{Verbose};
231
- my $out = $self->{OPTIONS}{TextOut};
243
+ my ($err, $tagInfo, $family);
244
+ my $verbose = $$self{OPTIONS}{Verbose};
245
+ my $out = $$self{OPTIONS}{TextOut};
232
246
  my $protected = $options{Protected} || 0;
233
247
  my $listOnly = $options{ListOnly};
234
248
  my $setTags = $options{SetTags};
@@ -236,9 +250,9 @@ sub SetNewValue($;$$%)
236
250
  my $numSet = 0;
237
251
 
238
252
  unless (defined $tag) {
239
- delete $self->{NEW_VALUE};
240
- $self->{SAVE_COUNT} = 0;
241
- $self->{DEL_GROUP} = { };
253
+ delete $$self{NEW_VALUE};
254
+ $$self{SAVE_COUNT} = 0;
255
+ $$self{DEL_GROUP} = { };
242
256
  return 1;
243
257
  }
244
258
  # allow value to be scalar or list reference
@@ -256,7 +270,7 @@ sub SetNewValue($;$$%)
256
270
  delete $options{Replace}; # don't replace earlier values in list
257
271
  }
258
272
  # and now set only non-list tags
259
- $value = join $self->{OPTIONS}{ListSep}, @$value;
273
+ $value = join $$self{OPTIONS}{ListSep}, @$value;
260
274
  $options{Replace} = $replace;
261
275
  $listOnly = $options{ListOnly} = 0;
262
276
  } else {
@@ -271,26 +285,36 @@ sub SetNewValue($;$$%)
271
285
  $self->Sanitize(\$value) if defined $value and not ref $value;
272
286
 
273
287
  # set group name in options if specified
274
- if ($tag =~ /(.*):(.+)/) {
275
- $options{Group} = $1 if $1 ne '*' and lc($1) ne 'all';
276
- $tag = $2;
277
- }
288
+ ($options{Group}, $tag) = ($1, $2) if $tag =~ /(.*):(.+)/;
289
+
278
290
  # allow trailing '#' for ValueConv value
279
291
  $options{Type} = 'ValueConv' if $tag =~ s/#$//;
280
292
  my $convType = $options{Type} || ($$self{OPTIONS}{PrintConv} ? 'PrintConv' : 'ValueConv');
281
293
 
282
- # ignore leading family number if 0 or 1 specified
283
- if ($options{Group} and $options{Group} =~ /^(\d+)(.*)/ and $1 < 2) {
284
- $options{Group} = $2;
294
+ my (@wantGroup, $family2);
295
+ my $wantGroup = $options{Group};
296
+ if ($wantGroup) {
297
+ foreach (split /:/, $wantGroup) {
298
+ /^(\d+)?(.+)/ or next; # separate family number and group name
299
+ my ($f, $g) = ($1, lc $2);
300
+ # save group/family unless 'all' or '*'
301
+ push @wantGroup, [ $f, $g ] unless $g eq '*' or $g eq 'all';
302
+ if (defined $f) {
303
+ $f > 2 and return 0;
304
+ $family2 = 1 if $f == 2; # set flag indicating family 2 was used
305
+ } else {
306
+ $family2 = 1 if $family2groups{$g};
307
+ }
308
+ }
309
+ undef $wantGroup unless @wantGroup;
285
310
  }
286
311
 
287
- my $wantGroup = $options{Group};
288
312
  $tag =~ s/ .*//; # convert from tag key to tag name if necessary
289
313
  $tag = '*' if lc($tag) eq 'all'; # use '*' instead of 'all'
290
314
  #
291
315
  # handle group delete
292
316
  #
293
- if ($tag eq '*' and not defined $value) {
317
+ while ($tag eq '*' and not defined $value and not $family2) {
294
318
  # set groups to delete
295
319
  my (@del, $grp);
296
320
  my $remove = ($options{Replace} and $options{Replace} > 1);
@@ -323,7 +347,7 @@ sub SetNewValue($;$$%)
323
347
  if (@del) {
324
348
  ++$numSet;
325
349
  my @donegrps;
326
- my $delGroup = $self->{DEL_GROUP};
350
+ my $delGroup = $$self{DEL_GROUP};
327
351
  foreach $grp (@del) {
328
352
  if ($remove) {
329
353
  my $didExcl;
@@ -369,6 +393,8 @@ sub SetNewValue($;$$%)
369
393
  my $msg = $remove ? 'Excluding from deletion' : 'Deleting tags in';
370
394
  print $out " $msg: @donegrps\n";
371
395
  }
396
+ } elsif (grep /^$wantGroup$/i, @delGroup2) {
397
+ last; # allow tags to be deleted by group2 name
372
398
  } else {
373
399
  $err = "Not a deletable group: $wantGroup";
374
400
  }
@@ -395,9 +421,9 @@ sub SetNewValue($;$$%)
395
421
  #
396
422
  # get list of tags we want to set
397
423
  #
424
+ my $origTag = $tag;
398
425
  my @matchingTags = FindTagInfo($tag);
399
426
  until (@matchingTags) {
400
- my $origTag = $tag;
401
427
  my $langCode;
402
428
  # allow language suffix of form "-en_CA" or "-<rfc3066>" on tag name
403
429
  if ($tag =~ /^([?*\w]+)-([a-z]{2})(_[a-z]{2})$/i or # MIE
@@ -411,7 +437,7 @@ sub SetNewValue($;$$%)
411
437
  foreach $tagInfo (@newMatches) {
412
438
  # only allow language codes in tables which support them
413
439
  next unless $$tagInfo{Table};
414
- my $langInfoProc = $tagInfo->{Table}{LANG_INFO} or next;
440
+ my $langInfoProc = $$tagInfo{Table}{LANG_INFO} or next;
415
441
  my $langInfo = &$langInfoProc($tagInfo, $langCode);
416
442
  push @matchingTags, $langInfo if $langInfo;
417
443
  }
@@ -460,23 +486,28 @@ sub SetNewValue($;$$%)
460
486
  }
461
487
  # get group name that we're looking for
462
488
  my $foundMatch = 0;
463
- my ($ifdName, $mieGroup);
464
- if ($wantGroup) {
489
+ my ($ifdName, $mieGroup, $movGroup, $fg);
490
+ # set family 1 group names
491
+ foreach $fg (@wantGroup) {
492
+ next if $$fg[0] and $$fg[0] != 1;
493
+ $_ = $$fg[1];
465
494
  # set $ifdName if this group is a valid IFD or SubIFD name
466
- if ($wantGroup =~ /^IFD(\d+)$/i) {
495
+ if (/^IFD(\d+)$/i) {
467
496
  $ifdName = "IFD$1";
468
- } elsif ($wantGroup =~ /^SubIFD(\d+)$/i) {
497
+ } elsif (/^SubIFD(\d+)$/i) {
469
498
  $ifdName = "SubIFD$1";
470
- } elsif ($wantGroup =~ /^Version(\d+)$/i) {
499
+ } elsif (/^Version(\d+)$/i) {
471
500
  $ifdName = "Version$1"; # Sony IDC VersionIFD
472
- } elsif ($wantGroup =~ /^MIE(\d*-?)(\w+)$/i) {
501
+ } elsif (/^Track(\d+)$/i) {
502
+ $movGroup = "Track$1"; # QuickTime track
503
+ } elsif (/^MIE(\d*-?)(\w+)$/i) {
473
504
  $mieGroup = "MIE$1" . ucfirst(lc($2));
474
505
  } else {
475
- $ifdName = $exifDirs{lc($wantGroup)};
476
- if (not $ifdName and $wantGroup =~ /^XMP\b/i) {
506
+ $ifdName = $exifDirs{$_} if $exifDirs{$_};
507
+ if (not $ifdName and /^XMP\b/i) {
477
508
  # must load XMP table to set group1 names
478
509
  my $table = GetTagTable('Image::ExifTool::XMP::Main');
479
- my $writeProc = $table->{WRITE_PROC};
510
+ my $writeProc = $$table{WRITE_PROC};
480
511
  $writeProc and &$writeProc();
481
512
  }
482
513
  }
@@ -487,48 +518,54 @@ sub SetNewValue($;$$%)
487
518
  #
488
519
  my (@tagInfoList, @writeAlsoList, %writeGroup, %preferred, %tagPriority);
489
520
  my (%avoid, $wasProtected, $noCreate, %highestPriority);
490
- foreach $tagInfo (@matchingTags) {
491
- $tag = $tagInfo->{Name}; # get tag name for warnings
521
+
522
+ TAG: foreach $tagInfo (@matchingTags) {
523
+ $tag = $$tagInfo{Name}; # get tag name for warnings
492
524
  my $lcTag = lc $tag; # get lower-case tag name for use in variables
493
525
  # initialize highest priority if we are starting a new tag
494
526
  $highestPriority{$lcTag} = -999 unless defined $highestPriority{$lcTag};
495
- my ($writeGroup, $priority);
527
+ my ($priority, $writeGroup);
496
528
  if ($wantGroup) {
497
- my $lcWant = lc($wantGroup);
498
- $lcWant = $translateWantGroup{$lcWant} if $translateWantGroup{$lcWant};
499
- # only set tag in specified group
500
- $writeGroup = $self->GetGroup($tagInfo, 0);
501
- unless (lc($writeGroup) eq $lcWant) {
502
- if ($writeGroup eq 'EXIF' or $writeGroup eq 'SonyIDC') {
503
- next unless $ifdName;
529
+ my @grp = $self->GetGroup($tagInfo);
530
+ foreach $fg (@wantGroup) {
531
+ my ($fam, $lcWant) = @$fg;
532
+ $lcWant = $translateWantGroup{$lcWant} if $translateWantGroup{$lcWant};
533
+ # only set tag in specified group
534
+ if (not defined $fam) {
535
+ next if $lcWant eq lc $grp[0] or $lcWant eq lc $grp[2];
536
+ } elsif ($fam != 1 and not $$tagInfo{AllowGroup}) {
537
+ next if $lcWant eq lc $grp[$fam];
538
+ next TAG; # wrong group
539
+ }
540
+ # handle family 1 groups specially
541
+ if ($grp[0] eq 'EXIF' or $grp[0] eq 'SonyIDC') {
542
+ next TAG unless $ifdName;
504
543
  # can't yet write PreviewIFD tags
505
- $ifdName eq 'PreviewIFD' and ++$foundMatch, next;
544
+ $ifdName eq 'PreviewIFD' and ++$foundMatch, next TAG;
506
545
  $writeGroup = $ifdName; # write to the specified IFD
507
- } elsif ($writeGroup eq 'MIE') {
508
- next unless $mieGroup;
546
+ } elsif ($grp[0] eq 'QuickTime' and $grp[1] eq 'Track#') {
547
+ $writeGroup = $movGroup or next TAG;
548
+ } elsif ($grp[0] eq 'MIE') {
549
+ next TAG unless $mieGroup;
509
550
  $writeGroup = $mieGroup; # write to specific MIE group
510
551
  # set specific write group with document number if specified
511
- if ($writeGroup =~ /^MIE\d+$/ and $tagInfo->{Table}{WRITE_GROUP}) {
512
- $writeGroup = $tagInfo->{Table}{WRITE_GROUP};
552
+ if ($writeGroup =~ /^MIE\d+$/ and $$tagInfo{Table}{WRITE_GROUP}) {
553
+ $writeGroup = $$tagInfo{Table}{WRITE_GROUP};
513
554
  $writeGroup =~ s/^MIE/$mieGroup/;
514
555
  }
515
- } elsif (not $$tagInfo{AllowGroup} or $wantGroup !~ /^$$tagInfo{AllowGroup}$/i) {
556
+ } elsif (not $$tagInfo{AllowGroup} or $lcWant !~ /^$$tagInfo{AllowGroup}$/i) {
516
557
  # allow group1 name to be specified
517
- my $grp1 = $self->GetGroup($tagInfo, 1);
518
- unless ($grp1 and lc($grp1) eq $lcWant) {
519
- # must also check group1 name directly in case it is different
520
- $grp1 = $tagInfo->{Groups}{1};
521
- next unless $grp1 and lc($grp1) eq $lcWant;
522
- }
558
+ next TAG unless $lcWant eq lc $grp[1];
523
559
  }
524
560
  }
525
- $priority = 1000; # highest priority since group was specified
561
+ $writeGroup or $writeGroup = $grp[0];
562
+ $priority = 1000; # highest priority since group was specified
526
563
  }
527
564
  ++$foundMatch;
528
565
  # must do a dummy call to the write proc to autoload write package
529
566
  # before checking Writable flag
530
- my $table = $tagInfo->{Table};
531
- my $writeProc = $table->{WRITE_PROC};
567
+ my $table = $$tagInfo{Table};
568
+ my $writeProc = $$table{WRITE_PROC};
532
569
  # load source table if this was a user-defined table
533
570
  if ($$table{SRC_TABLE}) {
534
571
  my $src = GetTagTable($$table{SRC_TABLE});
@@ -536,21 +573,21 @@ sub SetNewValue($;$$%)
536
573
  }
537
574
  next unless $writeProc and &$writeProc();
538
575
  # must still check writable flags in case of UserDefined tags
539
- my $writable = $tagInfo->{Writable};
540
- next unless $writable or ($table->{WRITABLE} and
576
+ my $writable = $$tagInfo{Writable};
577
+ next unless $writable or ($$table{WRITABLE} and
541
578
  not defined $writable and not $$tagInfo{SubDirectory});
542
579
  # set specific write group (if we didn't already)
543
580
  if (not $writeGroup or $translateWriteGroup{$writeGroup}) {
544
581
  # use default write group
545
- $writeGroup = $tagInfo->{WriteGroup} || $tagInfo->{Table}{WRITE_GROUP};
582
+ $writeGroup = $$tagInfo{WriteGroup} || $$tagInfo{Table}{WRITE_GROUP};
546
583
  # use group 0 name if no WriteGroup specified
547
584
  my $group0 = $self->GetGroup($tagInfo, 0);
548
585
  $writeGroup or $writeGroup = $group0;
549
586
  # get priority for this group
550
587
  unless ($priority) {
551
- $priority = $self->{WRITE_PRIORITY}{lc($writeGroup)};
588
+ $priority = $$self{WRITE_PRIORITY}{lc($writeGroup)};
552
589
  unless ($priority) {
553
- $priority = $self->{WRITE_PRIORITY}{lc($group0)} || 0;
590
+ $priority = $$self{WRITE_PRIORITY}{lc($group0)} || 0;
554
591
  }
555
592
  }
556
593
  }
@@ -599,7 +636,7 @@ sub SetNewValue($;$$%)
599
636
  foreach $lcTag (keys %preferred) {
600
637
  # don't create tags with priority 0 if group priorities are set
601
638
  if ($preferred{$lcTag} and $highestPriority{$lcTag} == 0 and
602
- %{$self->{WRITE_PRIORITY}})
639
+ %{$$self{WRITE_PRIORITY}})
603
640
  {
604
641
  delete $preferred{$lcTag}
605
642
  }
@@ -655,13 +692,13 @@ sub SetNewValue($;$$%)
655
692
  my $permanent = $$tagInfo{Permanent};
656
693
  $writeGroup eq 'MakerNotes' and $permanent = 1 unless defined $permanent;
657
694
  my $wgrp1 = $self->GetWriteGroup1($tagInfo, $writeGroup);
658
- $tag = $tagInfo->{Name}; # get tag name for warnings
695
+ $tag = $$tagInfo{Name}; # get tag name for warnings
659
696
  my $pref = $preferred{lc $tag} || { };
660
697
  my $shift = $options{Shift};
661
698
  my $addValue = $options{AddValue};
662
699
  if (defined $shift) {
663
700
  # (can't currently shift list-type tags)
664
- if (not $tagInfo->{List}) {
701
+ if (not $$tagInfo{List}) {
665
702
  unless ($shift) {
666
703
  # set shift according to AddValue/DelValue
667
704
  $shift = 1 if $addValue;
@@ -687,7 +724,7 @@ sub SetNewValue($;$$%)
687
724
  my $val = $value;
688
725
  if (defined $val) {
689
726
  # check to make sure this is a List or Shift tag if adding
690
- if ($addValue and not ($shift or $tagInfo->{List})) {
727
+ if ($addValue and not ($shift or $$tagInfo{List})) {
691
728
  if ($addValue eq '2') {
692
729
  undef $addValue; # quitely reset this option
693
730
  } else {
@@ -702,7 +739,7 @@ sub SetNewValue($;$$%)
702
739
  $val = ($shift > 0 ? '+' : '-') . $val;
703
740
  # check the shift for validity
704
741
  require 'Image/ExifTool/Shift.pl';
705
- my $err2 = CheckShift($tagInfo->{Shift}, $val);
742
+ my $err2 = CheckShift($$tagInfo{Shift}, $val);
706
743
  if ($err2) {
707
744
  $err = "$err2 for $wgrp1:$tag";
708
745
  $verbose > 2 and print $out "$err\n";
@@ -736,9 +773,9 @@ sub SetNewValue($;$$%)
736
773
  $verbose > 2 and print $out "$err\n";
737
774
  next;
738
775
  } else {
739
- if ($tagInfo->{DelCheck}) {
776
+ if ($$tagInfo{DelCheck}) {
740
777
  #### eval DelCheck ($self, $tagInfo, $wantGroup)
741
- my $err2 = eval $tagInfo->{DelCheck};
778
+ my $err2 = eval $$tagInfo{DelCheck};
742
779
  $@ and warn($@), $err2 = 'Error evaluating DelCheck';
743
780
  if (defined $err2) {
744
781
  # (allow other tags to be set using DelCheck as a hook)
@@ -770,7 +807,7 @@ sub SetNewValue($;$$%)
770
807
  next unless $options{DelValue};
771
808
  $val = 'xxx never delete xxx';
772
809
  }
773
- $self->{NEW_VALUE} or $self->{NEW_VALUE} = { };
810
+ $$self{NEW_VALUE} or $$self{NEW_VALUE} = { };
774
811
  if ($options{Replace}) {
775
812
  # delete the previous new value
776
813
  $self->GetNewValueHash($tagInfo, $writeGroup, 'delete', $options{ProtectSaved});
@@ -790,30 +827,30 @@ sub SetNewValue($;$$%)
790
827
  my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create', $options{ProtectSaved});
791
828
  # ignore new values protected with ProtectSaved
792
829
  $nvHash or ++$numSet, next; # (increment $numSet to avoid warning)
793
- $nvHash->{WantGroup} = $wantGroup;
794
- $nvHash->{EditOnly} = 1 if $editOnly;
830
+ $$nvHash{WantGroup} = $wantGroup;
831
+ $$nvHash{EditOnly} = 1 if $editOnly;
795
832
  # save maker note information if writing maker notes
796
833
  if ($$tagInfo{MakerNotes}) {
797
- $nvHash->{MAKER_NOTE_FIXUP} = $self->{MAKER_NOTE_FIXUP};
834
+ $$nvHash{MAKER_NOTE_FIXUP} = $$self{MAKER_NOTE_FIXUP};
798
835
  }
799
836
  if ($createOnly) { # create only (never edit)
800
837
  # empty item in DelValue list to never edit existing value
801
- $nvHash->{DelValue} = [ '' ];
802
- $nvHash->{CreateOnly} = 1;
838
+ $$nvHash{DelValue} = [ '' ];
839
+ $$nvHash{CreateOnly} = 1;
803
840
  } elsif ($options{DelValue} or $addValue or $shift) {
804
841
  # flag any AddValue or DelValue by creating the DelValue list
805
- $nvHash->{DelValue} or $nvHash->{DelValue} = [ ];
842
+ $$nvHash{DelValue} or $$nvHash{DelValue} = [ ];
806
843
  if ($shift) {
807
844
  # add shift value to list
808
- $nvHash->{Shift} = $val;
845
+ $$nvHash{Shift} = $val;
809
846
  } elsif ($options{DelValue}) {
810
847
  # don't create if we are replacing a specific value
811
- $nvHash->{IsCreating} = 0 unless $val eq '' or $tagInfo->{List};
848
+ $$nvHash{IsCreating} = 0 unless $val eq '' or $$tagInfo{List};
812
849
  # add delete value to list
813
- push @{$nvHash->{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val;
850
+ push @{$$nvHash{DelValue}}, ref $val eq 'ARRAY' ? @$val : $val;
814
851
  if ($verbose > 1) {
815
852
  my $verb = $permanent ? 'Replacing' : 'Deleting';
816
- my $fromList = $tagInfo->{List} ? ' from list' : '';
853
+ my $fromList = $$tagInfo{List} ? ' from list' : '';
817
854
  my @vals = (ref $val eq 'ARRAY' ? @$val : $val);
818
855
  foreach (@vals) {
819
856
  if (ref $_ eq 'HASH') {
@@ -828,30 +865,30 @@ sub SetNewValue($;$$%)
828
865
  # set priority flag to add only the high priority info
829
866
  # (will only create the priority tag if it doesn't exist,
830
867
  # others get changed only if they already exist)
831
- if ($$pref{$tagInfo} or $tagInfo->{Table}{PREFERRED}) {
868
+ if ($$pref{$tagInfo} or $$tagInfo{Table}{PREFERRED}) {
832
869
  if ($permanent or $shift) {
833
870
  # don't create permanent or Shift-ed tag but define IsCreating
834
871
  # so we know that it is the preferred tag
835
- $nvHash->{IsCreating} = 0;
836
- } elsif (($tagInfo->{List} and not $options{DelValue}) or
837
- not ($nvHash->{DelValue} and @{$nvHash->{DelValue}}) or
872
+ $$nvHash{IsCreating} = 0;
873
+ } elsif (($$tagInfo{List} and not $options{DelValue}) or
874
+ not ($$nvHash{DelValue} and @{$$nvHash{DelValue}}) or
838
875
  # also create tag if any DelValue value is empty ('')
839
- grep(/^$/,@{$nvHash->{DelValue}}))
876
+ grep(/^$/,@{$$nvHash{DelValue}}))
840
877
  {
841
- $nvHash->{IsCreating} = $editOnly ? 0 : ($editGroup ? 2 : 1);
878
+ $$nvHash{IsCreating} = $editOnly ? 0 : ($editGroup ? 2 : 1);
842
879
  # add to hash of groups where this tag is being created
843
880
  $createGroups or $createGroups = $options{CreateGroups} || { };
844
881
  $$createGroups{$self->GetGroup($tagInfo, 0)} = 1;
845
- $nvHash->{CreateGroups} = $createGroups;
882
+ $$nvHash{CreateGroups} = $createGroups;
846
883
  }
847
884
  }
848
- if ($nvHash->{IsCreating}) {
849
- if (%{$self->{DEL_GROUP}}) {
885
+ if ($$nvHash{IsCreating}) {
886
+ if (%{$$self{DEL_GROUP}}) {
850
887
  my ($grp, @grps);
851
- foreach $grp (keys %{$self->{DEL_GROUP}}) {
852
- next if $self->{DEL_GROUP}{$grp} == 2;
888
+ foreach $grp (keys %{$$self{DEL_GROUP}}) {
889
+ next if $$self{DEL_GROUP}{$grp} == 2;
853
890
  # set flag indicating tags were written after this group was deleted
854
- $self->{DEL_GROUP}{$grp} = 2;
891
+ $$self{DEL_GROUP}{$grp} = 2;
855
892
  push @grps, $grp;
856
893
  }
857
894
  if ($verbose > 1 and @grps) {
@@ -866,21 +903,21 @@ sub SetNewValue($;$$%)
866
903
  next; # nothing to do (not creating and not editing)
867
904
  }
868
905
  if ($shift or not $options{DelValue}) {
869
- $nvHash->{Value} or $nvHash->{Value} = [ ];
870
- if (not $tagInfo->{List}) {
906
+ $$nvHash{Value} or $$nvHash{Value} = [ ];
907
+ if (not $$tagInfo{List}) {
871
908
  # not a List tag -- overwrite existing value
872
- $nvHash->{Value}[0] = $val;
909
+ $$nvHash{Value}[0] = $val;
873
910
  } else {
874
911
  # add to existing list
875
- push @{$nvHash->{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
912
+ push @{$$nvHash{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
876
913
  }
877
914
  if ($verbose > 1) {
878
- my $ifExists = $nvHash->{IsCreating} ? ( $createOnly ?
879
- ($nvHash->{IsCreating} == 2 ?
915
+ my $ifExists = $$nvHash{IsCreating} ? ( $createOnly ?
916
+ ($$nvHash{IsCreating} == 2 ?
880
917
  " if $writeGroup exists and tag doesn't" :
881
918
  " if tag doesn't exist") :
882
- ($nvHash->{IsCreating} == 2 ? " if $writeGroup exists" : '')) :
883
- (($nvHash->{DelValue} and @{$nvHash->{DelValue}}) ?
919
+ ($$nvHash{IsCreating} == 2 ? " if $writeGroup exists" : '')) :
920
+ (($$nvHash{DelValue} and @{$$nvHash{DelValue}}) ?
884
921
  ' if tag was deleted' : ' if tag exists');
885
922
  my $verb = ($shift ? 'Shifting' : ($addValue ? 'Adding' : 'Writing'));
886
923
  print $out "$verb $wgrp1:$tag$ifExists\n";
@@ -897,7 +934,7 @@ sub SetNewValue($;$$%)
897
934
  # create empty new value hash entry to delete this tag
898
935
  $self->GetNewValueHash($tagInfo, $writeGroup, 'delete');
899
936
  my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create');
900
- $nvHash->{WantGroup} = $wantGroup;
937
+ $$nvHash{WantGroup} = $wantGroup;
901
938
  $verbose > 1 and print $out "Deleting $wgrp1:$tag\n";
902
939
  }
903
940
  $$setTags{$tagInfo} = 1 if $setTags;
@@ -921,7 +958,7 @@ WriteAlso:
921
958
  );
922
959
  undef $evalWarning;
923
960
  #### eval WriteAlso ($val)
924
- my $v = eval $writeAlso->{$wtag};
961
+ my $v = eval $$writeAlso{$wtag};
925
962
  $@ and $evalWarning = $@;
926
963
  unless ($evalWarning) {
927
964
  ($n,$evalWarning) = $self->SetNewValue($wtag, $v, %opts);
@@ -950,7 +987,16 @@ WriteAlso:
950
987
  $err = "Sorry, $pre$tag is $wasProtected for writing";
951
988
  $verbose = 0; # we already printed this verbose message
952
989
  } elsif (not $listOnly) {
953
- if ($noCreate) {
990
+ if ($origTag =~ /[?*]/) {
991
+ if ($noCreate) {
992
+ $err = "No tags matching 'pre$origTag' will be created";
993
+ $verbose = 0; # (already printed)
994
+ } elsif ($foundMatch) {
995
+ $err = "Sorry, no writable tags matching '$pre$origTag'";
996
+ } else {
997
+ $err = "No matching tags for '$pre$origTag'";
998
+ }
999
+ } elsif ($noCreate) {
954
1000
  $err = "Not creating $pre$tag";
955
1001
  $verbose = 0; # (already printed)
956
1002
  } elsif ($foundMatch) {
@@ -997,18 +1043,18 @@ sub SetNewValuesFromFile($$;@)
997
1043
  while (ref $setTags[0] eq 'HASH') {
998
1044
  $_ = shift @setTags;
999
1045
  foreach $key (keys %$_) {
1000
- $opts{$key} = $_->{$key};
1046
+ $opts{$key} = $$_{$key};
1001
1047
  }
1002
1048
  }
1003
1049
  # expand shortcuts
1004
1050
  @setTags and ExpandShortcuts(\@setTags);
1005
1051
  my $srcExifTool = new Image::ExifTool;
1006
1052
  # set flag to indicate we are being called from inside SetNewValuesFromFile()
1007
- $srcExifTool->{TAGS_FROM_FILE} = 1;
1053
+ $$srcExifTool{TAGS_FROM_FILE} = 1;
1008
1054
  # synchronize and increment the file sequence number
1009
- $srcExifTool->{FILE_SEQUENCE} = $self->{FILE_SEQUENCE}++;
1055
+ $$srcExifTool{FILE_SEQUENCE} = $$self{FILE_SEQUENCE}++;
1010
1056
  # set options for our extraction tool
1011
- my $options = $self->{OPTIONS};
1057
+ my $options = $$self{OPTIONS};
1012
1058
  # copy both structured and flattened tags by default (but flattened tags are "unsafe")
1013
1059
  my $structOpt = defined $$options{Struct} ? $$options{Struct} : 2;
1014
1060
  # copy structures only if no tags specified (since flattened tags are "unsafe")
@@ -1063,7 +1109,7 @@ sub SetNewValuesFromFile($$;@)
1063
1109
  # get all tags from source file (including MakerNotes block)
1064
1110
  my $info = $srcExifTool->ImageInfo($srcFile);
1065
1111
  return $info if $$info{Error} and $$info{Error} eq 'Error opening file';
1066
- delete $srcExifTool->{VALUE}{Error}; # delete so we can check this later
1112
+ delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later
1067
1113
 
1068
1114
  # sort tags in reverse order so we get priority tag last
1069
1115
  my @tags = reverse sort keys %$info;
@@ -1073,8 +1119,8 @@ sub SetNewValuesFromFile($$;@)
1073
1119
  #
1074
1120
  unless (@setTags) {
1075
1121
  # transfer maker note information to this object
1076
- $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
1077
- $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
1122
+ $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP};
1123
+ $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER};
1078
1124
  foreach $tag (@tags) {
1079
1125
  # don't try to set errors or warnings
1080
1126
  next if $tag =~ /^(Error|Warning)\b/;
@@ -1093,20 +1139,20 @@ sub SetNewValuesFromFile($$;@)
1093
1139
  # transfer specified tags in the proper order
1094
1140
  #
1095
1141
  # 1) loop through input list of tags to set, and build @setList
1096
- my (@setList, $set, %setMatches);
1097
- foreach (@setTags) {
1098
- if (ref $_ eq 'HASH') {
1142
+ my (@setList, $set, %setMatches, $t);
1143
+ foreach $t (@setTags) {
1144
+ if (ref $t eq 'HASH') {
1099
1145
  # update current options
1100
- foreach $key (keys %$_) {
1101
- $opts{$key} = $_->{$key};
1146
+ foreach $key (keys %$t) {
1147
+ $opts{$key} = $$t{$key};
1102
1148
  }
1103
1149
  next;
1104
1150
  }
1105
1151
  # make a copy of the current options for this setTag
1106
1152
  # (also use this hash to store expression and wildcard flags, EXPR and WILD)
1107
1153
  my $opts = { %opts };
1108
- $tag = lc($_); # change tag/group names to all lower case
1109
- my ($fam, $grp, $dst, $dstGrp, $dstTag, $isExclude);
1154
+ $tag = lc $t; # change tag/group names to all lower case
1155
+ my (@fg, $grp, $dst, $dstGrp, $dstTag, $isExclude);
1110
1156
  # handle redirection to another tag
1111
1157
  if ($tag =~ /(.+?)\s*(>|<)\s*(.+)/) {
1112
1158
  $dstGrp = '';
@@ -1120,11 +1166,10 @@ sub SetNewValuesFromFile($$;@)
1120
1166
  $opt = $1 if $dstTag =~ s/\s*([-+])$//;
1121
1167
  # handle expressions
1122
1168
  if ($tag =~ /\$/) {
1123
- $tag = $_; # restore original case
1169
+ $tag = $t; # restore original case
1124
1170
  # recover leading whitespace (except for initial single space)
1125
1171
  $tag =~ s/(.+?)\s*(>|<) ?//;
1126
1172
  $$opts{EXPR} = 1; # flag this expression
1127
- $grp = '';
1128
1173
  } else {
1129
1174
  $opt = $1 if $tag =~ s/^([-+])\s*//;
1130
1175
  }
@@ -1137,20 +1182,18 @@ sub SetNewValuesFromFile($$;@)
1137
1182
  ($dstGrp, $dstTag) = ($1, $2) if $dstTag =~ /(.*):(.+)/;
1138
1183
  # ValueConv may be specified separately on the destination with '#'
1139
1184
  $$opts{Type} = 'ValueConv' if $dstTag =~ s/#$//;
1140
- # ignore leading family number
1141
- $dstGrp = $2 if $dstGrp =~ /^(\d+)(.*)/ and $1 < 2;
1142
- # replace 'all' with '*' in tag and group names
1185
+ # replace tag name of 'all' with '*'
1143
1186
  $dstTag = '*' if $dstTag eq 'all';
1144
- $dstGrp = '*' if $dstGrp eq 'all';
1145
1187
  }
1146
1188
  unless ($$opts{EXPR}) {
1147
1189
  $isExclude = ($tag =~ s/^-//);
1148
- if ($tag =~ /^([-\w]*?|\*):(.+)/) {
1190
+ if ($tag =~ /(.*):(.+)/) {
1149
1191
  ($grp, $tag) = ($1, $2);
1150
- # separate leading family number
1151
- ($fam, $grp) = ($1, $2) if $grp =~ /^(\d+)(.*)/;
1152
- } else {
1153
- $grp = ''; # flag for don't care about group
1192
+ foreach (split /:/, $grp) {
1193
+ # save family/groups in list (ignoring 'all' and '*')
1194
+ /^(\d+)?(.+)/ or next;
1195
+ push @fg, [ $1, $2 ] unless $2 eq '*' or $2 eq 'all';
1196
+ }
1154
1197
  }
1155
1198
  # allow ValueConv to be specified by a '#' on the tag name
1156
1199
  if ($tag =~ s/#$//) {
@@ -1159,7 +1202,6 @@ sub SetNewValuesFromFile($$;@)
1159
1202
  }
1160
1203
  # replace 'all' with '*' in tag and group names
1161
1204
  $tag = '*' if $tag eq 'all';
1162
- $grp = '*' if $grp eq 'all';
1163
1205
  # allow wildcards in tag names (handle differently from all tags: '*')
1164
1206
  if ($tag =~ /[?*]/ and $tag ne '*') {
1165
1207
  $$opts{WILD} = 1; # set flag indicating wildcards were used in source tag
@@ -1167,7 +1209,7 @@ sub SetNewValuesFromFile($$;@)
1167
1209
  $tag =~ s/\?/[-\\w]/g;
1168
1210
  }
1169
1211
  }
1170
- # redirect, exclude or set this tag (Note: $grp is '' if we don't care)
1212
+ # redirect, exclude or set this tag (Note: @fg is empty if we don't care about the group)
1171
1213
  if ($dstTag) {
1172
1214
  # redirect this tag
1173
1215
  $isExclude and return { Error => "Can't redirect excluded tag" };
@@ -1178,18 +1220,17 @@ sub SetNewValuesFromFile($$;@)
1178
1220
  $dst = [ $dstGrp, $dstTag ];
1179
1221
  } elsif ($isExclude) {
1180
1222
  # implicitly assume '*' if first entry is an exclusion
1181
- unshift @setList, [ undef, '*', '*', [ '', '*' ], $opts ] unless @setList;
1223
+ unshift @setList, [ [ ], '*', [ '', '*' ], $opts ] unless @setList;
1182
1224
  # exclude this tag by leaving $dst undefined
1183
1225
  } else {
1184
- $dst = [ $grp, $$opts{WILD} ? '*' : $tag ]; # copy to same group
1226
+ $dst = [ $grp || '', $$opts{WILD} ? '*' : $tag ]; # use same group name for dest
1185
1227
  }
1186
- $grp or $grp = '*'; # use '*' for any group
1187
1228
  # save in reverse order so we don't set tags before an exclude
1188
- unshift @setList, [ $fam, $grp, $tag, $dst, $opts ];
1229
+ unshift @setList, [ \@fg, $tag, $dst, $opts ];
1189
1230
  }
1190
1231
  # 2) initialize lists of matching tags for each setTag
1191
1232
  foreach $set (@setList) {
1192
- $$set[3] and $setMatches{$set} = [ ];
1233
+ $$set[2] and $setMatches{$set} = [ ];
1193
1234
  }
1194
1235
  # 3) loop through all tags in source image and save tags matching each setTag
1195
1236
  my %rtnInfo;
@@ -1202,27 +1243,29 @@ sub SetNewValuesFromFile($$;@)
1202
1243
  # only set specified tags
1203
1244
  my $lcTag = lc(GetTagName($tag));
1204
1245
  my (@grp, %grp);
1205
- foreach $set (@setList) {
1246
+ SET: foreach $set (@setList) {
1206
1247
  # check first for matching tag
1207
- unless ($$set[2] eq $lcTag or $$set[2] eq '*') {
1248
+ unless ($$set[1] eq $lcTag or $$set[1] eq '*') {
1208
1249
  # handle wildcards
1209
- next unless $$set[4]{WILD} and $lcTag =~ /^$$set[2]$/;
1250
+ next unless $$set[3]{WILD} and $lcTag =~ /^$$set[1]$/;
1210
1251
  }
1211
1252
  # then check for matching group
1212
- unless ($$set[1] eq '*') {
1253
+ if (@{$$set[0]}) {
1213
1254
  # get lower case group names if not done already
1214
1255
  unless (@grp) {
1215
1256
  @grp = map(lc, $srcExifTool->GetGroup($tag));
1216
1257
  $grp{$_} = 1 foreach @grp;
1217
1258
  }
1218
- # handle leading family number
1219
- if (defined $$set[0]) {
1220
- next unless $grp[$$set[0]] and $$set[1] eq $grp[$$set[0]];
1221
- } else {
1222
- next unless $grp{$$set[1]};
1259
+ foreach (@{$$set[0]}) {
1260
+ my ($f, $g) = @$_;
1261
+ if (defined $f) {
1262
+ next SET unless $grp[$f] and $g eq $grp[$f];
1263
+ } else {
1264
+ next SET unless $grp{$g};
1265
+ }
1223
1266
  }
1224
1267
  }
1225
- last unless $$set[3]; # all done if we hit an exclude
1268
+ last unless $$set[2]; # all done if we hit an exclude
1226
1269
  # add to the list of tags matching this setTag
1227
1270
  push @{$setMatches{$set}}, $tag;
1228
1271
  }
@@ -1230,10 +1273,10 @@ sub SetNewValuesFromFile($$;@)
1230
1273
  # 4) loop through each setTag in original order, setting new tag values
1231
1274
  foreach $set (reverse @setList) {
1232
1275
  # get options for SetNewValue
1233
- my $opts = $$set[4];
1276
+ my $opts = $$set[3];
1234
1277
  # handle expressions
1235
1278
  if ($$opts{EXPR}) {
1236
- my $val = $srcExifTool->InsertTagValues(\@tags, $$set[2], 'Error');
1279
+ my $val = $srcExifTool->InsertTagValues(\@tags, $$set[1], 'Error');
1237
1280
  if ($$srcExifTool{VALUE}{Error}) {
1238
1281
  # pass on any error as a warning
1239
1282
  $tag = NextFreeTagKey(\%rtnInfo, 'Warning');
@@ -1241,7 +1284,7 @@ sub SetNewValuesFromFile($$;@)
1241
1284
  delete $$srcExifTool{VALUE}{Error};
1242
1285
  next unless defined $val;
1243
1286
  }
1244
- my ($dstGrp, $dstTag) = @{$$set[3]};
1287
+ my ($dstGrp, $dstTag) = @{$$set[2]};
1245
1288
  $$opts{Protected} = 1 unless $dstTag =~ /[?*]/ and $dstTag ne '*';
1246
1289
  $$opts{Group} = $dstGrp if $dstGrp;
1247
1290
  my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts);
@@ -1255,29 +1298,33 @@ sub SetNewValuesFromFile($$;@)
1255
1298
  } else {
1256
1299
  $val = $$info{$tag};
1257
1300
  }
1258
- my ($dstGrp, $dstTag) = @{$$set[3]};
1301
+ my ($dstGrp, $dstTag) = @{$$set[2]};
1259
1302
  if ($dstGrp) {
1260
- if ($dstGrp eq '*') {
1261
- $dstGrp = $srcExifTool->GetGroup($tag, 1);
1303
+ my @dstGrp = split /:/, $dstGrp;
1304
+ # destination group of '*' writes to same group as source tag
1305
+ # (family 1 unless otherwise specified)
1306
+ foreach (@dstGrp) {
1307
+ next unless /^(\d*)(all|\*)$/i;
1308
+ $_ = $1 . $srcExifTool->GetGroup($tag, length $1 ? $1 : 1);
1262
1309
  $noWarn = 1; # don't warn on wildcard destinations
1263
1310
  }
1264
- $$opts{Group} = $dstGrp;
1311
+ $$opts{Group} = join ':', @dstGrp;
1265
1312
  } else {
1266
1313
  delete $$opts{Group};
1267
1314
  }
1268
1315
  # transfer maker note information if setting this tag
1269
- if ($srcExifTool->{TAG_INFO}{$tag}{MakerNotes}) {
1270
- $self->{MAKER_NOTE_FIXUP} = $srcExifTool->{MAKER_NOTE_FIXUP};
1271
- $self->{MAKER_NOTE_BYTE_ORDER} = $srcExifTool->{MAKER_NOTE_BYTE_ORDER};
1316
+ if ($$srcExifTool{TAG_INFO}{$tag}{MakerNotes}) {
1317
+ $$self{MAKER_NOTE_FIXUP} = $$srcExifTool{MAKER_NOTE_FIXUP};
1318
+ $$self{MAKER_NOTE_BYTE_ORDER} = $$srcExifTool{MAKER_NOTE_BYTE_ORDER};
1272
1319
  }
1273
1320
  if ($dstTag eq '*') {
1274
1321
  $dstTag = $tag;
1275
1322
  $noWarn = 1;
1276
1323
  }
1277
- if ($$set[2] eq '*' or $$set[4]{WILD}) {
1324
+ if ($$set[1] eq '*' or $$set[3]{WILD}) {
1278
1325
  # don't copy from protected binary tags when using wildcards
1279
- next if $srcExifTool->{TAG_INFO}{$tag}{Protected} and
1280
- $srcExifTool->{TAG_INFO}{$tag}{Binary};
1326
+ next if $$srcExifTool{TAG_INFO}{$tag}{Protected} and
1327
+ $$srcExifTool{TAG_INFO}{$tag}{Binary};
1281
1328
  # don't copy to protected tags when using wildcards
1282
1329
  delete $$opts{Protected};
1283
1330
  # don't copy flattened tags if copying structures too when copying all
@@ -1325,7 +1372,7 @@ sub GetNewValues($$;$)
1325
1372
  $nvHash = $tag;
1326
1373
  } else {
1327
1374
  my $newValueHashPt = shift;
1328
- if ($self->{NEW_VALUE}) {
1375
+ if ($$self{NEW_VALUE}) {
1329
1376
  my ($group, $tagInfo);
1330
1377
  if (ref $tag) {
1331
1378
  $nvHash = $self->GetNewValueHash($tag);
@@ -1355,18 +1402,18 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
1355
1402
  }
1356
1403
  $nvHash = $nvh;
1357
1404
  # give priority to the one we are creating
1358
- last if defined $nvHash->{IsCreating};
1405
+ last if defined $$nvHash{IsCreating};
1359
1406
  }
1360
1407
  }
1361
1408
  }
1362
1409
  # return new value hash if requested
1363
1410
  $newValueHashPt and $$newValueHashPt = $nvHash;
1364
1411
  }
1365
- unless ($nvHash and $nvHash->{Value}) {
1412
+ unless ($nvHash and $$nvHash{Value}) {
1366
1413
  return () if wantarray; # return empty list
1367
1414
  return undef;
1368
1415
  }
1369
- my $vals = $nvHash->{Value};
1416
+ my $vals = $$nvHash{Value};
1370
1417
  # do inverse raw conversion if necessary
1371
1418
  # - must also check after doing a Shift
1372
1419
  if ($$nvHash{TagInfo}{RawConvInv} or $$nvHash{Shift}) {
@@ -1426,7 +1473,7 @@ GNV_TagInfo: foreach $tagInfo (@tagInfoList) {
1426
1473
  sub CountNewValues($)
1427
1474
  {
1428
1475
  my $self = shift;
1429
- my $newVal = $self->{NEW_VALUE};
1476
+ my $newVal = $$self{NEW_VALUE};
1430
1477
  my $num = 0;
1431
1478
  my $tag;
1432
1479
  if ($newVal) {
@@ -1436,7 +1483,7 @@ sub CountNewValues($)
1436
1483
  --$num if defined $$newVal{$Image::ExifTool::Extra{$tag}};
1437
1484
  }
1438
1485
  }
1439
- $num += scalar keys %{$self->{DEL_GROUP}};
1486
+ $num += scalar keys %{$$self{DEL_GROUP}};
1440
1487
  return $num unless wantarray;
1441
1488
  my $pseudo = 0;
1442
1489
  if ($newVal) {
@@ -1456,22 +1503,22 @@ sub CountNewValues($)
1456
1503
  sub SaveNewValues($)
1457
1504
  {
1458
1505
  my $self = shift;
1459
- my $newValues = $self->{NEW_VALUE};
1506
+ my $newValues = $$self{NEW_VALUE};
1460
1507
  my $saveCount = ++$$self{SAVE_COUNT};
1461
1508
  my $key;
1462
1509
  foreach $key (keys %$newValues) {
1463
1510
  my $nvHash = $$newValues{$key};
1464
1511
  while ($nvHash) {
1465
1512
  # set Save count if not done already
1466
- $nvHash->{Save} or $nvHash->{Save} = $saveCount;
1467
- $nvHash = $nvHash->{Next};
1513
+ $$nvHash{Save} or $$nvHash{Save} = $saveCount;
1514
+ $nvHash = $$nvHash{Next};
1468
1515
  }
1469
1516
  }
1470
1517
  # initialize hash for saving overwritten new values
1471
- $self->{SAVE_NEW_VALUE} = { };
1518
+ $$self{SAVE_NEW_VALUE} = { };
1472
1519
  # make a copy of the delete group hash
1473
- my %delGrp = %{$self->{DEL_GROUP}};
1474
- $self->{SAVE_DEL_GROUP} = \%delGrp;
1520
+ my %delGrp = %{$$self{DEL_GROUP}};
1521
+ $$self{SAVE_DEL_GROUP} = \%delGrp;
1475
1522
  return $saveCount;
1476
1523
  }
1477
1524
 
@@ -1484,8 +1531,8 @@ sub SaveNewValues($)
1484
1531
  sub RestoreNewValues($)
1485
1532
  {
1486
1533
  my $self = shift;
1487
- my $newValues = $self->{NEW_VALUE};
1488
- my $savedValues = $self->{SAVE_NEW_VALUE};
1534
+ my $newValues = $$self{NEW_VALUE};
1535
+ my $savedValues = $$self{SAVE_NEW_VALUE};
1489
1536
  my $key;
1490
1537
  # 1) remove any new values which don't have the Save flag set
1491
1538
  if ($newValues) {
@@ -1494,39 +1541,39 @@ sub RestoreNewValues($)
1494
1541
  my $lastHash;
1495
1542
  my $nvHash = $$newValues{$key};
1496
1543
  while ($nvHash) {
1497
- if ($nvHash->{Save}) {
1544
+ if ($$nvHash{Save}) {
1498
1545
  $lastHash = $nvHash;
1499
1546
  } else {
1500
1547
  # remove this entry from the list
1501
1548
  if ($lastHash) {
1502
- $lastHash->{Next} = $nvHash->{Next};
1503
- } elsif ($nvHash->{Next}) {
1504
- $$newValues{$key} = $nvHash->{Next};
1549
+ $$lastHash{Next} = $$nvHash{Next};
1550
+ } elsif ($$nvHash{Next}) {
1551
+ $$newValues{$key} = $$nvHash{Next};
1505
1552
  } else {
1506
1553
  delete $$newValues{$key};
1507
1554
  }
1508
1555
  }
1509
- $nvHash = $nvHash->{Next};
1556
+ $nvHash = $$nvHash{Next};
1510
1557
  }
1511
1558
  }
1512
1559
  }
1513
1560
  # 2) restore saved new values
1514
1561
  if ($savedValues) {
1515
- $newValues or $newValues = $self->{NEW_VALUE} = { };
1562
+ $newValues or $newValues = $$self{NEW_VALUE} = { };
1516
1563
  foreach $key (keys %$savedValues) {
1517
1564
  if ($$newValues{$key}) {
1518
1565
  # add saved values to end of list
1519
1566
  my $nvHash = LastInList($$newValues{$key});
1520
- $nvHash->{Next} = $$savedValues{$key};
1567
+ $$nvHash{Next} = $$savedValues{$key};
1521
1568
  } else {
1522
1569
  $$newValues{$key} = $$savedValues{$key};
1523
1570
  }
1524
1571
  }
1525
- $self->{SAVE_NEW_VALUE} = { }; # reset saved new values
1572
+ $$self{SAVE_NEW_VALUE} = { }; # reset saved new values
1526
1573
  }
1527
1574
  # 3) restore delete groups
1528
- my %delGrp = %{$self->{SAVE_DEL_GROUP}};
1529
- $self->{DEL_GROUP} = \%delGrp;
1575
+ my %delGrp = %{$$self{SAVE_DEL_GROUP}};
1576
+ $$self{DEL_GROUP} = \%delGrp;
1530
1577
  }
1531
1578
 
1532
1579
  #------------------------------------------------------------------------------
@@ -1554,7 +1601,7 @@ sub SetFileModifyDate($$;$$)
1554
1601
  }
1555
1602
  return 0 unless defined $originalTime;
1556
1603
  return 0 unless $self->IsOverwriting($nvHash, $^T - $originalTime*(24*3600));
1557
- $val = $nvHash->{Value}[0]; # get shifted value
1604
+ $val = $$nvHash{Value}[0]; # get shifted value
1558
1605
  }
1559
1606
  if ($tag eq 'FileCreateDate') {
1560
1607
  unless (eval 'require Win32API::File::Time') {
@@ -1569,7 +1616,7 @@ sub SetFileModifyDate($$;$$)
1569
1616
  $self->Warn("Error setting $tag");
1570
1617
  return -1;
1571
1618
  } else {
1572
- ++$self->{CHANGED};
1619
+ ++$$self{CHANGED};
1573
1620
  $self->VerboseValue("+ $tag", $val);
1574
1621
  return 1;
1575
1622
  }
@@ -1648,7 +1695,7 @@ sub SetFileName($$;$)
1648
1695
  # remove the original file
1649
1696
  unlink $file or $self->Warn('Error removing old file');
1650
1697
  }
1651
- ++$self->{CHANGED};
1698
+ ++$$self{CHANGED};
1652
1699
  $self->VerboseValue('+ FileName', $newName);
1653
1700
  return 1;
1654
1701
  }
@@ -1667,7 +1714,7 @@ sub WriteInfo($$;$$)
1667
1714
  my ($self, $infile, $outfile, $outType) = @_;
1668
1715
  my (@fileTypeList, $fileType, $tiffType, $hdr, $seekErr, $type, $tmpfile);
1669
1716
  my ($inRef, $outRef, $closeIn, $closeOut, $outPos, $outBuff, $eraseIn, $raf);
1670
- my $oldRaf = $self->{RAF};
1717
+ my $oldRaf = $$self{RAF};
1671
1718
  my $rtnVal = 0;
1672
1719
 
1673
1720
  # initialize member variables
@@ -1815,7 +1862,7 @@ sub WriteInfo($$;$$)
1815
1862
  #
1816
1863
  # write the file
1817
1864
  #
1818
- until ($self->{VALUE}{Error}) {
1865
+ until ($$self{VALUE}{Error}) {
1819
1866
  # create random access file object (disable seek test in case of straight copy)
1820
1867
  $raf or $raf = new File::RandomAccess($inRef, 1);
1821
1868
  $raf->BinMode();
@@ -1829,13 +1876,13 @@ sub WriteInfo($$;$$)
1829
1876
  last;
1830
1877
  } elsif (not ref $infile and ($infile eq '-' or $infile =~ /\|$/)) {
1831
1878
  # patch for Windows command shell pipe
1832
- $raf->{TESTED} = -1; # force buffering
1879
+ $$raf{TESTED} = -1; # force buffering
1833
1880
  } else {
1834
1881
  $raf->SeekTest();
1835
1882
  }
1836
1883
  # $raf->Debug() and warn " RAF debugging enabled!\n";
1837
1884
  my $inPos = $raf->Tell();
1838
- $self->{RAF} = $raf;
1885
+ $$self{RAF} = $raf;
1839
1886
  my %dirInfo = (
1840
1887
  RAF => $raf,
1841
1888
  OutFile => $outRef,
@@ -1852,7 +1899,7 @@ sub WriteInfo($$;$$)
1852
1899
  last;
1853
1900
  }
1854
1901
  # save file type in member variable
1855
- $dirInfo{Parent} = $self->{FILE_TYPE} = $self->{PATH}[0] = $type;
1902
+ $dirInfo{Parent} = $$self{FILE_TYPE} = $$self{PATH}[0] = $type;
1856
1903
  # determine which directories we must write for this file type
1857
1904
  $self->InitWriteDirs($type);
1858
1905
  if ($type eq 'JPEG') {
@@ -1916,6 +1963,9 @@ sub WriteInfo($$;$$)
1916
1963
  } elsif ($type eq 'IND') {
1917
1964
  require Image::ExifTool::InDesign;
1918
1965
  $rtnVal = Image::ExifTool::InDesign::ProcessIND($self, \%dirInfo);
1966
+ } elsif ($type eq 'MOV') {
1967
+ require Image::ExifTool::QuickTime;
1968
+ $rtnVal = Image::ExifTool::QuickTime::WriteMOV($self, \%dirInfo);
1919
1969
  } elsif ($type eq 'EXIF') {
1920
1970
  # go through WriteDirectory so block writes, etc are handled
1921
1971
  my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
@@ -1945,7 +1995,7 @@ sub WriteInfo($$;$$)
1945
1995
  if ($seekErr) {
1946
1996
  $err = 'Error seeking in file';
1947
1997
  } elsif ($fileType and defined $rtnVal) {
1948
- if ($self->{VALUE}{Error}) {
1998
+ if ($$self{VALUE}{Error}) {
1949
1999
  # existing error message will do
1950
2000
  } elsif ($fileType eq 'RAW') {
1951
2001
  $err = 'Writing this type of RAW file is not supported';
@@ -1978,7 +2028,7 @@ sub WriteInfo($$;$$)
1978
2028
  }
1979
2029
  # don't return success code if any error occurred
1980
2030
  if ($rtnVal > 0) {
1981
- unless (Tell($outRef) or $self->{VALUE}{Error}) {
2031
+ unless (Tell($outRef) or $$self{VALUE}{Error}) {
1982
2032
  # don't write a file with zero length
1983
2033
  if (defined $hdr and length $hdr) {
1984
2034
  $self->Error("Can't delete all meta information from $type file");
@@ -1986,12 +2036,12 @@ sub WriteInfo($$;$$)
1986
2036
  $self->Error('Nothing to write');
1987
2037
  }
1988
2038
  }
1989
- $rtnVal = 0 if $self->{VALUE}{Error};
2039
+ $rtnVal = 0 if $$self{VALUE}{Error};
1990
2040
  }
1991
2041
 
1992
2042
  # rewrite original file in place if required
1993
2043
  if (defined $outBuff) {
1994
- if ($rtnVal <= 0 or not $self->{CHANGED}) {
2044
+ if ($rtnVal <= 0 or not $$self{CHANGED}) {
1995
2045
  # nothing changed, so no need to write $outBuff
1996
2046
  } elsif (UNIVERSAL::isa($inRef,'GLOB')) {
1997
2047
  my $len = length($outBuff);
@@ -2073,24 +2123,24 @@ sub WriteInfo($$;$$)
2073
2123
  ($closeOut or ($closeIn and defined $outBuff)) and
2074
2124
  $self->SetFileModifyDate($closeOut ? $outfile : $infile, $originalTime) > 0)
2075
2125
  {
2076
- ++$self->{CHANGED}; # we changed something
2126
+ ++$$self{CHANGED}; # we changed something
2077
2127
  }
2078
2128
  # set FileCreateDate if requested (and if possible!)
2079
2129
  if (defined $fileCreateDate and $rtnVal > 0 and
2080
2130
  ($closeOut or ($closeIn and defined $outBuff)) and
2081
2131
  $self->SetFileModifyDate($closeOut ? $outfile : $infile, $createTime, 'FileCreateDate') > 0)
2082
2132
  {
2083
- ++$self->{CHANGED}; # we changed something
2133
+ ++$$self{CHANGED}; # we changed something
2084
2134
  }
2085
2135
  # check for write error and set appropriate error message and return value
2086
2136
  if ($rtnVal < 0) {
2087
2137
  $self->Error('Error writing output file') unless $$self{VALUE}{Error};
2088
2138
  $rtnVal = 0; # return 0 on failure
2089
2139
  } elsif ($rtnVal > 0) {
2090
- ++$rtnVal unless $self->{CHANGED};
2140
+ ++$rtnVal unless $$self{CHANGED};
2091
2141
  }
2092
2142
  # set things back to the way they were
2093
- $self->{RAF} = $oldRaf;
2143
+ $$self{RAF} = $oldRaf;
2094
2144
 
2095
2145
  return $rtnVal;
2096
2146
  }
@@ -2107,7 +2157,7 @@ sub GetAllTags(;$)
2107
2157
  my (%allTags, @groups);
2108
2158
  @groups = split ':', $group if $group;
2109
2159
 
2110
- my $exifTool = new Image::ExifTool;
2160
+ my $et = new Image::ExifTool;
2111
2161
  LoadAllTables(); # first load all our tables
2112
2162
  my @tableNames = keys %allTables;
2113
2163
 
@@ -2125,7 +2175,7 @@ GATInfo: foreach $tagInfo (@infoArray) {
2125
2175
  next if $$tagInfo{SubDirectory} and not $$tagInfo{Writable};
2126
2176
  next if $$tagInfo{Hidden}; # ignore hidden tags
2127
2177
  if (@groups) {
2128
- my @tg = $exifTool->GetGroup($tagInfo);
2178
+ my @tg = $et->GetGroup($tagInfo);
2129
2179
  foreach $group (@groups) {
2130
2180
  next GATInfo unless grep /^$group$/i, @tg;
2131
2181
  }
@@ -2148,7 +2198,7 @@ sub GetWritableTags(;$)
2148
2198
  my (%writableTags, @groups);
2149
2199
  @groups = split ':', $group if $group;
2150
2200
 
2151
- my $exifTool = new Image::ExifTool;
2201
+ my $et = new Image::ExifTool;
2152
2202
  LoadAllTables();
2153
2203
  my @tableNames = keys %allTables;
2154
2204
 
@@ -2171,11 +2221,11 @@ GWTInfo: foreach $tagInfo (@infoArray) {
2171
2221
  my $tag = $$tagInfo{Name};
2172
2222
  $tag or warn("no name for tag!\n"), next;
2173
2223
  my $writable = $$tagInfo{Writable};
2174
- next unless $writable or ($table->{WRITABLE} and
2224
+ next unless $writable or ($$table{WRITABLE} and
2175
2225
  not defined $writable and not $$tagInfo{SubDirectory});
2176
2226
  next if $$tagInfo{Hidden}; # ignore hidden tags
2177
2227
  if (@groups) {
2178
- my @tg = $exifTool->GetGroup($tagInfo);
2228
+ my @tg = $et->GetGroup($tagInfo);
2179
2229
  foreach $group (@groups) {
2180
2230
  next GWTInfo unless grep /^$group$/i, @tg;
2181
2231
  }
@@ -2227,7 +2277,7 @@ sub GetAllGroups($)
2227
2277
  sub GetNewGroups($)
2228
2278
  {
2229
2279
  my $self = shift;
2230
- return @{$self->{WRITE_GROUPS}};
2280
+ return @{$$self{WRITE_GROUPS}};
2231
2281
  }
2232
2282
 
2233
2283
  #------------------------------------------------------------------------------
@@ -2235,7 +2285,7 @@ sub GetNewGroups($)
2235
2285
  # Returns: List of group names (sorted alphabetically)
2236
2286
  sub GetDeleteGroups()
2237
2287
  {
2238
- return sort @delGroups;
2288
+ return sort @delGroups, @delGroup2;
2239
2289
  }
2240
2290
 
2241
2291
  #------------------------------------------------------------------------------
@@ -2308,7 +2358,7 @@ Conv: for (;;) {
2308
2358
  if (not defined $type) {
2309
2359
  # split value into list if necessary
2310
2360
  if ($$tagInfo{List}) {
2311
- my $listSplit = $$tagInfo{AutoSplit} || $self->{OPTIONS}{ListSplit};
2361
+ my $listSplit = $$tagInfo{AutoSplit} || $$self{OPTIONS}{ListSplit};
2312
2362
  if (defined $listSplit) {
2313
2363
  $listSplit = ',?\s+' if $listSplit eq '1' and $$tagInfo{AutoSplit};
2314
2364
  my @splitVal = split /$listSplit/, $val;
@@ -2326,15 +2376,15 @@ Conv: for (;;) {
2326
2376
  }
2327
2377
  # finally, do our value check
2328
2378
  my ($err2, $v);
2329
- if ($tagInfo->{WriteCheck}) {
2379
+ if ($$tagInfo{WriteCheck}) {
2330
2380
  #### eval WriteCheck ($self, $tagInfo, $val)
2331
- $err2 = eval $tagInfo->{WriteCheck};
2381
+ $err2 = eval $$tagInfo{WriteCheck};
2332
2382
  $@ and warn($@), $err2 = 'Error evaluating WriteCheck';
2333
2383
  }
2334
2384
  unless ($err2) {
2335
- my $table = $tagInfo->{Table};
2336
- if ($table and $table->{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
2337
- my $checkProc = $table->{CHECK_PROC};
2385
+ my $table = $$tagInfo{Table};
2386
+ if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
2387
+ my $checkProc = $$table{CHECK_PROC};
2338
2388
  if (ref $val eq 'ARRAY') {
2339
2389
  # loop through array values
2340
2390
  foreach $v (@$val) {
@@ -2357,8 +2407,8 @@ Conv: for (;;) {
2357
2407
  }
2358
2408
  last;
2359
2409
  }
2360
- my $conv = $tagInfo->{$type};
2361
- my $convInv = $tagInfo->{"${type}Inv"};
2410
+ my $conv = $$tagInfo{$type};
2411
+ my $convInv = $$tagInfo{"${type}Inv"};
2362
2412
  # nothing to do at this level if no conversion defined
2363
2413
  next unless defined $conv or defined $convInv;
2364
2414
 
@@ -2413,7 +2463,7 @@ Conv: for (;;) {
2413
2463
  my ($multi, $lc);
2414
2464
  # insert alternate language print conversions if required
2415
2465
  if ($$self{CUR_LANG} and $type eq 'PrintConv' and
2416
- ref($lc = $self->{CUR_LANG}{$tag}) eq 'HASH' and
2466
+ ref($lc = $$self{CUR_LANG}{$tag}) eq 'HASH' and
2417
2467
  ($lc = $$lc{PrintConv}))
2418
2468
  {
2419
2469
  my %newConv;
@@ -2579,9 +2629,9 @@ sub InsertTagValues($$$;$)
2579
2629
  }
2580
2630
  }
2581
2631
  if (ref $val eq 'ARRAY') {
2582
- $val = join($self->{OPTIONS}{ListSep}, @$val);
2632
+ $val = join($$self{OPTIONS}{ListSep}, @$val);
2583
2633
  } elsif (ref $val eq 'SCALAR') {
2584
- if ($self->{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
2634
+ if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
2585
2635
  $val = $$val;
2586
2636
  } else {
2587
2637
  $val = 'Binary data ' . length($$val) . ' bytes';
@@ -2616,7 +2666,7 @@ sub InsertTagValues($$$;$)
2616
2666
  $val = join '', @vals;
2617
2667
  }
2618
2668
  unless (defined $val or ref $opt) {
2619
- $val = $self->{OPTIONS}{MissingTagValue};
2669
+ $val = $$self{OPTIONS}{MissingTagValue};
2620
2670
  unless (defined $val) {
2621
2671
  no strict 'refs';
2622
2672
  return undef if $opt and &$opt($self, "Tag '$var' not defined", 2);
@@ -2700,8 +2750,9 @@ sub CopyFileAttrs($$)
2700
2750
  }
2701
2751
 
2702
2752
  #------------------------------------------------------------------------------
2703
- # Get new file name
2704
- # Inputs: 0) existing name, 1) new name
2753
+ # Get new file path name
2754
+ # Inputs: 0) existing name (may contain directory),
2755
+ # 1) new file name, new directory, or new path (dir+name)
2705
2756
  # Returns: new file path name
2706
2757
  sub GetNewFileName($$)
2707
2758
  {
@@ -2883,7 +2934,7 @@ sub GetWriteGroup1($$)
2883
2934
  sub GetNewValueHash($$;$$$)
2884
2935
  {
2885
2936
  my ($self, $tagInfo, $writeGroup, $opts) = @_;
2886
- my $nvHash = $self->{NEW_VALUE}{$tagInfo};
2937
+ my $nvHash = $$self{NEW_VALUE}{$tagInfo};
2887
2938
 
2888
2939
  my %opts; # quick lookup for options
2889
2940
  $opts and $opts{$opts} = 1;
@@ -2891,8 +2942,11 @@ sub GetNewValueHash($$;$$$)
2891
2942
 
2892
2943
  if ($writeGroup) {
2893
2944
  # find the new value in the list with the specified write group
2894
- while ($nvHash and $nvHash->{WriteGroup} ne $writeGroup) {
2895
- $nvHash = $nvHash->{Next};
2945
+ # (QuickTime is a special case because all group1 tags may be updated at once)
2946
+ while ($nvHash and $$nvHash{WriteGroup} ne $writeGroup and
2947
+ $$nvHash{WriteGroup} ne 'QuickTime')
2948
+ {
2949
+ $nvHash = $$nvHash{Next};
2896
2950
  }
2897
2951
  }
2898
2952
  # remove this entry if deleting, or if creating a new entry and
@@ -2912,11 +2966,11 @@ sub GetNewValueHash($$;$$$)
2912
2966
  next unless ref $copy{$key} eq 'ARRAY';
2913
2967
  $copy{$key} = [ @{$copy{$key}} ];
2914
2968
  }
2915
- my $saveHash = $self->{SAVE_NEW_VALUE};
2969
+ my $saveHash = $$self{SAVE_NEW_VALUE};
2916
2970
  # add to linked list of saved new value hashes
2917
- $copy{Next} = $saveHash->{$tagInfo};
2918
- $saveHash->{$tagInfo} = \%copy;
2919
- delete $nvHash->{Save}; # don't save it again
2971
+ $copy{Next} = $$saveHash{$tagInfo};
2972
+ $$saveHash{$tagInfo} = \%copy;
2973
+ delete $$nvHash{Save}; # don't save it again
2920
2974
  }
2921
2975
  }
2922
2976
  if (not defined $nvHash and $opts{'create'}) {
@@ -2927,12 +2981,12 @@ sub GetNewValueHash($$;$$$)
2927
2981
  IsNVH => 1, # set flag so we can recognize a new value hash
2928
2982
  };
2929
2983
  # add entry to our NEW_VALUE hash
2930
- if ($self->{NEW_VALUE}{$tagInfo}) {
2984
+ if ($$self{NEW_VALUE}{$tagInfo}) {
2931
2985
  # add to end of linked list
2932
- my $lastHash = LastInList($self->{NEW_VALUE}{$tagInfo});
2933
- $lastHash->{Next} = $nvHash;
2986
+ my $lastHash = LastInList($$self{NEW_VALUE}{$tagInfo});
2987
+ $$lastHash{Next} = $nvHash;
2934
2988
  } else {
2935
- $self->{NEW_VALUE}{$tagInfo} = $nvHash;
2989
+ $$self{NEW_VALUE}{$tagInfo} = $nvHash;
2936
2990
  }
2937
2991
  }
2938
2992
  return $nvHash;
@@ -2960,7 +3014,7 @@ sub LoadAllTables()
2960
3014
  while (@tableNames) {
2961
3015
  $table = GetTagTable(shift @tableNames);
2962
3016
  # call write proc if it exists in case it adds tags to the table
2963
- my $writeProc = $table->{WRITE_PROC};
3017
+ my $writeProc = $$table{WRITE_PROC};
2964
3018
  $writeProc and &$writeProc();
2965
3019
  # recursively scan through tables in subdirectories
2966
3020
  foreach (TagTableKeys($table)) {
@@ -2985,26 +3039,26 @@ sub LoadAllTables()
2985
3039
  sub RemoveNewValueHash($$$)
2986
3040
  {
2987
3041
  my ($self, $nvHash, $tagInfo) = @_;
2988
- my $firstHash = $self->{NEW_VALUE}{$tagInfo};
3042
+ my $firstHash = $$self{NEW_VALUE}{$tagInfo};
2989
3043
  if ($nvHash eq $firstHash) {
2990
3044
  # remove first entry from linked list
2991
- if ($nvHash->{Next}) {
2992
- $self->{NEW_VALUE}{$tagInfo} = $nvHash->{Next};
3045
+ if ($$nvHash{Next}) {
3046
+ $$self{NEW_VALUE}{$tagInfo} = $$nvHash{Next};
2993
3047
  } else {
2994
- delete $self->{NEW_VALUE}{$tagInfo};
3048
+ delete $$self{NEW_VALUE}{$tagInfo};
2995
3049
  }
2996
3050
  } else {
2997
3051
  # find the list element pointing to this hash
2998
- $firstHash = $firstHash->{Next} while $firstHash->{Next} ne $nvHash;
3052
+ $firstHash = $$firstHash{Next} while $$firstHash{Next} ne $nvHash;
2999
3053
  # remove from linked list
3000
- $firstHash->{Next} = $nvHash->{Next};
3054
+ $$firstHash{Next} = $$nvHash{Next};
3001
3055
  }
3002
3056
  # save the existing entry if necessary
3003
- if ($nvHash->{Save}) {
3004
- my $saveHash = $self->{SAVE_NEW_VALUE};
3057
+ if ($$nvHash{Save}) {
3058
+ my $saveHash = $$self{SAVE_NEW_VALUE};
3005
3059
  # add to linked list of saved new value hashes
3006
- $nvHash->{Next} = $saveHash->{$tagInfo};
3007
- $saveHash->{$tagInfo} = $nvHash;
3060
+ $$nvHash{Next} = $$saveHash{$tagInfo};
3061
+ $$saveHash{$tagInfo} = $nvHash;
3008
3062
  }
3009
3063
  }
3010
3064
 
@@ -3015,25 +3069,25 @@ sub RemoveNewValuesForGroup($$)
3015
3069
  {
3016
3070
  my ($self, $group) = @_;
3017
3071
 
3018
- return unless $self->{NEW_VALUE};
3072
+ return unless $$self{NEW_VALUE};
3019
3073
 
3020
3074
  # make list of all groups we must remove
3021
3075
  my @groups = ( $group );
3022
3076
  push @groups, @{$removeGroups{$group}} if $removeGroups{$group};
3023
3077
 
3024
3078
  my ($out, @keys, $hashKey);
3025
- $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose} > 1;
3079
+ $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose} > 1;
3026
3080
 
3027
3081
  # loop though all new values, and remove any in this group
3028
- @keys = keys %{$self->{NEW_VALUE}};
3082
+ @keys = keys %{$$self{NEW_VALUE}};
3029
3083
  foreach $hashKey (@keys) {
3030
- my $nvHash = $self->{NEW_VALUE}{$hashKey};
3084
+ my $nvHash = $$self{NEW_VALUE}{$hashKey};
3031
3085
  # loop through each entry in linked list
3032
3086
  for (;;) {
3033
- my $nextHash = $nvHash->{Next};
3034
- my $tagInfo = $nvHash->{TagInfo};
3087
+ my $nextHash = $$nvHash{Next};
3088
+ my $tagInfo = $$nvHash{TagInfo};
3035
3089
  my ($grp0,$grp1) = $self->GetGroup($tagInfo);
3036
- my $wgrp = $nvHash->{WriteGroup};
3090
+ my $wgrp = $$nvHash{WriteGroup};
3037
3091
  # use group1 if write group is not specific
3038
3092
  $wgrp = $grp1 if $wgrp eq $grp0;
3039
3093
  if (grep /^($grp0|$wgrp)$/i, @groups) {
@@ -3054,12 +3108,12 @@ sub GetNewTagInfoList($;$)
3054
3108
  {
3055
3109
  my ($self, $tagTablePtr) = @_;
3056
3110
  my @tagInfoList;
3057
- my $nv = $self->{NEW_VALUE};
3111
+ my $nv = $$self{NEW_VALUE};
3058
3112
  if ($nv) {
3059
3113
  my $hashKey;
3060
3114
  foreach $hashKey (keys %$nv) {
3061
- my $tagInfo = $nv->{$hashKey}{TagInfo};
3062
- next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
3115
+ my $tagInfo = $$nv{$hashKey}{TagInfo};
3116
+ next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table};
3063
3117
  push @tagInfoList, $tagInfo;
3064
3118
  }
3065
3119
  }
@@ -3074,12 +3128,12 @@ sub GetNewTagInfoHash($@)
3074
3128
  {
3075
3129
  my $self = shift;
3076
3130
  my (%tagInfoHash, $hashKey);
3077
- my $nv = $self->{NEW_VALUE};
3131
+ my $nv = $$self{NEW_VALUE};
3078
3132
  while ($nv) {
3079
3133
  my $tagTablePtr = shift || last;
3080
3134
  foreach $hashKey (keys %$nv) {
3081
- my $tagInfo = $nv->{$hashKey}{TagInfo};
3082
- next if $tagTablePtr and $tagTablePtr ne $tagInfo->{Table};
3135
+ my $tagInfo = $$nv{$hashKey}{TagInfo};
3136
+ next if $tagTablePtr and $tagTablePtr ne $$tagInfo{Table};
3083
3137
  $tagInfoHash{$$tagInfo{TagID}} = $tagInfo;
3084
3138
  }
3085
3139
  }
@@ -3095,12 +3149,12 @@ sub GetNewTagInfoHash($@)
3095
3149
  sub GetAddDirHash($$;$)
3096
3150
  {
3097
3151
  my ($self, $tagTablePtr, $parent) = @_;
3098
- $parent or $parent = $tagTablePtr->{GROUPS}{0};
3152
+ $parent or $parent = $$tagTablePtr{GROUPS}{0};
3099
3153
  my $tagID;
3100
3154
  my %addDirHash;
3101
3155
  my %editDirHash;
3102
- my $addDirs = $self->{ADD_DIRS};
3103
- my $editDirs = $self->{EDIT_DIRS};
3156
+ my $addDirs = $$self{ADD_DIRS};
3157
+ my $editDirs = $$self{EDIT_DIRS};
3104
3158
  foreach $tagID (TagTableKeys($tagTablePtr)) {
3105
3159
  my @infoArray = GetTagInfoList($tagTablePtr,$tagID);
3106
3160
  my $tagInfo;
@@ -3109,11 +3163,11 @@ sub GetAddDirHash($$;$)
3109
3163
  # get name for this sub directory
3110
3164
  # (take directory name from SubDirectory DirName if it exists,
3111
3165
  # otherwise Group0 name of SubDirectory TagTable or tag Group1 name)
3112
- my $dirName = $tagInfo->{SubDirectory}{DirName};
3166
+ my $dirName = $$tagInfo{SubDirectory}{DirName};
3113
3167
  unless ($dirName) {
3114
3168
  # use tag name for directory name and save for next time
3115
3169
  $dirName = $$tagInfo{Name};
3116
- $tagInfo->{SubDirectory}{DirName} = $dirName;
3170
+ $$tagInfo{SubDirectory}{DirName} = $dirName;
3117
3171
  }
3118
3172
  # save this directory information if we are writing it
3119
3173
  if ($$editDirs{$dirName} and $$editDirs{$dirName} eq $parent) {
@@ -3162,8 +3216,8 @@ sub GetLangInfo($$)
3162
3216
  sub InitWriteDirs($$;$)
3163
3217
  {
3164
3218
  my ($self, $fileType, $preferredGroup) = @_;
3165
- my $editDirs = $self->{EDIT_DIRS} = { };
3166
- my $addDirs = $self->{ADD_DIRS} = { };
3219
+ my $editDirs = $$self{EDIT_DIRS} = { };
3220
+ my $addDirs = $$self{ADD_DIRS} = { };
3167
3221
  my $fileDirs = $dirMap{$fileType};
3168
3222
  unless ($fileDirs) {
3169
3223
  return unless ref $fileType eq 'HASH';
@@ -3179,14 +3233,14 @@ sub InitWriteDirs($$;$)
3179
3233
  # cycle through all hashes in linked list
3180
3234
  for ($nvHash=$self->GetNewValueHash($tagInfo); $nvHash; $nvHash=$$nvHash{Next}) {
3181
3235
  # are we creating this tag? (otherwise just deleting or editing it)
3182
- my $isCreating = $nvHash->{IsCreating};
3236
+ my $isCreating = $$nvHash{IsCreating};
3183
3237
  if ($isCreating) {
3184
3238
  # if another group is taking priority, only create
3185
3239
  # directory if specifically adding tags to this group
3186
3240
  # or if this tag isn't being added to the priority group
3187
3241
  $isCreating = 0 if $preferredGroup and
3188
3242
  $preferredGroup ne $self->GetGroup($tagInfo, 0) and
3189
- $nvHash->{CreateGroups}{$preferredGroup};
3243
+ $$nvHash{CreateGroups}{$preferredGroup};
3190
3244
  } else {
3191
3245
  # creating this directory if any tag is preferred and has a value
3192
3246
  $isCreating = 1 if ($preferredGroup and $$nvHash{Value} and
@@ -3195,7 +3249,7 @@ sub InitWriteDirs($$;$)
3195
3249
  }
3196
3250
  # tag belongs to directory specified by WriteGroup, or by
3197
3251
  # the Group0 name if WriteGroup not defined
3198
- my $dirName = $nvHash->{WriteGroup};
3252
+ my $dirName = $$nvHash{WriteGroup};
3199
3253
  # remove MIE copy number(s) if they exist
3200
3254
  if ($dirName =~ /^MIE\d*(-[a-z]+)?\d*$/i) {
3201
3255
  $dirName = 'MIE' . ($1 || '');
@@ -3213,9 +3267,9 @@ sub InitWriteDirs($$;$)
3213
3267
  }
3214
3268
  }
3215
3269
  }
3216
- if (%{$self->{DEL_GROUP}}) {
3270
+ if (%{$$self{DEL_GROUP}}) {
3217
3271
  # add delete groups to list of edited groups
3218
- foreach (keys %{$self->{DEL_GROUP}}) {
3272
+ foreach (keys %{$$self{DEL_GROUP}}) {
3219
3273
  next if /^-/; # ignore excluded groups
3220
3274
  my $dirName = $_;
3221
3275
  # translate necessary group 0 names
@@ -3240,12 +3294,12 @@ sub InitWriteDirs($$;$)
3240
3294
  $$editDirs{APP0} = undef;
3241
3295
  }
3242
3296
 
3243
- if ($self->{OPTIONS}{Verbose}) {
3244
- my $out = $self->{OPTIONS}{TextOut};
3297
+ if ($$self{OPTIONS}{Verbose}) {
3298
+ my $out = $$self{OPTIONS}{TextOut};
3245
3299
  print $out " Editing tags in: ";
3246
3300
  foreach (sort keys %$editDirs) { print $out "$_ "; }
3247
3301
  print $out "\n";
3248
- return unless $self->{OPTIONS}{Verbose} > 1;
3302
+ return unless $$self{OPTIONS}{Verbose} > 1;
3249
3303
  print $out " Creating tags in: ";
3250
3304
  foreach (sort keys %$addDirs) { print $out "$_ "; }
3251
3305
  print $out "\n";
@@ -3263,14 +3317,14 @@ sub WriteDirectory($$$;$)
3263
3317
  my ($out, $nvHash);
3264
3318
 
3265
3319
  $tagTablePtr or return undef;
3266
- $out = $self->{OPTIONS}{TextOut} if $self->{OPTIONS}{Verbose};
3320
+ $out = $$self{OPTIONS}{TextOut} if $$self{OPTIONS}{Verbose};
3267
3321
  # set directory name from default group0 name if not done already
3268
3322
  my $dirName = $$dirInfo{DirName};
3269
3323
  my $dataPt = $$dirInfo{DataPt};
3270
- my $grp0 = $tagTablePtr->{GROUPS}{0};
3324
+ my $grp0 = $$tagTablePtr{GROUPS}{0};
3271
3325
  $dirName or $dirName = $$dirInfo{DirName} = $grp0;
3272
- if (%{$self->{DEL_GROUP}}) {
3273
- my $delGroup = $self->{DEL_GROUP};
3326
+ if (%{$$self{DEL_GROUP}}) {
3327
+ my $delGroup = $$self{DEL_GROUP};
3274
3328
  # delete entire directory if specified
3275
3329
  my $grp1 = $dirName;
3276
3330
  my $delFlag = ($$delGroup{$grp0} or $$delGroup{$grp1});
@@ -3284,7 +3338,7 @@ sub WriteDirectory($$$;$)
3284
3338
  } elsif ($$self{FILE_TYPE} =~ /^(EPS|PS)$/) {
3285
3339
  # allow anything to be deleted from PostScript files
3286
3340
  } elsif ($grp1 eq 'IFD0') {
3287
- my $type = $self->{TIFF_TYPE} || $self->{FILE_TYPE};
3341
+ my $type = $$self{TIFF_TYPE} || $$self{FILE_TYPE};
3288
3342
  $$delGroup{IFD0} and $self->Warn("Can't delete IFD0 from $type",1);
3289
3343
  undef $grp1;
3290
3344
  } elsif ($grp0 eq 'EXIF' and $$delGroup{$grp0}) {
@@ -3293,10 +3347,10 @@ sub WriteDirectory($$$;$)
3293
3347
  }
3294
3348
  if ($grp1) {
3295
3349
  if ($dataPt or $$dirInfo{RAF}) {
3296
- ++$self->{CHANGED};
3350
+ ++$$self{CHANGED};
3297
3351
  $out and print $out " Deleting $grp1\n";
3298
3352
  # can no longer validate TIFF_END if deleting an entire IFD
3299
- delete $self->{TIFF_END} if $dirName =~ /IFD/;
3353
+ delete $$self{TIFF_END} if $dirName =~ /IFD/;
3300
3354
  }
3301
3355
  # don't add back into the wrong location
3302
3356
  my $right = $$self{ADD_DIRS}{$grp1};
@@ -3349,7 +3403,7 @@ sub WriteDirectory($$$;$)
3349
3403
  my $blockName = $dirName;
3350
3404
  $blockName = 'EXIF' if $blockName eq 'IFD0';
3351
3405
  my $tagInfo = $Image::ExifTool::Extra{$blockName} || $$dirInfo{TagInfo};
3352
- while ($tagInfo and ($nvHash = $self->{NEW_VALUE}{$tagInfo}) and
3406
+ while ($tagInfo and ($nvHash = $$self{NEW_VALUE}{$tagInfo}) and
3353
3407
  $self->IsOverwriting($nvHash) and not ($$nvHash{CreateOnly} and $isRewriting))
3354
3408
  {
3355
3409
  # protect against writing EXIF to wrong file types, etc
@@ -3374,18 +3428,18 @@ sub WriteDirectory($$$;$)
3374
3428
  }
3375
3429
  $$dirInfo{BlockWrite} = 1; # set flag indicating we did a block write
3376
3430
  $out and print $out " $verb $blockName as a block\n";
3377
- ++$self->{CHANGED};
3431
+ ++$$self{CHANGED};
3378
3432
  return $newVal;
3379
3433
  }
3380
3434
  # guard against writing the same directory twice
3381
3435
  if (defined $dataPt and defined $$dirInfo{DirStart} and defined $$dirInfo{DataPos}) {
3382
3436
  my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE};
3383
3437
  # (Phase One P25 IIQ files have ICC_Profile duplicated in IFD0 and IFD1)
3384
- if ($self->{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) {
3385
- if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne $self->{PROCESSED}{$addr}) {
3438
+ if ($$self{PROCESSED}{$addr} and ($dirName ne 'ICC_Profile' or $$self{TIFF_TYPE} ne 'IIQ')) {
3439
+ if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne $$self{PROCESSED}{$addr}) {
3386
3440
  # it is hypothetically possible to have 2 different directories
3387
3441
  # with the same address if one has a length of zero
3388
- } elsif ($self->Error("$dirName pointer references previous $self->{PROCESSED}{$addr} directory", 2)) {
3442
+ } elsif ($self->Error("$dirName pointer references previous $$self{PROCESSED}{$addr} directory", 2)) {
3389
3443
  return undef;
3390
3444
  } else {
3391
3445
  $self->Warn("Deleting duplicate $dirName directory");
@@ -3393,29 +3447,29 @@ sub WriteDirectory($$$;$)
3393
3447
  return ''; # delete the duplicate directory
3394
3448
  }
3395
3449
  } else {
3396
- $self->{PROCESSED}{$addr} = $dirName;
3450
+ $$self{PROCESSED}{$addr} = $dirName;
3397
3451
  }
3398
3452
  }
3399
- my $oldDir = $self->{DIR_NAME};
3453
+ my $oldDir = $$self{DIR_NAME};
3400
3454
  my $name;
3401
3455
  if ($out) {
3402
3456
  $name = ($dirName eq 'MakerNotes' and $$dirInfo{TagInfo}) ?
3403
- $dirInfo->{TagInfo}{Name} : $dirName;
3457
+ $$dirInfo{TagInfo}{Name} : $dirName;
3404
3458
  if (not defined $oldDir or $oldDir ne $name) {
3405
3459
  my $verb = $isRewriting ? 'Rewriting' : 'Creating';
3406
3460
  print $out " $verb $name\n";
3407
3461
  }
3408
3462
  }
3409
3463
  my $saveOrder = GetByteOrder();
3410
- my $oldChanged = $self->{CHANGED};
3411
- $self->{DIR_NAME} = $dirName;
3412
- push @{$self->{PATH}}, $dirName;
3464
+ my $oldChanged = $$self{CHANGED};
3465
+ $$self{DIR_NAME} = $dirName;
3466
+ push @{$$self{PATH}}, $dirName;
3413
3467
  $$dirInfo{IsWriting} = 1;
3414
3468
  my $newData = &$writeProc($self, $dirInfo, $tagTablePtr);
3415
- pop @{$self->{PATH}};
3469
+ pop @{$$self{PATH}};
3416
3470
  # nothing changed if error occurred or nothing was created
3417
- $self->{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting);
3418
- $self->{DIR_NAME} = $oldDir;
3471
+ $$self{CHANGED} = $oldChanged unless defined $newData and (length($newData) or $isRewriting);
3472
+ $$self{DIR_NAME} = $oldDir;
3419
3473
  SetByteOrder($saveOrder);
3420
3474
  print $out " Deleting $name\n" if $out and defined $newData and not length $newData;
3421
3475
  return $newData;
@@ -3525,8 +3579,8 @@ sub HexDump($;$%)
3525
3579
  sub VerboseInfo($$$%)
3526
3580
  {
3527
3581
  my ($self, $tagID, $tagInfo, %parms) = @_;
3528
- my $verbose = $self->{OPTIONS}{Verbose};
3529
- my $out = $self->{OPTIONS}{TextOut};
3582
+ my $verbose = $$self{OPTIONS}{Verbose};
3583
+ my $out = $$self{OPTIONS}{TextOut};
3530
3584
  my ($tag, $line, $hexID);
3531
3585
 
3532
3586
  # generate hex number if tagID is numerical
@@ -3551,7 +3605,7 @@ sub VerboseInfo($$$%)
3551
3605
  my $dataPt = $parms{DataPt};
3552
3606
  my $size = $parms{Size};
3553
3607
  $size = length $$dataPt unless defined $size or not $dataPt;
3554
- my $indent = $self->{INDENT};
3608
+ my $indent = $$self{INDENT};
3555
3609
 
3556
3610
  # Level 1: print tag/value information
3557
3611
  $line = $indent;
@@ -3625,8 +3679,8 @@ sub DumpTrailer($$)
3625
3679
  my $curPos = $raf->Tell();
3626
3680
  my $trailer = $$dirInfo{DirName} || 'Unknown';
3627
3681
  my $pos = $$dirInfo{DataPos};
3628
- my $verbose = $self->{OPTIONS}{Verbose};
3629
- my $htmlDump = $self->{HTML_DUMP};
3682
+ my $verbose = $$self{OPTIONS}{Verbose};
3683
+ my $htmlDump = $$self{HTML_DUMP};
3630
3684
  my ($buff, $buf2);
3631
3685
  my $size = $$dirInfo{DirLen};
3632
3686
  $pos = $curPos unless defined $pos;
@@ -3646,7 +3700,7 @@ sub DumpTrailer($$)
3646
3700
  $self->HDump($pos, $num, $desc, undef, 0x08);
3647
3701
  last;
3648
3702
  }
3649
- my $out = $self->{OPTIONS}{TextOut};
3703
+ my $out = $$self{OPTIONS}{TextOut};
3650
3704
  printf $out "$trailer trailer (%d bytes at offset 0x%.4x):\n", $size, $pos;
3651
3705
  last unless $verbose > 2;
3652
3706
  my $num = $size; # number of bytes to read
@@ -3686,8 +3740,8 @@ sub DumpUnknownTrailer($$)
3686
3740
  my $pos = $$dirInfo{DataPos};
3687
3741
  my $endPos = $pos + $$dirInfo{DirLen};
3688
3742
  # account for preview/MPF image trailer
3689
- my $prePos = $self->{VALUE}{PreviewImageStart} || $$self{PreviewImageStart};
3690
- my $preLen = $self->{VALUE}{PreviewImageLength} || $$self{PreviewImageLength};
3743
+ my $prePos = $$self{VALUE}{PreviewImageStart} || $$self{PreviewImageStart};
3744
+ my $preLen = $$self{VALUE}{PreviewImageLength} || $$self{PreviewImageLength};
3691
3745
  my $tag = 'PreviewImage';
3692
3746
  my $mpImageNum = 0;
3693
3747
  my (%image, $lastOne);
@@ -3697,12 +3751,12 @@ sub DumpUnknownTrailer($$)
3697
3751
  last if $lastOne; # checked all images
3698
3752
  # look for MPF images (in the the proper order)
3699
3753
  ++$mpImageNum;
3700
- $prePos = $self->{VALUE}{"MPImageStart ($mpImageNum)"};
3754
+ $prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"};
3701
3755
  if (defined $prePos) {
3702
- $preLen = $self->{VALUE}{"MPImageLength ($mpImageNum)"};
3756
+ $preLen = $$self{VALUE}{"MPImageLength ($mpImageNum)"};
3703
3757
  } else {
3704
- $prePos = $self->{VALUE}{'MPImageStart'};
3705
- $preLen = $self->{VALUE}{'MPImageLength'};
3758
+ $prePos = $$self{VALUE}{'MPImageStart'};
3759
+ $preLen = $$self{VALUE}{'MPImageLength'};
3706
3760
  $lastOne = 1;
3707
3761
  }
3708
3762
  $tag = "MPImage$mpImageNum";
@@ -3720,7 +3774,7 @@ sub DumpUnknownTrailer($$)
3720
3774
  ($tag, $preLen) = @{$image{$prePos}};
3721
3775
  last unless $preLen;
3722
3776
  # dump image if verbose (it is htmlDump'd by ExtractImage)
3723
- if ($self->{OPTIONS}{Verbose}) {
3777
+ if ($$self{OPTIONS}{Verbose}) {
3724
3778
  $$dirInfo{DirName} = $tag;
3725
3779
  $$dirInfo{DataPos} = $prePos;
3726
3780
  $$dirInfo{DirLen} = $preLen;
@@ -3737,8 +3791,8 @@ sub DumpUnknownTrailer($$)
3737
3791
  sub LastInList($)
3738
3792
  {
3739
3793
  my $element = shift;
3740
- while ($element->{Next}) {
3741
- $element = $element->{Next};
3794
+ while ($$element{Next}) {
3795
+ $element = $$element{Next};
3742
3796
  }
3743
3797
  return $element;
3744
3798
  }
@@ -3751,13 +3805,13 @@ sub LastInList($)
3751
3805
  sub VerboseDir($$;$$)
3752
3806
  {
3753
3807
  my ($self, $name, $entries, $size) = @_;
3754
- return unless $self->{OPTIONS}{Verbose};
3808
+ return unless $$self{OPTIONS}{Verbose};
3755
3809
  if (ref $name eq 'HASH') {
3756
3810
  $size = $$name{DirLen} unless $size;
3757
3811
  $name = $$name{Name} || $$name{DirName};
3758
3812
  }
3759
- my $indent = substr($self->{INDENT}, 0, -2);
3760
- my $out = $self->{OPTIONS}{TextOut};
3813
+ my $indent = substr($$self{INDENT}, 0, -2);
3814
+ my $out = $$self{OPTIONS}{TextOut};
3761
3815
  my $str = $entries ? " with $entries entries" : '';
3762
3816
  $str .= ", $size bytes" if $size;
3763
3817
  print $out "$indent+ [$name directory$str]\n";
@@ -3771,7 +3825,7 @@ sub VerboseValue($$$;$)
3771
3825
  {
3772
3826
  return unless $_[0]{OPTIONS}{Verbose} > 1;
3773
3827
  my ($self, $str, $val, $xtra) = @_;
3774
- my $out = $self->{OPTIONS}{TextOut};
3828
+ my $out = $$self{OPTIONS}{TextOut};
3775
3829
  $xtra or $xtra = '';
3776
3830
  my $maxLen = 81 - length($str) - length($xtra);
3777
3831
  $val = $self->Printable($val, $maxLen);
@@ -3963,10 +4017,10 @@ sub SetPreferredByteOrder($)
3963
4017
  my $self = shift;
3964
4018
  my $byteOrder = $self->Options('ByteOrder') ||
3965
4019
  $self->GetNewValues('ExifByteOrder') ||
3966
- $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
4020
+ $$self{MAKER_NOTE_BYTE_ORDER} || 'MM';
3967
4021
  unless (SetByteOrder($byteOrder)) {
3968
4022
  warn "Invalid byte order '$byteOrder'\n" if $self->Options('Verbose');
3969
- $byteOrder = $self->{MAKER_NOTE_BYTE_ORDER} || 'MM';
4023
+ $byteOrder = $$self{MAKER_NOTE_BYTE_ORDER} || 'MM';
3970
4024
  SetByteOrder($byteOrder);
3971
4025
  }
3972
4026
  return GetByteOrder();
@@ -4039,6 +4093,16 @@ sub Set32s(@)
4039
4093
  $val < 0 and $val += 0xffffffff, ++$val;
4040
4094
  return Set32u($val, @_);
4041
4095
  }
4096
+ sub Set64u(@)
4097
+ {
4098
+ my $val = shift;
4099
+ my $hi = int($val / 4294967296);
4100
+ my $lo = Set32u($val - $hi * 4294967296);
4101
+ $hi = Set32u($hi);
4102
+ $val = GetByteOrder() eq 'MM' ? $hi . $lo : $lo . $hi;
4103
+ $_[1] and substr(${$_[1]}, $_[2], length($val)) = $val;
4104
+ return $val;
4105
+ }
4042
4106
  sub SetRational64u(@) {
4043
4107
  my ($numer,$denom) = Rationalize($_[0],0xffffffff);
4044
4108
  my $val = Set32u($numer) . Set32u($denom);
@@ -4100,6 +4164,7 @@ my %writeValueProc = (
4100
4164
  int16uRev => \&Set16uRev,
4101
4165
  int32s => \&Set32s,
4102
4166
  int32u => \&Set32u,
4167
+ int64u => \&Set64u,
4103
4168
  rational32s => \&SetRational32s,
4104
4169
  rational32u => \&SetRational32u,
4105
4170
  rational64s => \&SetRational64s,
@@ -4280,9 +4345,9 @@ sub Write($@)
4280
4345
  sub WriteTrailerBuffer($$$)
4281
4346
  {
4282
4347
  my ($self, $trailInfo, $outfile) = @_;
4283
- if ($self->{DEL_GROUP}{Trailer}) {
4348
+ if ($$self{DEL_GROUP}{Trailer}) {
4284
4349
  $self->VPrint(0, " Deleting trailer ($$trailInfo{Offset} bytes)\n");
4285
- ++$self->{CHANGED};
4350
+ ++$$self{CHANGED};
4286
4351
  return 1;
4287
4352
  }
4288
4353
  my $pos = Tell($outfile);
@@ -4291,8 +4356,8 @@ sub WriteTrailerBuffer($$$)
4291
4356
  if ($$trailInfo{Fixup}) {
4292
4357
  if ($pos > 0) {
4293
4358
  # shift offsets to final AFCP location and write it out
4294
- $trailInfo->{Fixup}{Shift} += $pos;
4295
- $trailInfo->{Fixup}->ApplyFixup($trailPt);
4359
+ $$trailInfo{Fixup}{Shift} += $pos;
4360
+ $$trailInfo{Fixup}->ApplyFixup($trailPt);
4296
4361
  } else {
4297
4362
  $self->Error("Can't get file position for trailer offset fixup",1);
4298
4363
  }
@@ -4317,7 +4382,7 @@ sub AddNewTrailers($;@)
4317
4382
  # add trailers as a block
4318
4383
  my $type;
4319
4384
  foreach $type (@types) {
4320
- next unless $self->{NEW_VALUE}{$Image::ExifTool::Extra{$type}};
4385
+ next unless $$self{NEW_VALUE}{$Image::ExifTool::Extra{$type}};
4321
4386
  my $val = $self->GetNewValues($type) or next;
4322
4387
  my $verb = $trailPt ? 'Writing' : 'Adding';
4323
4388
  $self->VPrint(0, " $verb $type as a block\n");
@@ -4413,8 +4478,8 @@ sub WriteJPEG($$)
4413
4478
  my $outfile = $$dirInfo{OutFile};
4414
4479
  my $raf = $$dirInfo{RAF};
4415
4480
  my ($ch,$s,$length);
4416
- my $verbose = $self->{OPTIONS}{Verbose};
4417
- my $out = $self->{OPTIONS}{TextOut};
4481
+ my $verbose = $$self{OPTIONS}{Verbose};
4482
+ my $out = $$self{OPTIONS}{TextOut};
4418
4483
  my $rtnVal = 0;
4419
4484
  my ($err, %doneDir);
4420
4485
  my %dumpParms = ( Out => $out );
@@ -4424,14 +4489,14 @@ sub WriteJPEG($$)
4424
4489
  return 0 unless $raf->Read($s,2) == 2 and $s eq "\xff\xd8";
4425
4490
  $dumpParms{MaxLen} = 128 unless $verbose > 3;
4426
4491
 
4427
- delete $self->{PREVIEW_INFO}; # reset preview information
4428
- delete $self->{DEL_PREVIEW}; # reset flag to delete preview
4492
+ delete $$self{PREVIEW_INFO}; # reset preview information
4493
+ delete $$self{DEL_PREVIEW}; # reset flag to delete preview
4429
4494
 
4430
4495
  Write($outfile, $s) or $err = 1;
4431
4496
  # figure out what segments we need to write for the tags we have set
4432
- my $addDirs = $self->{ADD_DIRS};
4433
- my $editDirs = $self->{EDIT_DIRS};
4434
- my $delGroup = $self->{DEL_GROUP};
4497
+ my $addDirs = $$self{ADD_DIRS};
4498
+ my $editDirs = $$self{EDIT_DIRS};
4499
+ my $delGroup = $$self{DEL_GROUP};
4435
4500
  my $path = $$self{PATH};
4436
4501
  my $pn = scalar @$path;
4437
4502
 
@@ -4593,7 +4658,7 @@ sub WriteJPEG($$)
4593
4658
  $doneDir{IFD0} = 1;
4594
4659
  $verbose and print $out "Creating APP1:\n";
4595
4660
  # write new EXIF data
4596
- $self->{TIFF_TYPE} = 'APP1';
4661
+ $$self{TIFF_TYPE} = 'APP1';
4597
4662
  my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main');
4598
4663
  my %dirInfo = (
4599
4664
  DirName => 'IFD0',
@@ -4617,7 +4682,7 @@ sub WriteJPEG($$)
4617
4682
  my $app1hdr = "\xff\xe1" . pack('n', $size + 2);
4618
4683
  Write($outfile,$app1hdr,$exifAPP1hdr,$buff) or $err = 1;
4619
4684
  } else {
4620
- delete $self->{PREVIEW_INFO};
4685
+ delete $$self{PREVIEW_INFO};
4621
4686
  $self->Warn("EXIF APP1 segment too large! ($size bytes)");
4622
4687
  }
4623
4688
  }
@@ -4636,7 +4701,7 @@ sub WriteJPEG($$)
4636
4701
  my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
4637
4702
  if (defined $buff and length $buff) {
4638
4703
  WriteMultiSegment($outfile, 0xed, $psAPP13hdr, \$buff) or $err = 1;
4639
- ++$self->{CHANGED};
4704
+ ++$$self{CHANGED};
4640
4705
  }
4641
4706
  }
4642
4707
  # then APP1 XMP segment
@@ -4673,7 +4738,7 @@ sub WriteJPEG($$)
4673
4738
  my $buff = $self->WriteDirectory(\%dirInfo, $tagTablePtr);
4674
4739
  if (defined $buff and length $buff) {
4675
4740
  WriteMultiSegment($outfile, 0xe2, "ICC_PROFILE\0", \$buff, 'ICC') or $err = 1;
4676
- ++$self->{CHANGED};
4741
+ ++$$self{CHANGED};
4677
4742
  }
4678
4743
  }
4679
4744
  # then APP12 Ducky segment
@@ -4711,7 +4776,7 @@ sub WriteJPEG($$)
4711
4776
  # write the new segment with appropriate header
4712
4777
  my $app14hdr = "\xff\xee" . pack('n', $size + 2);
4713
4778
  Write($outfile, $app14hdr, $buff) or $err = 1;
4714
- ++$self->{CHANGED};
4779
+ ++$$self{CHANGED};
4715
4780
  } else {
4716
4781
  $self->Warn("Adobe APP14 segment too large! ($size bytes)");
4717
4782
  }
@@ -4729,7 +4794,7 @@ sub WriteJPEG($$)
4729
4794
  $self->VerboseValue('+ Comment', $newComment);
4730
4795
  }
4731
4796
  WriteMultiSegment($outfile, 0xfe, '', \$newComment) or $err = 1;
4732
- ++$self->{CHANGED};
4797
+ ++$$self{CHANGED};
4733
4798
  }
4734
4799
  }
4735
4800
  last; # didn't want to loop anyway
@@ -4752,7 +4817,7 @@ sub WriteJPEG($$)
4752
4817
  $s = pack('n', length($segData) + 2);
4753
4818
  Write($outfile, $hdr, $s, $segData) or $err = 1;
4754
4819
  my ($buff, $endPos, $trailInfo);
4755
- my $delPreview = $self->{DEL_PREVIEW};
4820
+ my $delPreview = $$self{DEL_PREVIEW};
4756
4821
  $trailInfo = IdentifyTrailer($raf) unless $$delGroup{Trailer};
4757
4822
  unless ($oldOutfile or $delPreview or $trailInfo or $$delGroup{Trailer}) {
4758
4823
  # blindly copy the rest of the file
@@ -4816,9 +4881,9 @@ sub WriteJPEG($$)
4816
4881
  $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', length($$outfile) - 10 + $junk);
4817
4882
  # use this fixup to set the size too (sneaky)
4818
4883
  my $trailSize = defined($dat) ? length($dat) - $junk : $$self{LeicaTrailer}{Size};
4819
- $fixup->{Start} -= 4; $fixup->{Shift} += 4;
4884
+ $$fixup{Start} -= 4; $$fixup{Shift} += 4;
4820
4885
  $fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize) if defined $trailSize;
4821
- $fixup->{Start} += 4; $fixup->{Shift} -= 4;
4886
+ $$fixup{Start} += 4; $$fixup{Shift} -= 4;
4822
4887
  # clean up and write the buffered data
4823
4888
  $outfile = $oldOutfile;
4824
4889
  undef $oldOutfile;
@@ -4863,8 +4928,8 @@ sub WriteJPEG($$)
4863
4928
  $newPos += $junkLen;
4864
4929
  }
4865
4930
  # fix up the preview offsets to point to the start of the new image
4866
- my $previewInfo = $self->{PREVIEW_INFO};
4867
- delete $self->{PREVIEW_INFO};
4931
+ my $previewInfo = $$self{PREVIEW_INFO};
4932
+ delete $$self{PREVIEW_INFO};
4868
4933
  my $fixup = $$previewInfo{Fixup};
4869
4934
  $newPos += ($$previewInfo{BaseShift} || 0);
4870
4935
  # adjust to absolute file offset if necessary (Samsung STMN)
@@ -4908,7 +4973,7 @@ sub WriteJPEG($$)
4908
4973
  if ($extra > 0) {
4909
4974
  if ($$delGroup{Trailer}) {
4910
4975
  $verbose and print $out " Deleting unknown trailer ($extra bytes)\n";
4911
- ++$self->{CHANGED};
4976
+ ++$$self{CHANGED};
4912
4977
  } else {
4913
4978
  # copy over unknown trailer
4914
4979
  $verbose and print $out " Preserving unknown trailer ($extra bytes)\n";
@@ -4933,7 +4998,7 @@ sub WriteJPEG($$)
4933
4998
  #
4934
4999
  # NOTE: A 'next' statement after this point will cause $$segDataPt
4935
5000
  # not to be written if there is an output file, so in this case
4936
- # the $self->{CHANGED} flags must be updated
5001
+ # the $$self{CHANGED} flags must be updated
4937
5002
  #
4938
5003
  my $segDataPt = \$segData;
4939
5004
  $length = length($segData);
@@ -4946,14 +5011,14 @@ sub WriteJPEG($$)
4946
5011
  # group delete of APP segements
4947
5012
  if ($$delGroup{$dirName}) {
4948
5013
  $verbose and print $out " Deleting $dirName segment\n";
4949
- ++$self->{CHANGED};
5014
+ ++$$self{CHANGED};
4950
5015
  next Marker;
4951
5016
  }
4952
5017
  my ($segType, $del);
4953
5018
  # rewrite this segment only if we are changing a tag which is contained in its
4954
5019
  # directory (or deleting '*', in which case we need to identify the segment type)
4955
5020
  while (exists $$editDirs{$markerName} or $$delGroup{'*'}) {
4956
- my $oldChanged = $self->{CHANGED};
5021
+ my $oldChanged = $$self{CHANGED};
4957
5022
  if ($marker == 0xe0) { # APP0 (JFIF, CIFF)
4958
5023
  if ($$segDataPt =~ /^JFIF\0/) {
4959
5024
  $segType = 'JFIF';
@@ -5032,7 +5097,7 @@ sub WriteJPEG($$)
5032
5097
  $$segDataPt = $exifAPP1hdr . $buff;
5033
5098
  } else {
5034
5099
  last Marker unless $self->Options('IgnoreMinorErrors');
5035
- $self->{CHANGED} = $oldChanged; # nothing changed
5100
+ $$self{CHANGED} = $oldChanged; # nothing changed
5036
5101
  }
5037
5102
  # switch to buffered output if required
5038
5103
  if (($$self{PREVIEW_INFO} or $$self{LeicaTrailer}) and not $oldOutfile) {
@@ -5123,7 +5188,7 @@ sub WriteJPEG($$)
5123
5188
  $$segDataPt = ''; # delete the XMP
5124
5189
  }
5125
5190
  } else {
5126
- $self->{CHANGED} = $oldChanged;
5191
+ $$self{CHANGED} = $oldChanged;
5127
5192
  $verbose and print $out " [XMP rewritten with no changes]\n";
5128
5193
  if ($doneDir{XMP} > 1) {
5129
5194
  # re-write original multi-segment XMP
@@ -5168,7 +5233,7 @@ sub WriteJPEG($$)
5168
5233
  $self->Error('Inconsistent ICC_Profile chunk count', 1);
5169
5234
  undef $iccChunkCount; # abort ICC_Profile parsing
5170
5235
  undef $chunkNum; # avoid 2nd warning below
5171
- ++$self->{CHANGED}; # we are deleting the bad chunks before this one
5236
+ ++$$self{CHANGED}; # we are deleting the bad chunks before this one
5172
5237
  }
5173
5238
  } else {
5174
5239
  $iccChunkCount = 0;
@@ -5247,7 +5312,7 @@ sub WriteJPEG($$)
5247
5312
  $$segDataPt = substr($$segDataPt,0,6) . $buff;
5248
5313
  } else {
5249
5314
  last Marker unless $self->Options('IgnoreMinorErrors');
5250
- $self->{CHANGED} = $oldChanged; # nothing changed
5315
+ $$self{CHANGED} = $oldChanged; # nothing changed
5251
5316
  }
5252
5317
  # delete segment if IFD contains no entries
5253
5318
  $del = 1 unless length($$segDataPt) > 6;
@@ -5280,7 +5345,7 @@ sub WriteJPEG($$)
5280
5345
  $newData = 'Ducky' . $newData if length $newData;
5281
5346
  $segDataPt = \$newData;
5282
5347
  } else {
5283
- $self->{CHANGED} = $oldChanged;
5348
+ $$self{CHANGED} = $oldChanged;
5284
5349
  }
5285
5350
  $del = 1 unless length $$segDataPt;
5286
5351
  }
@@ -5321,7 +5386,7 @@ sub WriteJPEG($$)
5321
5386
  undef $$segDataPt; # free the old buffer
5322
5387
  $segDataPt = \$newData;
5323
5388
  } else {
5324
- $self->{CHANGED} = $oldChanged;
5389
+ $$self{CHANGED} = $oldChanged;
5325
5390
  }
5326
5391
  length $$segDataPt or $del = 1, last;
5327
5392
  # write as multi-segment
@@ -5364,7 +5429,7 @@ sub WriteJPEG($$)
5364
5429
  } else {
5365
5430
  $verbose and print $out " Deleting COM segment\n";
5366
5431
  }
5367
- ++$self->{CHANGED}; # increment the changed flag
5432
+ ++$$self{CHANGED}; # increment the changed flag
5368
5433
  undef $segDataPt; # don't write existing comment
5369
5434
  }
5370
5435
  last; # didn't want to loop anyway
@@ -5374,7 +5439,7 @@ sub WriteJPEG($$)
5374
5439
  if ($del or ($$delGroup{'*'} and not $segType and $marker>=0xe0 and $marker<=0xef)) {
5375
5440
  $segType = 'unknown' unless $segType;
5376
5441
  $verbose and print $out " Deleting $markerName $segType segment\n";
5377
- ++$self->{CHANGED};
5442
+ ++$$self{CHANGED};
5378
5443
  next Marker;
5379
5444
  }
5380
5445
  # write out this segment if $segDataPt is still defined
@@ -5550,7 +5615,7 @@ sub CopyBlock($$$)
5550
5615
  sub CopyImageData($$$)
5551
5616
  {
5552
5617
  my ($self, $imageDataBlocks, $outfile) = @_;
5553
- my $raf = $self->{RAF};
5618
+ my $raf = $$self{RAF};
5554
5619
  my ($dataBlock, $err);
5555
5620
  my $num = @$imageDataBlocks;
5556
5621
  $self->VPrint(0, " Copying $num image data blocks\n") if $num;
@@ -5605,16 +5670,17 @@ sub WriteBinaryData($$$)
5605
5670
  my $tagInfo;
5606
5671
  $dataPt = \$newData;
5607
5672
  foreach $tagInfo ($self->GetNewTagInfoList($tagTablePtr)) {
5608
- my $tagID = $tagInfo->{TagID};
5673
+ my $tagID = $$tagInfo{TagID};
5609
5674
  # evaluate conditional tags now if necessary
5610
5675
  if (ref $$tagTablePtr{$tagID} eq 'ARRAY' or $$tagInfo{Condition}) {
5611
5676
  my $writeInfo = $self->GetTagInfo($tagTablePtr, $tagID);
5612
5677
  next unless $writeInfo and $writeInfo eq $tagInfo;
5613
5678
  }
5614
5679
  # add offsets for variable-sized tags if necessary
5615
- while (@varInfo and $varInfo[0] < $tagID) {
5616
- shift @varInfo; # discard index
5617
- $varSize = shift @varInfo; # get accumulated variable size
5680
+ my $varFmt;
5681
+ while (@varInfo and $varInfo[0][0] < $tagID) {
5682
+ $varSize = $varInfo[0][1]; # get accumulated variable size
5683
+ shift @varInfo;
5618
5684
  }
5619
5685
  my $count = 1;
5620
5686
  my $format = $$tagInfo{Format};
@@ -5635,9 +5701,11 @@ sub WriteBinaryData($$$)
5635
5701
  } else {
5636
5702
  $format = $defaultFormat;
5637
5703
  }
5704
+ # read/write using variable format if changed in Hook
5705
+ $format = $varInfo[0][2] if @varInfo and $varInfo[0][0] == $tagID;
5638
5706
  my $val = ReadValue($dataPt, $entry, $format, $count, $dirLen-$entry);
5639
5707
  next unless defined $val;
5640
- my $nvHash = $self->GetNewValueHash($tagInfo);
5708
+ my $nvHash = $self->GetNewValueHash($tagInfo, $$self{CUR_WRITE_GROUP});
5641
5709
  next unless $self->IsOverwriting($nvHash, $val);
5642
5710
  my $newVal = $self->GetNewValues($nvHash);
5643
5711
  next unless defined $newVal; # can't delete from a binary table
@@ -5658,7 +5726,7 @@ sub WriteBinaryData($$$)
5658
5726
  if (defined $rtnVal) {
5659
5727
  $self->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
5660
5728
  $self->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
5661
- ++$self->{CHANGED};
5729
+ ++$$self{CHANGED};
5662
5730
  }
5663
5731
  }
5664
5732
  # add necessary fixups for any offsets
@@ -5667,11 +5735,11 @@ sub WriteBinaryData($$$)
5667
5735
  @varInfo = @varOffsets;
5668
5736
  my $fixup = $$dirInfo{Fixup};
5669
5737
  my $tagID;
5670
- foreach $tagID (@{$tagTablePtr->{IS_OFFSET}}) {
5738
+ foreach $tagID (@{$$tagTablePtr{IS_OFFSET}}) {
5671
5739
  $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID) or next;
5672
- while (@varInfo and $varInfo[0] < $tagID) {
5740
+ while (@varInfo and $varInfo[0][0] < $tagID) {
5741
+ $varSize = $varInfo[0][1];
5673
5742
  shift @varInfo;
5674
- $varSize = shift @varInfo;
5675
5743
  }
5676
5744
  my $entry = $tagID * $increment + $varSize; # (no offset to dirStart for new dir data)
5677
5745
  next unless $entry <= $dirLen - 4;
@@ -5682,15 +5750,15 @@ sub WriteBinaryData($$$)
5682
5750
  next unless $offset;
5683
5751
  $fixup->AddFixup($entry, $$tagInfo{DataTag}, $format);
5684
5752
  # handle the preview image now if this is a JPEG file
5685
- next unless $self->{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and
5753
+ next unless $$self{FILE_TYPE} eq 'JPEG' and $$tagInfo{DataTag} and
5686
5754
  $$tagInfo{DataTag} eq 'PreviewImage' and defined $$tagInfo{OffsetPair};
5687
5755
  # NOTE: here we assume there are no var-sized tags between the
5688
5756
  # OffsetPair tags. If this ever becomes possible we must recalculate
5689
5757
  # $varSize for the OffsetPair tag here!
5690
5758
  $entry = $$tagInfo{OffsetPair} * $increment + $varSize;
5691
5759
  my $size = ReadValue($dataPt, $entry, $format, 1, $dirLen-$entry);
5692
- my $previewInfo = $self->{PREVIEW_INFO};
5693
- $previewInfo or $previewInfo = $self->{PREVIEW_INFO} = {
5760
+ my $previewInfo = $$self{PREVIEW_INFO};
5761
+ $previewInfo or $previewInfo = $$self{PREVIEW_INFO} = {
5694
5762
  Fixup => new Image::ExifTool::Fixup,
5695
5763
  };
5696
5764
  # set flag indicating we are using short pointers
@@ -5715,9 +5783,9 @@ sub WriteBinaryData($$$)
5715
5783
  foreach $tagID (@{$$tagTablePtr{IS_SUBDIR}}) {
5716
5784
  my $tagInfo = $self->GetTagInfo($tagTablePtr, $tagID);
5717
5785
  next unless defined $tagInfo;
5718
- while (@varInfo and $varInfo[0] < $tagID) {
5786
+ while (@varInfo and $varInfo[0][0] < $tagID) {
5787
+ $varSize = $varInfo[0][1];
5719
5788
  shift @varInfo;
5720
- $varSize = shift @varInfo;
5721
5789
  }
5722
5790
  my $entry = int($tagID) * $increment + $varSize;
5723
5791
  last if $entry >= $dirLen;
@@ -5731,7 +5799,7 @@ sub WriteBinaryData($$$)
5731
5799
  }
5732
5800
  next unless $$tagInfo{SubDirectory}; # (just to be safe)
5733
5801
  my %subdirInfo = ( DataPt => \$newData, DirStart => $entry );
5734
- my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}{TagTable});
5802
+ my $subTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable});
5735
5803
  my $dat = $self->WriteDirectory(\%subdirInfo, $subTablePtr);
5736
5804
  substr($newData, $entry) = $dat if defined $dat and length $dat;
5737
5805
  }