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