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.
- checksums.yaml +6 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/Changes +74 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/MANIFEST +14 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/META.yml +1 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/Makefile.PL +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/README +30 -30
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/exif2iptc.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/exif2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/gps2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptc2exif.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptc2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/iptcCore.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/pdf2xmp.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2exif.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2gps.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2iptc.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/arg_files/xmp2pdf.args +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/config_files/ExifTool_config +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/config_files/convert_regions.config +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/exiftool +266 -226
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/gpx.fmt +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/gpx_wpt.fmt +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/fmt_files/kml.fmt +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/ExifTool.html +79 -54
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/MIE1.1-20070121.pdf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/Shift.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/AFCP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/AIFF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/APE.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/APP12.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ASF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Apple.html +11 -8
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/BMP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Canon.html +138 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonCustom.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonRaw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/CanonVRD.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Casio.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Composite.html +19 -13
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DICOM.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DNG.html +0 -0
- data/bin/Image-ExifTool-9.41/html/TagNames/DPX.html +190 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DV.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DarwinCore.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/DjVu.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/EXE.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/EXIF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Extra.html +13 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FLAC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FLIR.html +166 -2
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Flash.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FlashPix.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Font.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FotoStation.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/FujiFilm.html +11 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GE.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GIF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GIMP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GPS.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/GeoTiff.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/H264.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/HP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/HTML.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ICC_Profile.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ID3.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/IPTC.html +3 -3
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ITC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JFIF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JPEG.html +6 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/JVC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Jpeg2000.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Kodak.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/KyoceraRaw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/LNK.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Leaf.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/M2TS.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MIE.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MIFF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MNG.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPEG.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MPF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MWG.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MXF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Matroska.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Microsoft.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Minolta.html +30 -19
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/MinoltaRaw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Nikon.html +81 -60
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/NikonCapture.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/NikonCustom.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/OOXML.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Ogg.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Olympus.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/OpenEXR.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PDF.html +6 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PGF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PICT.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PLIST.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PNG.html +25 -18
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PSP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Panasonic.html +51 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PanasonicRaw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Pentax.html +23 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhaseOne.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhotoCD.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PhotoMechanic.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Photoshop.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PostScript.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/PrintIM.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Qualcomm.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/QuickTime.html +404 -126
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RIFF.html +19 -13
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RSRC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/RTF.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Radiance.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Rawzor.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Real.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Reconyx.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Ricoh.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Samsung.html +27 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sanyo.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Scalado.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Shortcuts.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sigma.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/SigmaRaw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Sony.html +491 -121
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/SonyIDC.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Stim.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Theora.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Torrent.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Unknown.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/Vorbis.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/XMP.html +824 -175
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/ZIP.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/iWork.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/index.html +7 -5
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/TagNames/style.css +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/ancient_history.html +201 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/canon_raw.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/commentary.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/config.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/data_members.html +9 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/exiftool_pod.html +92 -71
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/faq.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/filename.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/geotag.html +13 -9
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/history.html +82 -201
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/htmldump.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/idiosyncracies.html +4 -2
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/index.html +46 -35
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/install.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/metafiles.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/overview.png +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/standards.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/struct.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/style.css +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/under.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/verbose.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/html/writing.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/File/RandomAccess.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/File/RandomAccess.pod +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool.pm +387 -331
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool.pod +101 -81
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AES.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AFCP.pm +14 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/AIFF.pm +17 -17
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/APE.pm +18 -18
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/APP12.pm +21 -21
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ASF.pm +48 -48
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Apple.pm +31 -19
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BMP.pm +4 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BZZ.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BigTIFF.pm +36 -36
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/BuildTagLookup.pm +12 -12
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Canon.pm +126 -38
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonCustom.pm +37 -37
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonRaw.pm +30 -30
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CanonVRD.pm +75 -75
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/CaptureOne.pm +18 -18
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Casio.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset.pm +13 -13
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DICOM.pm +56 -17
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DNG.pm +85 -85
- data/bin/Image-ExifTool-9.41/lib/Image/ExifTool/DPX.pm +151 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DV.pm +6 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DarwinCore.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/DjVu.pm +14 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/EXE.pm +47 -47
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Exif.pm +126 -116
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FLAC.pm +14 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FLIR.pm +282 -22
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Fixup.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Flash.pm +41 -41
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FlashPix.pm +97 -97
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Font.pm +46 -46
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FotoStation.pm +21 -20
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/FujiFilm.pm +40 -38
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GE.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GIF.pm +32 -32
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GIMP.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GPS.pm +3 -3
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/GeoTiff.pm +19 -19
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Geotag.pm +69 -66
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/H264.pm +42 -42
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HP.pm +9 -9
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HTML.pm +16 -16
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/HtmlDump.pm +10 -10
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ICC_Profile.pm +48 -48
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ID3.pm +84 -84
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/IPTC.pm +38 -38
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ITC.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Import.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/InDesign.pm +18 -18
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JPEG.pm +10 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JPEGDigest.pm +4 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/JVC.pm +8 -8
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Jpeg2000.pm +50 -58
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Kodak.pm +15 -15
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/KyoceraRaw.pm +4 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/LNK.pm +24 -24
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/cs.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/de.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/en_ca.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/en_gb.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/es.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/fi.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/fr.pm +1 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/it.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ja.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ko.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/nl.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/pl.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/ru.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/sv.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/tr.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/zh_cn.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Lang/zh_tw.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Leaf.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/M2TS.pm +37 -37
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIE.pm +95 -95
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIEUnits.pod +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MIFF.pm +17 -17
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MNG.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPC.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPEG.pm +28 -28
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MPF.pm +22 -22
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MWG.pm +9 -9
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MXF.pm +46 -46
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MakerNotes.pm +61 -59
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Matroska.pm +27 -27
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Microsoft.pm +8 -8
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Minolta.pm +50 -28
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/MinoltaRaw.pm +17 -17
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Nikon.pm +80 -63
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/NikonCapture.pm +29 -29
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/NikonCustom.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/OOXML.pm +20 -20
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Ogg.pm +19 -19
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Olympus.pm +3 -3
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/OpenEXR.pm +16 -16
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PDF.pm +126 -126
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PGF.pm +7 -7
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PICT.pm +18 -18
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PLIST.pm +39 -39
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PNG.pm +141 -95
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PPM.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PSP.pm +14 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Panasonic.pm +82 -37
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PanasonicRaw.pm +40 -40
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Pentax.pm +86 -14
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhaseOne.pm +36 -36
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhotoCD.pm +4 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PhotoMechanic.pm +12 -12
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Photoshop.pm +23 -23
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PostScript.pm +36 -36
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/PrintIM.pm +10 -10
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Qualcomm.pm +5 -5
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/QuickTime.pm +528 -219
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/README +5 -3
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RIFF.pm +40 -32
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RSRC.pm +15 -15
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/RTF.pm +15 -15
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Radiance.pm +9 -9
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Rawzor.pm +19 -19
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Real.pm +43 -43
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Reconyx.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Ricoh.pm +24 -24
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Samsung.pm +41 -15
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sanyo.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Scalado.pm +5 -5
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Shift.pl +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Shortcuts.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sigma.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/SigmaRaw.pm +56 -56
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Sony.pm +450 -166
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/SonyIDC.pm +9 -9
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Stim.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagInfoXML.pm +6 -4
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagLookup.pm +1707 -1468
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/TagNames.pod +568 -102
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Theora.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Torrent.pm +11 -11
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Unknown.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Vorbis.pm +5 -5
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteCanonRaw.pl +51 -51
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteExif.pl +273 -273
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteIPTC.pl +44 -44
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePDF.pl +45 -39
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePNG.pl +86 -40
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePhotoshop.pl +27 -27
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WritePostScript.pl +47 -47
- data/bin/Image-ExifTool-9.41/lib/Image/ExifTool/WriteQuickTime.pl +344 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/WriteXMP.pl +112 -112
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/Writer.pl +428 -360
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMP.pm +195 -104
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMP2.pl +1 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/XMPStruct.pl +53 -52
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/ZIP.pm +50 -50
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/lib/Image/ExifTool/iWork.pm +17 -17
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/perl-Image-ExifTool.spec +31 -31
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AFCP_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AIFF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/AIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/APE_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ASF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ASF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BMP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BigTIFF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/BigTIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_4.out +5 -7
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonRaw_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_11.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_12.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/CanonVRD_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon_2.out +4 -3
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Canon_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Casio_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DICOM.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DICOM_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DNG_3.out +0 -0
- data/bin/Image-ExifTool-9.41/t/DPX.t +28 -0
- data/bin/Image-ExifTool-9.41/t/DPX_2.out +35 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DV.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DV_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DjVu.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/DjVu_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/EXE_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_16.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_17.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_20.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_21.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_22.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_23.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_24.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_25.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_26.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ExifTool_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLAC_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FLIR_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FlashPix.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FlashPix_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Flash_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Font_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FotoStation_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/FujiFilm_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GE_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIF_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIMP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GIMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GPS_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/GeoTiff_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag.t +18 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Geotag_8.out +0 -0
- data/bin/Image-ExifTool-9.41/t/Geotag_9.out +7 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/HTML.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/HTML_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/IPTC_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ITC.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ITC_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/InDesign_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/JVC_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Jpeg2000_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Kodak_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/KyoceraRaw.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/KyoceraRaw_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/LNK.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/LNK_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_1.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_10.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_11.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_12.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_13.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_14.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_15.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_16.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_17.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_18.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Lang_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/M2TS.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/M2TS_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIE_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIFF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MP3.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MP3_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MWG_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MXF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/MXF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Matroska.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Matroska_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Minolta_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Nikon_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Olympus_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/OpenEXR.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/OpenEXR_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_10.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_11.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_12.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_14.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_15.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_16.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_17.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_18.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_19.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_20.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_22.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PDF_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PGF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PGF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PICT.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PICT_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PLIST_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG.t +31 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PNG_4.out +0 -0
- data/bin/Image-ExifTool-9.41/t/PNG_5.out +17 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PPM_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PSP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PSP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Panasonic_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Pentax_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoCD.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoCD_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PhotoMechanic_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Photoshop_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/PostScript_3.out +0 -0
- data/bin/Image-ExifTool-9.41/t/QuickTime.t +54 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/QuickTime_2.out +10 -8
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/QuickTime_3.out +10 -8
- data/bin/Image-ExifTool-9.41/t/QuickTime_4.out +16 -0
- data/bin/Image-ExifTool-9.41/t/QuickTime_5.out +12 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RIFF_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RTF.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/RTF_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Radiance.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Radiance_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Real_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Ricoh_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sanyo_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sigma_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Sony_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/TestLib.pm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Torrent.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Torrent_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Unknown_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Vorbis.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Vorbis_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer.t +53 -1
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_10.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_11.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_13.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_14.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_15.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_16.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_17.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_18.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_19.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_22.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_24.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_25.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_26.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_27.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_28.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_29.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_30.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_31.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_32.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_33.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_34.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_35.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_36.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_37.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_38.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_39.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_40.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_41.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_42.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_43.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_44.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_45.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_46.out +8 -6
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_47.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_48.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_50.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_51.out +0 -0
- data/bin/Image-ExifTool-9.41/t/Writer_52.out +22 -0
- data/bin/Image-ExifTool-9.41/t/Writer_53.out +33 -0
- data/bin/Image-ExifTool-9.41/t/Writer_54.out +2 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/Writer_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_10.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_11.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_12.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_13.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_14.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_15.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_16.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_17.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_18.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_19.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_20.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_21.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_22.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_23.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_24.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_25.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_26.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_27.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_28.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_29.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_30.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_31.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_32.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_34.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_36.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_37.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_39.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_40.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_41.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_8.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/XMP_9.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP.t +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_2.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_3.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_4.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_5.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_6.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/ZIP_7.out +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/AFCP.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/AIFF.aif +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/APE.ape +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/APE.mpc +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ASF.wmv +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/BMP.bmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/BigTIFF.btf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Canon.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Canon1DmkIII.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonRaw.cr2 +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonRaw.crw +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CanonVRD.vrd +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CaptureOne.eip +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Casio.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Casio2.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/CasioQVCI.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DICOM.dcm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DNG.dng +0 -0
- data/bin/Image-ExifTool-9.41/t/images/DPX.dpx +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DV.dv +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/DjVu.djvu +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.elf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.exe +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/EXE.macho +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExifTool.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExifTool.tif +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ExtendedXMP.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLAC.flac +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLAC.ogg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLIR.fpf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FLIR.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Flash.flv +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Flash.swf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FlashPix.ppt +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.afm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.dfont +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfa +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfb +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.pfm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Font.ttf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FotoStation.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FujiFilm.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/FujiFilm.raf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GE.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GIF.gif +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GIMP.xcf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GPS.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/GeoTiff.tif +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.gpx +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.igc +0 -0
- data/bin/Image-ExifTool-9.41/t/images/Geotag.kml +55 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.log +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag.xml +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Geotag2.log +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/HTML.html +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/IPTC.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ITC.itc +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/InDesign.indd +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/JVC.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/JVC2.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Jpeg2000.j2c +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Jpeg2000.jp2 +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Kodak.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/KyoceraRaw.raw +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/LNK.lnk +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/M2TS.mts +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MIE.mie +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MIFF.miff +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MP3.mp3 +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MWG.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/MXF.mxf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Matroska.mkv +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Minolta.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Minolta.mrw +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Nikon.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Nikon.nef +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/NikonD2Hs.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/NikonD70.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OOXML.docx +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Olympus.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Olympus2.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OlympusE1.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OpenDoc.ods +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/OpenEXR.exr +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PDF.pdf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PDF2.pdf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PGF.pgf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PICT.pict +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PLIST-bin.plist +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PLIST-xml.plist +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PNG.png +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PPM.ppm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PSP.psp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Panasonic.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Panasonic.rw2 +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Pentax.avi +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Pentax.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PhotoCD.pcd +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PhotoMechanic.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Photoshop.psd +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/PostScript.eps +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/QuickTime.m4a +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/QuickTime.mov +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.avi +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.wav +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RIFF.webp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/RTF.rtf +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Radiance.hdr +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.ra +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.ram +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Real.rm +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Ricoh.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Ricoh2.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sanyo.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sigma.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sigma.x3f +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/SigmaDP2.x3f +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sony.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Sony.pmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Torrent.torrent +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Unknown.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Vorbis.ogg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/Writer.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.inx +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.jpg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.svg +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.xml +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP.xmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP2.xmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP3.xmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP4.xmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/XMP5.xmp +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ZIP.gz +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/ZIP.zip +0 -0
- data/bin/{Image-ExifTool-9.37 → Image-ExifTool-9.41}/t/images/iWork.numbers +0 -0
- data/lib/exiftool_vendored.rb +11 -3
- data/lib/exiftool_vendored/version.rb +1 -1
- data/lib/exiftool_vendored/version_extractor.rb +5 -7
- metadata +942 -886
- 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
|
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 =
|
231
|
-
my $out =
|
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
|
240
|
-
|
241
|
-
|
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
|
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
|
-
|
275
|
-
|
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
|
-
|
283
|
-
|
284
|
-
|
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
|
-
|
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 =
|
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 =
|
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
|
-
|
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 (
|
495
|
+
if (/^IFD(\d+)$/i) {
|
467
496
|
$ifdName = "IFD$1";
|
468
|
-
} elsif (
|
497
|
+
} elsif (/^SubIFD(\d+)$/i) {
|
469
498
|
$ifdName = "SubIFD$1";
|
470
|
-
} elsif (
|
499
|
+
} elsif (/^Version(\d+)$/i) {
|
471
500
|
$ifdName = "Version$1"; # Sony IDC VersionIFD
|
472
|
-
} elsif (
|
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{
|
476
|
-
if (not $ifdName and
|
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 =
|
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
|
-
|
491
|
-
|
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 ($
|
527
|
+
my ($priority, $writeGroup);
|
496
528
|
if ($wantGroup) {
|
497
|
-
my
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
if (
|
503
|
-
next
|
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 ($
|
508
|
-
|
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
|
512
|
-
$writeGroup =
|
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 $
|
556
|
+
} elsif (not $$tagInfo{AllowGroup} or $lcWant !~ /^$$tagInfo{AllowGroup}$/i) {
|
516
557
|
# allow group1 name to be specified
|
517
|
-
|
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
|
-
$
|
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 =
|
531
|
-
my $writeProc =
|
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 =
|
540
|
-
next unless $writable or (
|
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 =
|
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 =
|
588
|
+
$priority = $$self{WRITE_PRIORITY}{lc($writeGroup)};
|
552
589
|
unless ($priority) {
|
553
|
-
$priority =
|
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
|
-
%{
|
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 =
|
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
|
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
|
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(
|
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 (
|
776
|
+
if ($$tagInfo{DelCheck}) {
|
740
777
|
#### eval DelCheck ($self, $tagInfo, $wantGroup)
|
741
|
-
my $err2 = eval
|
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
|
-
|
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
|
-
|
794
|
-
|
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
|
-
|
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
|
-
|
802
|
-
|
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
|
-
|
842
|
+
$$nvHash{DelValue} or $$nvHash{DelValue} = [ ];
|
806
843
|
if ($shift) {
|
807
844
|
# add shift value to list
|
808
|
-
|
845
|
+
$$nvHash{Shift} = $val;
|
809
846
|
} elsif ($options{DelValue}) {
|
810
847
|
# don't create if we are replacing a specific value
|
811
|
-
|
848
|
+
$$nvHash{IsCreating} = 0 unless $val eq '' or $$tagInfo{List};
|
812
849
|
# add delete value to list
|
813
|
-
push @{
|
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 =
|
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
|
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
|
-
|
836
|
-
} elsif ((
|
837
|
-
not (
|
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(/^$/,@{
|
876
|
+
grep(/^$/,@{$$nvHash{DelValue}}))
|
840
877
|
{
|
841
|
-
|
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
|
-
|
882
|
+
$$nvHash{CreateGroups} = $createGroups;
|
846
883
|
}
|
847
884
|
}
|
848
|
-
if (
|
849
|
-
if (%{
|
885
|
+
if ($$nvHash{IsCreating}) {
|
886
|
+
if (%{$$self{DEL_GROUP}}) {
|
850
887
|
my ($grp, @grps);
|
851
|
-
foreach $grp (keys %{
|
852
|
-
next if
|
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
|
-
|
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
|
-
|
870
|
-
if (not
|
906
|
+
$$nvHash{Value} or $$nvHash{Value} = [ ];
|
907
|
+
if (not $$tagInfo{List}) {
|
871
908
|
# not a List tag -- overwrite existing value
|
872
|
-
|
909
|
+
$$nvHash{Value}[0] = $val;
|
873
910
|
} else {
|
874
911
|
# add to existing list
|
875
|
-
push @{
|
912
|
+
push @{$$nvHash{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
|
876
913
|
}
|
877
914
|
if ($verbose > 1) {
|
878
|
-
my $ifExists =
|
879
|
-
(
|
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
|
-
(
|
883
|
-
((
|
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
|
-
|
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
|
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 ($
|
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} =
|
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
|
-
|
1053
|
+
$$srcExifTool{TAGS_FROM_FILE} = 1;
|
1008
1054
|
# synchronize and increment the file sequence number
|
1009
|
-
|
1055
|
+
$$srcExifTool{FILE_SEQUENCE} = $$self{FILE_SEQUENCE}++;
|
1010
1056
|
# set options for our extraction tool
|
1011
|
-
my $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
|
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
|
-
|
1077
|
-
|
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 $
|
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} =
|
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
|
1109
|
-
my (
|
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 = $
|
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
|
-
#
|
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 =~
|
1190
|
+
if ($tag =~ /(.*):(.+)/) {
|
1149
1191
|
($grp, $tag) = ($1, $2);
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
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:
|
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, [
|
1223
|
+
unshift @setList, [ [ ], '*', [ '', '*' ], $opts ] unless @setList;
|
1182
1224
|
# exclude this tag by leaving $dst undefined
|
1183
1225
|
} else {
|
1184
|
-
$dst = [ $grp, $$opts{WILD} ? '*' : $tag ]; #
|
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, [
|
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[
|
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
|
-
|
1246
|
+
SET: foreach $set (@setList) {
|
1206
1247
|
# check first for matching tag
|
1207
|
-
unless ($$set[
|
1248
|
+
unless ($$set[1] eq $lcTag or $$set[1] eq '*') {
|
1208
1249
|
# handle wildcards
|
1209
|
-
next unless $$set[
|
1250
|
+
next unless $$set[3]{WILD} and $lcTag =~ /^$$set[1]$/;
|
1210
1251
|
}
|
1211
1252
|
# then check for matching group
|
1212
|
-
|
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
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
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[
|
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[
|
1276
|
+
my $opts = $$set[3];
|
1234
1277
|
# handle expressions
|
1235
1278
|
if ($$opts{EXPR}) {
|
1236
|
-
my $val = $srcExifTool->InsertTagValues(\@tags, $$set[
|
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[
|
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[
|
1301
|
+
my ($dstGrp, $dstTag) = @{$$set[2]};
|
1259
1302
|
if ($dstGrp) {
|
1260
|
-
|
1261
|
-
|
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} =
|
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 (
|
1270
|
-
|
1271
|
-
|
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[
|
1324
|
+
if ($$set[1] eq '*' or $$set[3]{WILD}) {
|
1278
1325
|
# don't copy from protected binary tags when using wildcards
|
1279
|
-
next if
|
1280
|
-
|
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 (
|
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
|
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
|
1412
|
+
unless ($nvHash and $$nvHash{Value}) {
|
1366
1413
|
return () if wantarray; # return empty list
|
1367
1414
|
return undef;
|
1368
1415
|
}
|
1369
|
-
my $vals =
|
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 =
|
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 %{
|
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 =
|
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
|
-
|
1467
|
-
$nvHash =
|
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
|
-
|
1518
|
+
$$self{SAVE_NEW_VALUE} = { };
|
1472
1519
|
# make a copy of the delete group hash
|
1473
|
-
my %delGrp = %{
|
1474
|
-
|
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 =
|
1488
|
-
my $savedValues =
|
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 (
|
1544
|
+
if ($$nvHash{Save}) {
|
1498
1545
|
$lastHash = $nvHash;
|
1499
1546
|
} else {
|
1500
1547
|
# remove this entry from the list
|
1501
1548
|
if ($lastHash) {
|
1502
|
-
|
1503
|
-
} elsif (
|
1504
|
-
$$newValues{$key} =
|
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 =
|
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 =
|
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
|
-
|
1567
|
+
$$nvHash{Next} = $$savedValues{$key};
|
1521
1568
|
} else {
|
1522
1569
|
$$newValues{$key} = $$savedValues{$key};
|
1523
1570
|
}
|
1524
1571
|
}
|
1525
|
-
|
1572
|
+
$$self{SAVE_NEW_VALUE} = { }; # reset saved new values
|
1526
1573
|
}
|
1527
1574
|
# 3) restore delete groups
|
1528
|
-
my %delGrp = %{
|
1529
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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 =
|
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 (
|
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
|
-
|
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
|
-
|
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} =
|
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 (
|
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
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
2140
|
+
++$rtnVal unless $$self{CHANGED};
|
2091
2141
|
}
|
2092
2142
|
# set things back to the way they were
|
2093
|
-
|
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 $
|
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 = $
|
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 $
|
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 (
|
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 = $
|
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 @{
|
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} ||
|
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 (
|
2379
|
+
if ($$tagInfo{WriteCheck}) {
|
2330
2380
|
#### eval WriteCheck ($self, $tagInfo, $val)
|
2331
|
-
$err2 = eval
|
2381
|
+
$err2 = eval $$tagInfo{WriteCheck};
|
2332
2382
|
$@ and warn($@), $err2 = 'Error evaluating WriteCheck';
|
2333
2383
|
}
|
2334
2384
|
unless ($err2) {
|
2335
|
-
my $table =
|
2336
|
-
if ($table and
|
2337
|
-
my $checkProc =
|
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 =
|
2361
|
-
my $convInv =
|
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 =
|
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(
|
2632
|
+
$val = join($$self{OPTIONS}{ListSep}, @$val);
|
2583
2633
|
} elsif (ref $val eq 'SCALAR') {
|
2584
|
-
if (
|
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 =
|
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
|
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 =
|
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
|
-
|
2895
|
-
|
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 =
|
2969
|
+
my $saveHash = $$self{SAVE_NEW_VALUE};
|
2916
2970
|
# add to linked list of saved new value hashes
|
2917
|
-
$copy{Next} =
|
2918
|
-
|
2919
|
-
delete
|
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 (
|
2984
|
+
if ($$self{NEW_VALUE}{$tagInfo}) {
|
2931
2985
|
# add to end of linked list
|
2932
|
-
my $lastHash = LastInList(
|
2933
|
-
|
2986
|
+
my $lastHash = LastInList($$self{NEW_VALUE}{$tagInfo});
|
2987
|
+
$$lastHash{Next} = $nvHash;
|
2934
2988
|
} else {
|
2935
|
-
|
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 =
|
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 =
|
3042
|
+
my $firstHash = $$self{NEW_VALUE}{$tagInfo};
|
2989
3043
|
if ($nvHash eq $firstHash) {
|
2990
3044
|
# remove first entry from linked list
|
2991
|
-
if (
|
2992
|
-
|
3045
|
+
if ($$nvHash{Next}) {
|
3046
|
+
$$self{NEW_VALUE}{$tagInfo} = $$nvHash{Next};
|
2993
3047
|
} else {
|
2994
|
-
delete
|
3048
|
+
delete $$self{NEW_VALUE}{$tagInfo};
|
2995
3049
|
}
|
2996
3050
|
} else {
|
2997
3051
|
# find the list element pointing to this hash
|
2998
|
-
$firstHash =
|
3052
|
+
$firstHash = $$firstHash{Next} while $$firstHash{Next} ne $nvHash;
|
2999
3053
|
# remove from linked list
|
3000
|
-
|
3054
|
+
$$firstHash{Next} = $$nvHash{Next};
|
3001
3055
|
}
|
3002
3056
|
# save the existing entry if necessary
|
3003
|
-
if (
|
3004
|
-
my $saveHash =
|
3057
|
+
if ($$nvHash{Save}) {
|
3058
|
+
my $saveHash = $$self{SAVE_NEW_VALUE};
|
3005
3059
|
# add to linked list of saved new value hashes
|
3006
|
-
|
3007
|
-
|
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
|
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 =
|
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 %{
|
3082
|
+
@keys = keys %{$$self{NEW_VALUE}};
|
3029
3083
|
foreach $hashKey (@keys) {
|
3030
|
-
my $nvHash =
|
3084
|
+
my $nvHash = $$self{NEW_VALUE}{$hashKey};
|
3031
3085
|
# loop through each entry in linked list
|
3032
3086
|
for (;;) {
|
3033
|
-
my $nextHash =
|
3034
|
-
my $tagInfo =
|
3087
|
+
my $nextHash = $$nvHash{Next};
|
3088
|
+
my $tagInfo = $$nvHash{TagInfo};
|
3035
3089
|
my ($grp0,$grp1) = $self->GetGroup($tagInfo);
|
3036
|
-
my $wgrp =
|
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 =
|
3111
|
+
my $nv = $$self{NEW_VALUE};
|
3058
3112
|
if ($nv) {
|
3059
3113
|
my $hashKey;
|
3060
3114
|
foreach $hashKey (keys %$nv) {
|
3061
|
-
my $tagInfo =
|
3062
|
-
next if $tagTablePtr and $tagTablePtr ne
|
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 =
|
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 =
|
3082
|
-
next if $tagTablePtr and $tagTablePtr ne
|
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 =
|
3152
|
+
$parent or $parent = $$tagTablePtr{GROUPS}{0};
|
3099
3153
|
my $tagID;
|
3100
3154
|
my %addDirHash;
|
3101
3155
|
my %editDirHash;
|
3102
|
-
my $addDirs =
|
3103
|
-
my $editDirs =
|
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 =
|
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
|
-
|
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 =
|
3166
|
-
my $addDirs =
|
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 =
|
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
|
-
|
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 =
|
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 (%{
|
3270
|
+
if (%{$$self{DEL_GROUP}}) {
|
3217
3271
|
# add delete groups to list of edited groups
|
3218
|
-
foreach (keys %{
|
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 (
|
3244
|
-
my $out =
|
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
|
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 =
|
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 =
|
3324
|
+
my $grp0 = $$tagTablePtr{GROUPS}{0};
|
3271
3325
|
$dirName or $dirName = $$dirInfo{DirName} = $grp0;
|
3272
|
-
if (%{
|
3273
|
-
my $delGroup =
|
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 =
|
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
|
-
|
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
|
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 =
|
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
|
-
|
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 (
|
3385
|
-
if (defined $$dirInfo{DirLen} and not $$dirInfo{DirLen} and $dirName ne
|
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
|
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
|
-
|
3450
|
+
$$self{PROCESSED}{$addr} = $dirName;
|
3397
3451
|
}
|
3398
3452
|
}
|
3399
|
-
my $oldDir =
|
3453
|
+
my $oldDir = $$self{DIR_NAME};
|
3400
3454
|
my $name;
|
3401
3455
|
if ($out) {
|
3402
3456
|
$name = ($dirName eq 'MakerNotes' and $$dirInfo{TagInfo}) ?
|
3403
|
-
|
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 =
|
3411
|
-
|
3412
|
-
push @{
|
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 @{
|
3469
|
+
pop @{$$self{PATH}};
|
3416
3470
|
# nothing changed if error occurred or nothing was created
|
3417
|
-
|
3418
|
-
|
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 =
|
3529
|
-
my $out =
|
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 =
|
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 =
|
3629
|
-
my $htmlDump =
|
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 =
|
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 =
|
3690
|
-
my $preLen =
|
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 =
|
3754
|
+
$prePos = $$self{VALUE}{"MPImageStart ($mpImageNum)"};
|
3701
3755
|
if (defined $prePos) {
|
3702
|
-
$preLen =
|
3756
|
+
$preLen = $$self{VALUE}{"MPImageLength ($mpImageNum)"};
|
3703
3757
|
} else {
|
3704
|
-
$prePos =
|
3705
|
-
$preLen =
|
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 (
|
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 (
|
3741
|
-
$element =
|
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
|
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(
|
3760
|
-
my $out =
|
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 =
|
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
|
-
|
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 =
|
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 (
|
4348
|
+
if ($$self{DEL_GROUP}{Trailer}) {
|
4284
4349
|
$self->VPrint(0, " Deleting trailer ($$trailInfo{Offset} bytes)\n");
|
4285
|
-
|
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
|
-
|
4295
|
-
|
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
|
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 =
|
4417
|
-
my $out =
|
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
|
4428
|
-
delete
|
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 =
|
4433
|
-
my $editDirs =
|
4434
|
-
my $delGroup =
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
4884
|
+
$$fixup{Start} -= 4; $$fixup{Shift} += 4;
|
4820
4885
|
$fixup->SetMarkerPointers($outfile, 'LeicaTrailer', $trailSize) if defined $trailSize;
|
4821
|
-
|
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 =
|
4867
|
-
delete
|
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
|
-
|
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
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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 =
|
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
|
-
|
5616
|
-
|
5617
|
-
$varSize =
|
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
|
-
|
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 (@{
|
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
|
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 =
|
5693
|
-
$previewInfo or $previewInfo =
|
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(
|
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
|
}
|